13f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/basictypes.h" 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/file_util.h" 7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/string_util.h" 83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/stringprintf.h" 93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/third_party/dynamic_annotations/dynamic_annotations.h" 103f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/threading/platform_thread.h" 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/io_buffer.h" 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/net_errors.h" 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/test_completion_callback.h" 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/disk_cache/backend_impl.h" 153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/disk_cache/cache_util.h" 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/disk_cache/disk_cache_test_base.h" 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/disk_cache/disk_cache_test_util.h" 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/disk_cache/histogram_macros.h" 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/disk_cache/mapped_file.h" 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/disk_cache/mem_backend_impl.h" 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/gtest/include/gtest/gtest.h" 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 233f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#if defined(OS_WIN) 243f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/win/scoped_handle.h" 253f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#endif 263f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottusing base::Time; 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Tests that can run with different types of caches. 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass DiskCacheBackendTest : public DiskCacheTestWithCache { 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott protected: 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void BackendBasics(); 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void BackendKeying(); 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void BackendSetSize(); 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void BackendLoad(); 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void BackendValidEntry(); 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void BackendInvalidEntry(); 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void BackendInvalidEntryRead(); 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void BackendInvalidEntryWithLoad(); 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void BackendTrimInvalidEntry(); 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void BackendTrimInvalidEntry2(); 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void BackendEnumerations(); 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void BackendEnumerations2(); 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void BackendInvalidEntryEnumeration(); 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void BackendFixEnumerators(); 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void BackendDoomRecent(); 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void BackendDoomBetween(); 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void BackendTransaction(const std::string& name, int num_entries, bool load); 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void BackendRecoverInsert(); 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void BackendRecoverRemove(); 51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void BackendRecoverWithEviction(); 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void BackendInvalidEntry2(); 5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen void BackendInvalidEntry3(); 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void BackendNotMarkedButDirty(const std::string& name); 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void BackendDoomAll(); 56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void BackendDoomAll2(); 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void BackendInvalidRankings(); 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void BackendInvalidRankings2(); 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void BackendDisable(); 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void BackendDisable2(); 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void BackendDisable3(); 62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void BackendDisable4(); 63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendBasics() { 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry *entry1 = NULL, *entry2 = NULL; 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NE(net::OK, OpenEntry("the first key", &entry1)); 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry("the first key", &entry1)); 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(NULL != entry1); 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry1->Close(); 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry1 = NULL; 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenEntry("the first key", &entry1)); 75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(NULL != entry1); 76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry1->Close(); 77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry1 = NULL; 78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NE(net::OK, CreateEntry("the first key", &entry1)); 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenEntry("the first key", &entry1)); 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NE(net::OK, OpenEntry("some other key", &entry2)); 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry("some other key", &entry2)); 83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(NULL != entry1); 84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(NULL != entry2); 85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(2, cache_->GetEntryCount()); 86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry* entry3 = NULL; 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenEntry("some other key", &entry3)); 89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(NULL != entry3); 90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(entry2 == entry3); 91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(2, cache_->GetEntryCount()); 92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(net::OK, DoomEntry("some other key")); 94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(1, cache_->GetEntryCount()); 95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry1->Close(); 96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry2->Close(); 97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry3->Close(); 98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(net::OK, DoomEntry("the first key")); 100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, cache_->GetEntryCount()); 101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry("the first key", &entry1)); 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry("some other key", &entry2)); 104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry1->Doom(); 105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry1->Close(); 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(net::OK, DoomEntry("some other key")); 107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, cache_->GetEntryCount()); 108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry2->Close(); 109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, Basics) { 112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendBasics(); 113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionBasics) { 116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetNewEviction(); 117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendBasics(); 118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, MemoryOnlyBasics) { 121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMemoryOnlyMode(); 122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendBasics(); 123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheBackendTest, AppCacheBasics) { 1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetCacheType(net::APP_CACHE); 1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick BackendBasics(); 1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendKeying() { 131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* kName1 = "the first key"; 133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* kName2 = "the first Key"; 134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry *entry1, *entry2; 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(kName1, &entry1)); 136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(kName2, &entry2)); 138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(entry1 != entry2) << "Case sensitive"; 139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry2->Close(); 140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott char buffer[30]; 142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base::strlcpy(buffer, kName1, arraysize(buffer)); 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenEntry(buffer, &entry2)); 144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(entry1 == entry2); 145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry2->Close(); 146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base::strlcpy(buffer + 1, kName1, arraysize(buffer) - 1); 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenEntry(buffer + 1, &entry2)); 149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(entry1 == entry2); 150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry2->Close(); 151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base::strlcpy(buffer + 3, kName1, arraysize(buffer) - 3); 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenEntry(buffer + 3, &entry2)); 154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(entry1 == entry2); 155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry2->Close(); 156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Now verify long keys. 158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott char buffer2[20000]; 159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(buffer2, 's', sizeof(buffer2)); 160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott buffer2[1023] = '\0'; 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(buffer2, &entry2)) << "key on block file"; 162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry2->Close(); 163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott buffer2[1023] = 'g'; 165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott buffer2[19999] = '\0'; 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(buffer2, &entry2)) << "key on external file"; 167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry2->Close(); 168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry1->Close(); 169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, Keying) { 172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendKeying(); 173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionKeying) { 176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetNewEviction(); 177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendKeying(); 178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, MemoryOnlyKeying) { 181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMemoryOnlyMode(); 182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendKeying(); 183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1853345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheBackendTest, AppCacheKeying) { 1863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetCacheType(net::APP_CACHE); 1873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick BackendKeying(); 1883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 1893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(DiskCacheTest, CreateBackend) { 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestCompletionCallback cb; 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath path = GetCacheFilePath(); 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(DeleteCache(path)); 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Thread cache_thread("CacheThread"); 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(cache_thread.StartWithOptions( 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Thread::Options(MessageLoop::TYPE_IO, 0))); 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Test the private factory methods. 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch disk_cache::Backend* cache = NULL; 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int rv = disk_cache::BackendImpl::CreateBackend( 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch path, false, 0, net::DISK_CACHE, disk_cache::kNoRandom, 2043f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen cache_thread.message_loop_proxy(), NULL, &cache, &cb); 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, cb.GetResult(rv)); 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(cache); 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete cache; 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen cache = disk_cache::MemBackendImpl::CreateBackend(0, NULL); 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(cache); 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete cache; 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cache = NULL; 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now test the public API. 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = disk_cache::CreateCacheBackend(net::DISK_CACHE, path, 0, false, 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cache_thread.message_loop_proxy(), 2173f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen NULL, &cache, &cb); 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, cb.GetResult(rv)); 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(cache); 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete cache; 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cache = NULL; 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = disk_cache::CreateCacheBackend(net::MEMORY_CACHE, FilePath(), 0, false, 2243f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen NULL, NULL, &cache, &cb); 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, cb.GetResult(rv)); 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(cache); 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete cache; 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->RunAllPending(); 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, ExternalFiles) { 234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 2353f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // First, let's create a file on the folder. 236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott FilePath filename = GetCacheFilePath().AppendASCII("f_000001"); 237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize = 50; 239513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize)); 240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(buffer1->data(), kSize, false); 241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_EQ(kSize, file_util::WriteFile(filename, buffer1->data(), kSize)); 242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Now let's create a file with the cache. 244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry* entry; 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry("key", &entry)); 2463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(0, WriteData(entry, 0, 20000, buffer1, 0, false)); 247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // And verify that the first file is still there. 250513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize)); 251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_EQ(kSize, file_util::ReadFile(filename, buffer2->data(), kSize)); 252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, memcmp(buffer1->data(), buffer2->data(), kSize)); 253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that we deal with file-level pending operations at destruction time. 256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheTest, ShutdownWithPendingIO) { 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestCompletionCallback cb; 258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { 260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott FilePath path = GetCacheFilePath(); 261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(DeleteCache(path)); 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Thread cache_thread("CacheThread"); 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(cache_thread.StartWithOptions( 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Thread::Options(MessageLoop::TYPE_IO, 0))); 265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch disk_cache::Backend* cache; 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int rv = disk_cache::BackendImpl::CreateBackend( 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch path, false, 0, net::DISK_CACHE, disk_cache::kNoRandom, 2693f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen base::MessageLoopProxy::CreateForCurrentThread(), NULL, 2703f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen &cache, &cb); 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, cb.GetResult(rv)); 272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch disk_cache::EntryImpl* entry; 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = cache->CreateEntry("some key", 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch reinterpret_cast<disk_cache::Entry**>(&entry), &cb); 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, cb.GetResult(rv)); 277c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize = 25000; 279513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); 280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(buffer->data(), kSize, false); 281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < 10 * 1024 * 1024; i += 64 * 1024) { 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We are using the current thread as the cache thread because we want to 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // be able to call directly this method to make sure that the OS (instead 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // of us switching thread) is returning IO pending. 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = entry->WriteDataImpl(0, i, buffer, kSize, &cb, false); 287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (rv == net::ERR_IO_PENDING) 288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(kSize, rv); 290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Don't call Close() to avoid going through the queue or we'll deadlock 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // waiting for the operation to finish. 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry->Release(); 295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The cache destructor will see one pending operation here. 297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott delete cache; 298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (rv == net::ERR_IO_PENDING) { 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(cb.have_result()); 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->RunAllPending(); 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that we deal with background-thread pending operations. 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(DiskCacheTest, ShutdownWithPendingIO2) { 309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestCompletionCallback cb; 310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath path = GetCacheFilePath(); 313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(DeleteCache(path)); 314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Thread cache_thread("CacheThread"); 315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(cache_thread.StartWithOptions( 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Thread::Options(MessageLoop::TYPE_IO, 0))); 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch disk_cache::Backend* cache; 319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int rv = disk_cache::BackendImpl::CreateBackend( 320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch path, false, 0, net::DISK_CACHE, disk_cache::kNoRandom, 3213f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen cache_thread.message_loop_proxy(), NULL, &cache, &cb); 322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, cb.GetResult(rv)); 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch disk_cache::Entry* entry; 325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = cache->CreateEntry("some key", &entry, &cb); 326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, cb.GetResult(rv)); 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const int kSize = 25000; 329513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); 330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CacheTestFillBuffer(buffer->data(), kSize, false); 331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = entry->WriteData(0, 0, buffer, kSize, &cb, false); 333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(net::ERR_IO_PENDING, rv); 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry->Close(); 336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The cache destructor will see two pending operations here. 338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete cache; 339c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 340c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 341c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott MessageLoop::current()->RunAllPending(); 342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 344c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(DiskCacheTest, TruncatedIndex) { 345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath path = GetCacheFilePath(); 346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(DeleteCache(path)); 347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath index = path.AppendASCII("index"); 348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(5, file_util::WriteFile(index, "hello", 5)); 349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Thread cache_thread("CacheThread"); 351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(cache_thread.StartWithOptions( 352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Thread::Options(MessageLoop::TYPE_IO, 0))); 353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestCompletionCallback cb; 354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch disk_cache::Backend* backend = NULL; 356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int rv = disk_cache::BackendImpl::CreateBackend( 357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch path, false, 0, net::DISK_CACHE, disk_cache::kNone, 3583f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen cache_thread.message_loop_proxy(), NULL, &backend, &cb); 359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_NE(net::OK, cb.GetResult(rv)); 360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(backend == NULL); 362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete backend; 363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 365c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendSetSize() { 366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetDirectMode(); 367c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int cache_size = 0x10000; // 64 kB 368c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMaxSize(cache_size); 369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 371c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string first("some key"); 372c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string second("something else"); 373c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry* entry; 374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(first, &entry)); 375c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 376513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(cache_size)); 377c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(buffer->data(), 0, cache_size); 3783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(cache_size / 10, WriteData(entry, 0, 0, buffer, cache_size / 10, 3793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick false)) << "normal file"; 380c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(net::ERR_FAILED, WriteData(entry, 1, 0, buffer, cache_size / 5, 3823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick false)) << "file size above the limit"; 383c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 384c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // By doubling the total size, we make this file cacheable. 385c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMaxSize(cache_size * 2); 3863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(cache_size / 5, WriteData(entry, 1, 0, buffer, cache_size / 5, 3873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick false)); 388c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 389c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Let's fill up the cache!. 390c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMaxSize(cache_size * 10); 3913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(cache_size * 3 / 4, WriteData(entry, 0, 0, buffer, 3923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick cache_size * 3 / 4, false)); 393c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FlushQueueForTest(); 395c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 396c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMaxSize(cache_size); 397c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 398c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The cache is 95% full. 399c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(second, &entry)); 4013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(cache_size / 10, WriteData(entry, 0, 0, buffer, cache_size / 10, 4023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick false)); 403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch disk_cache::Entry* entry2; 405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry("an extra key", &entry2)); 4063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(cache_size / 10, WriteData(entry2, 0, 0, buffer, cache_size / 10, 4073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick false)); 408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry2->Close(); // This will trigger the cache trim. 409c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NE(net::OK, OpenEntry(first, &entry2)); 411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FlushQueueForTest(); // Make sure that we are done trimming the cache. 413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FlushQueueForTest(); // We may have posted two tasks to evict stuff. 414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry->Close(); 416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenEntry(second, &entry)); 417c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(cache_size / 10, entry->GetDataSize(0)); 418c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 419c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 420c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 421c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, SetSize) { 422c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendSetSize(); 423c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 424c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 425c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionSetSize) { 426c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetNewEviction(); 427c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendSetSize(); 428c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 429c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 430c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, MemoryOnlySetSize) { 431c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMemoryOnlyMode(); 432c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendSetSize(); 433c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 434c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 435c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendLoad() { 436c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 437c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int seed = static_cast<int>(Time::Now().ToInternalValue()); 438c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott srand(seed); 439c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 440c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry* entries[100]; 441c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < 100; i++) { 442c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string key = GenerateKey(true); 443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(key, &entries[i])); 444c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 445c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(100, cache_->GetEntryCount()); 446c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 447c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < 100; i++) { 448c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int source1 = rand() % 100; 449c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int source2 = rand() % 100; 450c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry* temp = entries[source1]; 451c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entries[source1] = entries[source2]; 452c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entries[source2] = temp; 453c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 454c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 455c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < 100; i++) { 456c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry* entry; 457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenEntry(entries[i]->GetKey(), &entry)); 458c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(entry == entries[i]); 459c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 460c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entries[i]->Doom(); 461c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entries[i]->Close(); 462c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FlushQueueForTest(); 464c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, cache_->GetEntryCount()); 465c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 466c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 467c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, Load) { 468c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Work with a tiny index table (16 entries) 469c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMask(0xf); 470c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMaxSize(0x100000); 471c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendLoad(); 472c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 473c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 474c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionLoad) { 475c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetNewEviction(); 476c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Work with a tiny index table (16 entries) 477c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMask(0xf); 478c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMaxSize(0x100000); 479c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendLoad(); 480c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 481c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 482c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, MemoryOnlyLoad) { 483c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Work with a tiny index table (16 entries) 484c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMaxSize(0x100000); 485c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMemoryOnlyMode(); 486c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendLoad(); 487c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 488c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 4893345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheBackendTest, AppCacheLoad) { 4903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetCacheType(net::APP_CACHE); 4913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Work with a tiny index table (16 entries) 4923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetMask(0xf); 4933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetMaxSize(0x100000); 4943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick BackendLoad(); 4953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 4963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4970a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian MonsenTEST_F(DiskCacheBackendTest, NewEvictionTrim) { 4980a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen SetNewEviction(); 4990a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen SetDirectMode(); 5000a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen InitCache(); 5010a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen 5020a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen disk_cache::Entry* entry; 5030a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen for (int i = 0; i < 100; i++) { 5040a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen std::string name(StringPrintf("Key %d", i)); 5050a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen ASSERT_EQ(net::OK, CreateEntry(name, &entry)); 5060a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen entry->Close(); 5070a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen if (i < 90) { 5080a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen // Entries 0 to 89 are in list 1; 90 to 99 are in list 0. 5090a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen ASSERT_EQ(net::OK, OpenEntry(name, &entry)); 5100a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen entry->Close(); 5110a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen } 5120a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen } 5130a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen 5140a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen // The first eviction must come from list 1 (10% limit), the second must come 5150a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen // from list 0. 5160a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen TrimForTest(false); 5170a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen EXPECT_NE(net::OK, OpenEntry("Key 0", &entry)); 5180a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen TrimForTest(false); 5190a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen EXPECT_NE(net::OK, OpenEntry("Key 90", &entry)); 5200a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen 5210a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen // Double check that we still have the list tails. 5220a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen ASSERT_EQ(net::OK, OpenEntry("Key 1", &entry)); 5230a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen entry->Close(); 5240a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen ASSERT_EQ(net::OK, OpenEntry("Key 91", &entry)); 5250a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen entry->Close(); 5260a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen} 5270a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen 528c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Before looking for invalid entries, let's check a valid entry. 529c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendValidEntry() { 530c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetDirectMode(); 531c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 532c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 533c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string key("Some key"); 5343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick disk_cache::Entry* entry; 5353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 536c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 537c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize = 50; 538513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize)); 539c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(buffer1->data(), 0, kSize); 540c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base::strlcpy(buffer1->data(), "And the data to save", kSize); 5413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer1, kSize, false)); 5423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 543c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SimulateCrash(); 544c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 546c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 547513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize)); 548c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(buffer2->data(), 0, kSize); 5493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer2, kSize)); 5503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 551c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_STREQ(buffer1->data(), buffer2->data()); 552c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 553c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 554c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, ValidEntry) { 555c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendValidEntry(); 556c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 557c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 558c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionValidEntry) { 559c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetNewEviction(); 560c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendValidEntry(); 561c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 562c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 563c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The same logic of the previous test (ValidEntry), but this time force the 564c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// entry to be invalid, simulating a crash in the middle. 565c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test. 566c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendInvalidEntry() { 567c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Use the implementation directly... we need to simulate a crash. 568c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetDirectMode(); 569c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 570c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 571c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string key("Some key"); 5723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick disk_cache::Entry* entry; 5733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 574c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 575c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize = 50; 576513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); 5773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick memset(buffer->data(), 0, kSize); 5783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick base::strlcpy(buffer->data(), "And the data to save", kSize); 5793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, false)); 580c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SimulateCrash(); 581c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_NE(net::OK, OpenEntry(key, &entry)); 583c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, cache_->GetEntryCount()); 584c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 585c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 586c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This and the other intentionally leaky tests below are excluded from 587c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// purify and valgrind runs by naming them in the files 588c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// net/data/purify/net_unittests.exe.gtest.txt and 589c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// net/data/valgrind/net_unittests.gtest.txt 590c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The scripts tools/{purify,valgrind}/chrome_tests.sh 591c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// read those files and pass the appropriate --gtest_filter to net_unittests. 592c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, InvalidEntry) { 593c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendInvalidEntry(); 594c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 595c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 596c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test. 597c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry) { 598c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetNewEviction(); 599c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendInvalidEntry(); 600c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 601c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 6023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// We'll be leaking memory from this test. 6033345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheBackendTest, AppCacheInvalidEntry) { 6043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetCacheType(net::APP_CACHE); 6053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick BackendInvalidEntry(); 6063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 6073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 608c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Almost the same test, but this time crash the cache after reading an entry. 609c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test. 610c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendInvalidEntryRead() { 611c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Use the implementation directly... we need to simulate a crash. 612c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetDirectMode(); 613c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 614c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 615c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string key("Some key"); 6163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick disk_cache::Entry* entry; 6173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 618c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 619c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize = 50; 620513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); 6213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick memset(buffer->data(), 0, kSize); 6223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick base::strlcpy(buffer->data(), "And the data to save", kSize); 6233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, false)); 6243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 6253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 6263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer, kSize)); 627c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 628c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SimulateCrash(); 629c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 6303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (type_ == net::APP_CACHE) { 6313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Reading an entry and crashing should not make it dirty. 6323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 6333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(1, cache_->GetEntryCount()); 6343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 6353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else { 6363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_NE(net::OK, OpenEntry(key, &entry)); 6373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, cache_->GetEntryCount()); 6383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 639c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 640c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 641c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test. 642c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, InvalidEntryRead) { 643c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendInvalidEntryRead(); 644c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 645c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 646c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test. 647c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionInvalidEntryRead) { 648c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetNewEviction(); 649c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendInvalidEntryRead(); 650c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 651c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 652c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test. 6533345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheBackendTest, AppCacheInvalidEntryRead) { 6543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetCacheType(net::APP_CACHE); 6553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick BackendInvalidEntryRead(); 6563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 6573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 6583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// We'll be leaking memory from this test. 659c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendInvalidEntryWithLoad() { 660c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Work with a tiny index table (16 entries) 661c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMask(0xf); 662c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMaxSize(0x100000); 663c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 664c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 665c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int seed = static_cast<int>(Time::Now().ToInternalValue()); 666c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott srand(seed); 667c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 668c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kNumEntries = 100; 669c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry* entries[kNumEntries]; 670c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < kNumEntries; i++) { 671c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string key = GenerateKey(true); 672c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(key, &entries[i])); 673c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 674c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(kNumEntries, cache_->GetEntryCount()); 675c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 676c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < kNumEntries; i++) { 677c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int source1 = rand() % kNumEntries; 678c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int source2 = rand() % kNumEntries; 679c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry* temp = entries[source1]; 680c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entries[source1] = entries[source2]; 681c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entries[source2] = temp; 682c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 683c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 684c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string keys[kNumEntries]; 685c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < kNumEntries; i++) { 686c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott keys[i] = entries[i]->GetKey(); 687c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (i < kNumEntries / 2) 688c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entries[i]->Close(); 689c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 690c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 691c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SimulateCrash(); 692c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 693c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = kNumEntries / 2; i < kNumEntries; i++) { 694c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry* entry; 695c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NE(net::OK, OpenEntry(keys[i], &entry)); 696c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 697c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 698c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < kNumEntries / 2; i++) { 699c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry* entry; 700c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(net::OK, OpenEntry(keys[i], &entry)); 701c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 702c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 703c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 704c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(kNumEntries / 2, cache_->GetEntryCount()); 705c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 706c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 707c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test. 708c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, InvalidEntryWithLoad) { 709c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendInvalidEntryWithLoad(); 710c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 711c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 712c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test. 713c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionInvalidEntryWithLoad) { 714c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetNewEviction(); 715c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendInvalidEntryWithLoad(); 716c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 717c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 718c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test. 7193345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheBackendTest, AppCacheInvalidEntryWithLoad) { 7203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetCacheType(net::APP_CACHE); 7213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick BackendInvalidEntryWithLoad(); 7223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 7233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 7243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// We'll be leaking memory from this test. 725c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendTrimInvalidEntry() { 726c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Use the implementation directly... we need to simulate a crash. 727c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetDirectMode(); 728c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 729c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize = 0x3000; // 12 kB 730c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMaxSize(kSize * 10); 731c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 732c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 733c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string first("some key"); 734c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string second("something else"); 735c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry* entry; 736c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(first, &entry)); 737c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 738513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); 739c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(buffer->data(), 0, kSize); 7403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, false)); 741c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 742c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Simulate a crash. 743c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SimulateCrash(); 744c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 745c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(second, &entry)); 7463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, false)); 747c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 748c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(2, cache_->GetEntryCount()); 749c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMaxSize(kSize); 750c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); // Trim the cache. 751c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FlushQueueForTest(); 752c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 753c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // If we evicted the entry in less than 20mS, we have one entry in the cache; 754c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // if it took more than that, we posted a task and we'll delete the second 755c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // entry too. 756c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott MessageLoop::current()->RunAllPending(); 7573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 7583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // This may be not thread-safe in general, but for now it's OK so add some 7593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // ThreadSanitizer annotations to ignore data races on cache_. 7603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // See http://crbug.com/55970 7613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ANNOTATE_IGNORE_READS_BEGIN(); 762c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_GE(1, cache_->GetEntryCount()); 7633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ANNOTATE_IGNORE_READS_END(); 7643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 765c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NE(net::OK, OpenEntry(first, &entry)); 766c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 767c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 768c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test. 769c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, TrimInvalidEntry) { 770c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendTrimInvalidEntry(); 771c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 772c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 773c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test. 774c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionTrimInvalidEntry) { 775c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetNewEviction(); 776c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendTrimInvalidEntry(); 777c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 778c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 779c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test. 780c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendTrimInvalidEntry2() { 781c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Use the implementation directly... we need to simulate a crash. 782c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetDirectMode(); 783c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMask(0xf); // 16-entry table. 784c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 785c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize = 0x3000; // 12 kB 786c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMaxSize(kSize * 40); 787c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 788c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 789513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); 790c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(buffer->data(), 0, kSize); 791c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry* entry; 792c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 793c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Writing 32 entries to this cache chains most of them. 794c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < 32; i++) { 7953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string key(base::StringPrintf("some key %d", i)); 796c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 7973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, false)); 798c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 799c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 800c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Note that we are not closing the entries. 801c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 802c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 803c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Simulate a crash. 804c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SimulateCrash(); 805c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 806c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry("Something else", &entry)); 8073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, false)); 808c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 809c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(33, cache_->GetEntryCount()); 810c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMaxSize(kSize); 811c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 812c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // For the new eviction code, all corrupt entries are on the second list so 813c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // they are not going away that easy. 814c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (new_eviction_) { 815c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(net::OK, DoomAllEntries()); 816c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 817c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 818c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); // Trim the cache. 819c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FlushQueueForTest(); 820c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 821c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // We may abort the eviction before cleaning up everything. 822c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott MessageLoop::current()->RunAllPending(); 823c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_GE(30, cache_->GetEntryCount()); 824c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 825c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 826c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test. 827c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, TrimInvalidEntry2) { 828c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendTrimInvalidEntry2(); 829c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 830c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 831c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test. 832c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionTrimInvalidEntry2) { 833c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetNewEviction(); 834c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendTrimInvalidEntry2(); 835c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 836c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 837c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendEnumerations() { 838c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 839c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Time initial = Time::Now(); 840c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int seed = static_cast<int>(initial.ToInternalValue()); 841c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott srand(seed); 842c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 843c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kNumEntries = 100; 844c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < kNumEntries; i++) { 845c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string key = GenerateKey(true); 846c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry* entry; 847c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 848c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 849c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 850c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(kNumEntries, cache_->GetEntryCount()); 851c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Time final = Time::Now(); 852c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 853c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry* entry; 854c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void* iter = NULL; 855c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int count = 0; 856c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Time last_modified[kNumEntries]; 857c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Time last_used[kNumEntries]; 858c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch while (OpenNextEntry(&iter, &entry) == net::OK) { 859c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(NULL != entry); 860c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (count < kNumEntries) { 861c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott last_modified[count] = entry->GetLastModified(); 862c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott last_used[count] = entry->GetLastUsed(); 863c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(initial <= last_modified[count]); 864c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(final >= last_modified[count]); 865c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 866c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 867c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 868c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott count++; 869c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 870c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(kNumEntries, count); 871c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 872c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott iter = NULL; 873c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott count = 0; 874c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The previous enumeration should not have changed the timestamps. 875c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch while (OpenNextEntry(&iter, &entry) == net::OK) { 876c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(NULL != entry); 877c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (count < kNumEntries) { 878c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(last_modified[count] == entry->GetLastModified()); 879c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(last_used[count] == entry->GetLastUsed()); 880c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 881c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 882c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott count++; 883c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 884c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(kNumEntries, count); 885c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 886c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 887c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, Enumerations) { 888c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendEnumerations(); 889c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 890c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 891c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionEnumerations) { 892c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetNewEviction(); 893c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendEnumerations(); 894c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 895c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 896c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, MemoryOnlyEnumerations) { 897c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMemoryOnlyMode(); 898c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendEnumerations(); 899c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 900c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 901dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Flaky, http://crbug.com/74387. 902dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(DiskCacheBackendTest, FLAKY_AppCacheEnumerations) { 9033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetCacheType(net::APP_CACHE); 9043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick BackendEnumerations(); 9053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 9063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 907c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Verifies enumerations while entries are open. 908c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendEnumerations2() { 909c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 910c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const std::string first("first"); 911c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const std::string second("second"); 912c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry *entry1, *entry2; 913c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(first, &entry1)); 914c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry1->Close(); 915c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(second, &entry2)); 916c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry2->Close(); 917c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 918c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Make sure that the timestamp is not the same. 9193f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen base::PlatformThread::Sleep(20); 920c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenEntry(second, &entry1)); 921c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void* iter = NULL; 922c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry2)); 9233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(entry2->GetKey(), second); 924c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 925c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Two entries and the iterator pointing at "first". 926c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry1->Close(); 927c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry2->Close(); 928c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 929c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The iterator should still be valid, so we should not crash. 930c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry2)); 9313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(entry2->GetKey(), first); 9323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry2->Close(); 9333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick cache_->EndEnumeration(&iter); 9343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Modify the oldest entry and get the newest element. 9363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, OpenEntry(first, &entry1)); 9373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, WriteData(entry1, 0, 200, NULL, 0, false)); 9383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry2)); 9393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (type_ == net::APP_CACHE) { 9403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // The list is not updated. 9413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(entry2->GetKey(), second); 9423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else { 9433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(entry2->GetKey(), first); 9443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 9453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry1->Close(); 947c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry2->Close(); 948c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cache_->EndEnumeration(&iter); 949c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 950c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 951c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, Enumerations2) { 952c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendEnumerations2(); 953c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 954c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 955c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionEnumerations2) { 956c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetNewEviction(); 957c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendEnumerations2(); 958c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 959c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 960c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, MemoryOnlyEnumerations2) { 961c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMemoryOnlyMode(); 962c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendEnumerations2(); 963c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 964c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 9653345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheBackendTest, AppCacheEnumerations2) { 9663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetCacheType(net::APP_CACHE); 9673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick BackendEnumerations2(); 9683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 969c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 970c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Verify handling of invalid entries while doing enumerations. 971c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test. 972c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendInvalidEntryEnumeration() { 973c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Use the implementation directly... we need to simulate a crash. 974c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetDirectMode(); 975c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 976c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 977c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string key("Some key"); 978c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry *entry, *entry1, *entry2; 979c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(key, &entry1)); 980c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 981c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize = 50; 982513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize)); 983c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(buffer1->data(), 0, kSize); 984c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base::strlcpy(buffer1->data(), "And the data to save", kSize); 9853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteData(entry1, 0, 0, buffer1, kSize, false)); 986c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry1->Close(); 987c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenEntry(key, &entry1)); 9883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, ReadData(entry1, 0, 0, buffer1, kSize)); 989c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 990c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string key2("Another key"); 991c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(key2, &entry2)); 992c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry2->Close(); 993c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_EQ(2, cache_->GetEntryCount()); 994c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 995c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SimulateCrash(); 996c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 997c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void* iter = NULL; 998c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int count = 0; 999c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch while (OpenNextEntry(&iter, &entry) == net::OK) { 1000c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(NULL != entry); 1001c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(key2, entry->GetKey()); 1002c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1003c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott count++; 1004c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 1005c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(1, count); 1006c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(1, cache_->GetEntryCount()); 1007c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1008c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1009c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test. 1010c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, InvalidEntryEnumeration) { 1011c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendInvalidEntryEnumeration(); 1012c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1013c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1014c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test. 1015c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionInvalidEntryEnumeration) { 1016c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetNewEviction(); 1017c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendInvalidEntryEnumeration(); 1018c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1019c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1020c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Tests that if for some reason entries are modified close to existing cache 1021c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// iterators, we don't generate fatal errors or reset the cache. 1022c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendFixEnumerators() { 1023c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1024c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1025c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int seed = static_cast<int>(Time::Now().ToInternalValue()); 1026c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott srand(seed); 1027c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1028c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kNumEntries = 10; 1029c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < kNumEntries; i++) { 1030c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string key = GenerateKey(true); 1031c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry* entry; 1032c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 1033c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1034c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1035c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(kNumEntries, cache_->GetEntryCount()); 1036c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1037c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry *entry1, *entry2; 1038c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void* iter1 = NULL; 1039c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void* iter2 = NULL; 1040c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenNextEntry(&iter1, &entry1)); 1041c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(NULL != entry1); 1042c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry1->Close(); 1043c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry1 = NULL; 1044c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1045c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Let's go to the middle of the list. 1046c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < kNumEntries / 2; i++) { 1047c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (entry1) 1048c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry1->Close(); 1049c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenNextEntry(&iter1, &entry1)); 1050c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(NULL != entry1); 1051c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1052c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenNextEntry(&iter2, &entry2)); 1053c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(NULL != entry2); 1054c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry2->Close(); 1055c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1056c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1057c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Messing up with entry1 will modify entry2->next. 1058c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry1->Doom(); 1059c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenNextEntry(&iter2, &entry2)); 1060c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(NULL != entry2); 1061c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1062c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The link entry2->entry1 should be broken. 1063c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_NE(entry2->GetKey(), entry1->GetKey()); 1064c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry1->Close(); 1065c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry2->Close(); 1066c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1067c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // And the second iterator should keep working. 1068c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenNextEntry(&iter2, &entry2)); 1069c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(NULL != entry2); 1070c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry2->Close(); 1071c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1072c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cache_->EndEnumeration(&iter1); 1073c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cache_->EndEnumeration(&iter2); 1074c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1075c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1076c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, FixEnumerators) { 1077c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendFixEnumerators(); 1078c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1079c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1080c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionFixEnumerators) { 1081c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetNewEviction(); 1082c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendFixEnumerators(); 1083c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1084c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1085c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendDoomRecent() { 1086c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1087c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Time initial = Time::Now(); 1088c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1089c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry *entry; 1090c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry("first", &entry)); 1091c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1092c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry("second", &entry)); 1093c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1094c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 10953f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen base::PlatformThread::Sleep(20); 1096c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Time middle = Time::Now(); 1097c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1098c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry("third", &entry)); 1099c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry("fourth", &entry)); 1101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 11033f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen base::PlatformThread::Sleep(20); 1104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Time final = Time::Now(); 1105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_EQ(4, cache_->GetEntryCount()); 1107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(net::OK, DoomEntriesSince(final)); 1108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_EQ(4, cache_->GetEntryCount()); 1109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(net::OK, DoomEntriesSince(middle)); 1111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_EQ(2, cache_->GetEntryCount()); 1112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenEntry("second", &entry)); 1114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, DoomRecent) { 1118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendDoomRecent(); 1119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionDoomRecent) { 1122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetNewEviction(); 1123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendDoomRecent(); 1124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, MemoryOnlyDoomRecent) { 1127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMemoryOnlyMode(); 1128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendDoomRecent(); 1129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendDoomBetween() { 1132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Time initial = Time::Now(); 1134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry *entry; 1136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry("first", &entry)); 1137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 11393f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen base::PlatformThread::Sleep(20); 1140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Time middle_start = Time::Now(); 1141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry("second", &entry)); 1143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry("third", &entry)); 1145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 11473f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen base::PlatformThread::Sleep(20); 1148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Time middle_end = Time::Now(); 1149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry("fourth", &entry)); 1151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenEntry("fourth", &entry)); 1153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 11553f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen base::PlatformThread::Sleep(20); 1156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Time final = Time::Now(); 1157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_EQ(4, cache_->GetEntryCount()); 1159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(net::OK, DoomEntriesBetween(middle_start, middle_end)); 1160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_EQ(2, cache_->GetEntryCount()); 1161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenEntry("fourth", &entry)); 1163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(net::OK, DoomEntriesBetween(middle_start, final)); 1166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_EQ(1, cache_->GetEntryCount()); 1167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenEntry("first", &entry)); 1169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, DoomBetween) { 1173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendDoomBetween(); 1174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionDoomBetween) { 1177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetNewEviction(); 1178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendDoomBetween(); 1179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, MemoryOnlyDoomBetween) { 1182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMemoryOnlyMode(); 1183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendDoomBetween(); 1184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid DiskCacheBackendTest::BackendTransaction(const std::string& name, 1187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int num_entries, bool load) { 1188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott success_ = false; 1189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(CopyTestCache(name)); 1190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DisableFirstCleanup(); 1191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (load) { 1193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMask(0xf); 1194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMaxSize(0x100000); 1195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else { 1196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Clear the settings from the previous run. 1197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMask(0); 1198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMaxSize(0); 1199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_EQ(num_entries + 1, cache_->GetEntryCount()); 1203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string key("the first key"); 1205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry* entry1; 1206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_NE(net::OK, OpenEntry(key, &entry1)); 1207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int actual = cache_->GetEntryCount(); 1209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (num_entries != actual) { 1210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(load); 1211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // If there is a heavy load, inserting an entry will make another entry 1212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // dirty (on the hash bucket) so two entries are removed. 1213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_EQ(num_entries - 1, actual); 1214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott delete cache_; 1217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cache_ = NULL; 1218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cache_impl_ = NULL; 1219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(CheckCacheIntegrity(GetCacheFilePath(), new_eviction_)); 1221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott success_ = true; 1222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendRecoverInsert() { 1225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Tests with an empty cache. 1226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BackendTransaction("insert_empty1", 0, false); 1227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(success_) << "insert_empty1"; 1228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BackendTransaction("insert_empty2", 0, false); 1229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(success_) << "insert_empty2"; 1230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BackendTransaction("insert_empty3", 0, false); 1231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(success_) << "insert_empty3"; 1232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Tests with one entry on the cache. 1234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BackendTransaction("insert_one1", 1, false); 1235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(success_) << "insert_one1"; 1236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BackendTransaction("insert_one2", 1, false); 1237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(success_) << "insert_one2"; 1238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BackendTransaction("insert_one3", 1, false); 1239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(success_) << "insert_one3"; 1240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Tests with one hundred entries on the cache, tiny index. 1242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BackendTransaction("insert_load1", 100, true); 1243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(success_) << "insert_load1"; 1244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BackendTransaction("insert_load2", 100, true); 1245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(success_) << "insert_load2"; 1246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, RecoverInsert) { 1249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendRecoverInsert(); 1250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionRecoverInsert) { 1253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetNewEviction(); 1254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendRecoverInsert(); 1255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendRecoverRemove() { 1258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Removing the only element. 1259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BackendTransaction("remove_one1", 0, false); 1260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(success_) << "remove_one1"; 1261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BackendTransaction("remove_one2", 0, false); 1262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(success_) << "remove_one2"; 1263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BackendTransaction("remove_one3", 0, false); 1264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(success_) << "remove_one3"; 1265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Removing the head. 1267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BackendTransaction("remove_head1", 1, false); 1268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(success_) << "remove_head1"; 1269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BackendTransaction("remove_head2", 1, false); 1270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(success_) << "remove_head2"; 1271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BackendTransaction("remove_head3", 1, false); 1272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(success_) << "remove_head3"; 1273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Removing the tail. 1275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BackendTransaction("remove_tail1", 1, false); 1276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(success_) << "remove_tail1"; 1277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BackendTransaction("remove_tail2", 1, false); 1278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(success_) << "remove_tail2"; 1279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BackendTransaction("remove_tail3", 1, false); 1280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(success_) << "remove_tail3"; 1281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Removing with one hundred entries on the cache, tiny index. 1283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BackendTransaction("remove_load1", 100, true); 1284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(success_) << "remove_load1"; 1285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BackendTransaction("remove_load2", 100, true); 1286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(success_) << "remove_load2"; 1287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BackendTransaction("remove_load3", 100, true); 1288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(success_) << "remove_load3"; 1289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1290ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // This case cannot be reverted. 1291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BackendTransaction("remove_one4", 0, false); 1292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(success_) << "remove_one4"; 1293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BackendTransaction("remove_head4", 1, false); 1294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(success_) << "remove_head4"; 1295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, RecoverRemove) { 1298c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendRecoverRemove(); 1299c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1301c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionRecoverRemove) { 1302c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetNewEviction(); 1303c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendRecoverRemove(); 1304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1306dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid DiskCacheBackendTest::BackendRecoverWithEviction() { 1307dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen success_ = false; 1308dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ASSERT_TRUE(CopyTestCache("insert_load1")); 1309dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DisableFirstCleanup(); 1310dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 1311dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen SetMask(0xf); 1312dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen SetMaxSize(0x1000); 1313dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 1314dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // We should not crash here. 1315dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen InitCache(); 1316dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DisableIntegrityCheck(); 1317dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 1318dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 1319dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(DiskCacheBackendTest, RecoverWithEviction) { 1320dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen BackendRecoverWithEviction(); 1321dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 1322dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 1323dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(DiskCacheBackendTest, NewEvictionRecoverWithEviction) { 1324dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen SetNewEviction(); 1325dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen BackendRecoverWithEviction(); 1326dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 1327dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 1328c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Tests dealing with cache files that cannot be recovered. 1329c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(DiskCacheTest, DeleteOld) { 1330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(CopyTestCache("wrong_version")); 1331c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott FilePath path = GetCacheFilePath(); 1332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Thread cache_thread("CacheThread"); 1333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(cache_thread.StartWithOptions( 1334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Thread::Options(MessageLoop::TYPE_IO, 0))); 1335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestCompletionCallback cb; 1336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch disk_cache::Backend* cache; 1338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int rv = disk_cache::BackendImpl::CreateBackend( 1339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch path, true, 0, net::DISK_CACHE, disk_cache::kNoRandom, 13403f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen cache_thread.message_loop_proxy(), NULL, &cache, &cb); 1341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, cb.GetResult(rv)); 1342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott MessageLoopHelper helper; 1344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(NULL != cache); 1346c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_EQ(0, cache->GetEntryCount()); 1347c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete cache; 1349c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1350c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1351c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We want to be able to deal with messed up entries on disk. 1352c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendInvalidEntry2() { 1353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(CopyTestCache("bad_entry")); 1354c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DisableFirstCleanup(); 1355c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1356c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1357c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry *entry1, *entry2; 1358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenEntry("the first key", &entry1)); 1359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NE(net::OK, OpenEntry("some other key", &entry2)); 1360c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry1->Close(); 1361c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1362c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // CheckCacheIntegrity will fail at this point. 1363c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DisableIntegrityCheck(); 1364c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1365c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, InvalidEntry2) { 1367c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendInvalidEntry2(); 1368c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry2) { 1371c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetNewEviction(); 1372c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendInvalidEntry2(); 1373c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1374c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 137572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Tests that we don't crash or hang when enumerating this cache. 137672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DiskCacheBackendTest::BackendInvalidEntry3() { 137772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SetMask(0x1); // 2-entry table. 137872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SetMaxSize(0x3000); // 12 kB. 137972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DisableFirstCleanup(); 138072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen InitCache(); 138172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 138272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen disk_cache::Entry* entry; 138372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen void* iter = NULL; 138472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen while (OpenNextEntry(&iter, &entry) == net::OK) { 138572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen entry->Close(); 138672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 138772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 138872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 138972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(DiskCacheBackendTest, InvalidEntry3) { 139072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(CopyTestCache("dirty_entry3")); 139172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen BackendInvalidEntry3(); 139272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 139372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 13944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry3) { 139572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(CopyTestCache("dirty_entry4")); 139672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SetNewEviction(); 139772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen BackendInvalidEntry3(); 139872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DisableIntegrityCheck(); 139972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 140072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 140172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Test that we handle a dirty entry on the LRU list, already replaced with 140272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// the same key, and with hash collisions. 140372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(DiskCacheBackendTest, InvalidEntry4) { 140472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(CopyTestCache("dirty_entry3")); 140572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SetMask(0x1); // 2-entry table. 140672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SetMaxSize(0x3000); // 12 kB. 140772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DisableFirstCleanup(); 140872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen InitCache(); 140972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 141072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TrimForTest(false); 141172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 141272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 141372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Test that we handle a dirty entry on the deleted list, already replaced with 141472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// the same key, and with hash collisions. 141572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(DiskCacheBackendTest, InvalidEntry5) { 141672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(CopyTestCache("dirty_entry4")); 141772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SetNewEviction(); 141872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SetMask(0x1); // 2-entry table. 141972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SetMaxSize(0x3000); // 12 kB. 142072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DisableFirstCleanup(); 142172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen InitCache(); 142272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 142372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TrimDeletedListForTest(false); 142472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 142572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 1426dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(DiskCacheBackendTest, InvalidEntry6) { 1427dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ASSERT_TRUE(CopyTestCache("dirty_entry5")); 1428dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen SetMask(0x1); // 2-entry table. 1429dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen SetMaxSize(0x3000); // 12 kB. 1430dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DisableFirstCleanup(); 1431dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen InitCache(); 1432dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 1433dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // There is a dirty entry (but marked as clean) at the end, pointing to a 1434dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // deleted entry through the hash collision list. We should not re-insert the 1435dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // deleted entry into the index table. 1436dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 1437dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen TrimForTest(false); 1438dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // The cache should be clean (as detected by CheckCacheIntegrity). 1439dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 1440dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 144172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Tests that we don't hang when there is a loop on the hash collision list. 144272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// The test cache could be a result of bug 69135. 144372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(DiskCacheBackendTest, BadNextEntry1) { 144472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(CopyTestCache("list_loop2")); 144572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SetMask(0x1); // 2-entry table. 144672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SetMaxSize(0x3000); // 12 kB. 144772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DisableFirstCleanup(); 144872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen InitCache(); 144972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 145072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // The second entry points at itselft, and the first entry is not accessible 145172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // though the index, but it is at the head of the LRU. 145272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 145372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen disk_cache::Entry* entry; 145472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_EQ(net::OK, CreateEntry("The first key", &entry)); 145572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen entry->Close(); 145672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 145772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TrimForTest(false); 145872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TrimForTest(false); 145972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_EQ(net::OK, OpenEntry("The first key", &entry)); 146072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen entry->Close(); 146172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(1, cache_->GetEntryCount()); 146272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 146372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 146472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Tests that we don't hang when there is a loop on the hash collision list. 146572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// The test cache could be a result of bug 69135. 146672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(DiskCacheBackendTest, BadNextEntry2) { 146772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(CopyTestCache("list_loop3")); 146872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SetMask(0x1); // 2-entry table. 146972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SetMaxSize(0x3000); // 12 kB. 147072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DisableFirstCleanup(); 147172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen InitCache(); 147272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 147372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // There is a wide loop of 5 entries. 147472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 147572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen disk_cache::Entry* entry; 147672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_NE(net::OK, OpenEntry("Not present key", &entry)); 147772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 147872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 147972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry6) { 14804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ASSERT_TRUE(CopyTestCache("bad_rankings3")); 14814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DisableFirstCleanup(); 14824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch SetNewEviction(); 14834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch InitCache(); 14844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 14854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The second entry is dirty, but removing it should not corrupt the list. 14864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch disk_cache::Entry* entry; 14874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ASSERT_NE(net::OK, OpenEntry("the second key", &entry)); 14884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ASSERT_EQ(net::OK, OpenEntry("the first key", &entry)); 14894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 14904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // This should not delete the cache. 14914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch entry->Doom(); 14924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch FlushQueueForTest(); 14934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch entry->Close(); 14944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 14954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ASSERT_EQ(net::OK, OpenEntry("some other key", &entry)); 14964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch entry->Close(); 14974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 14984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1499c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We want to be able to deal with abnormal dirty entries. 1500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid DiskCacheBackendTest::BackendNotMarkedButDirty(const std::string& name) { 1501c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(CopyTestCache(name)); 1502c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DisableFirstCleanup(); 1503c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1504c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1505c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry *entry1, *entry2; 1506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenEntry("the first key", &entry1)); 1507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NE(net::OK, OpenEntry("some other key", &entry2)); 1508c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry1->Close(); 1509c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1510c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1511c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NotMarkedButDirty) { 1512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BackendNotMarkedButDirty("dirty_entry"); 1513c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1514c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1515c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionNotMarkedButDirty) { 1516c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetNewEviction(); 1517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BackendNotMarkedButDirty("dirty_entry"); 1518c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1519c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1520c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NotMarkedButDirty2) { 1521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BackendNotMarkedButDirty("dirty_entry2"); 1522c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1523c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1524c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionNotMarkedButDirty2) { 1525c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetNewEviction(); 1526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BackendNotMarkedButDirty("dirty_entry2"); 1527c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1528c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1529c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We want to be able to deal with messed up entries on disk. 1530c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendInvalidRankings2() { 1531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(CopyTestCache("bad_rankings")); 1532c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott FilePath path = GetCacheFilePath(); 1533c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DisableFirstCleanup(); 1534c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1535c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1536c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry *entry1, *entry2; 1537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NE(net::OK, OpenEntry("the first key", &entry1)); 1538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenEntry("some other key", &entry2)); 1539c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry2->Close(); 1540c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1541c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // CheckCacheIntegrity will fail at this point. 1542c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DisableIntegrityCheck(); 1543c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1544c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1545c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, InvalidRankings2) { 1546c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendInvalidRankings2(); 1547c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1548c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1549c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionInvalidRankings2) { 1550c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetNewEviction(); 1551c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendInvalidRankings2(); 1552c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1553c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1554c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// If the LRU is corrupt, we delete the cache. 1555c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendInvalidRankings() { 1556c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry* entry; 1557c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void* iter = NULL; 1558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry)); 1559c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1560c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(2, cache_->GetEntryCount()); 1561c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry)); 1563c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FlushQueueForTest(); // Allow the restart to finish. 1564c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, cache_->GetEntryCount()); 1565c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1566c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1567c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, InvalidRankingsSuccess) { 1568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(CopyTestCache("bad_rankings")); 1569c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DisableFirstCleanup(); 1570c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetDirectMode(); 1571c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1572c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendInvalidRankings(); 1573c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1574c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1575c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionInvalidRankingsSuccess) { 1576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(CopyTestCache("bad_rankings")); 1577c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DisableFirstCleanup(); 1578c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetDirectMode(); 1579c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetNewEviction(); 1580c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1581c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendInvalidRankings(); 1582c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1583c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1584c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, InvalidRankingsFailure) { 1585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(CopyTestCache("bad_rankings")); 1586c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DisableFirstCleanup(); 1587c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetDirectMode(); 1588c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1589c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetTestMode(); // Fail cache reinitialization. 1590c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendInvalidRankings(); 1591c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1592c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1593c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionInvalidRankingsFailure) { 1594c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(CopyTestCache("bad_rankings")); 1595c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DisableFirstCleanup(); 1596c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetDirectMode(); 1597c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetNewEviction(); 1598c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1599c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetTestMode(); // Fail cache reinitialization. 1600c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendInvalidRankings(); 1601c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1602c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1603c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// If the LRU is corrupt and we have open entries, we disable the cache. 1604c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendDisable() { 1605c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry *entry1, *entry2; 1606c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void* iter = NULL; 1607c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry1)); 1608c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry2)); 161021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(0, cache_->GetEntryCount()); 1611c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NE(net::OK, CreateEntry("Something new", &entry2)); 1612c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1613c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry1->Close(); 1614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FlushQueueForTest(); // Flushing the Close posts a task to restart the cache. 1615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FlushQueueForTest(); // This one actually allows that task to complete. 1616c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1617c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, cache_->GetEntryCount()); 1618c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1619c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1620c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, DisableSuccess) { 1621c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(CopyTestCache("bad_rankings")); 1622c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DisableFirstCleanup(); 1623c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetDirectMode(); 1624c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1625c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendDisable(); 1626c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1627c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1628c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionDisableSuccess) { 1629c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(CopyTestCache("bad_rankings")); 1630c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DisableFirstCleanup(); 1631c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetDirectMode(); 1632c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetNewEviction(); 1633c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1634c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendDisable(); 1635c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1636c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1637c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, DisableFailure) { 1638c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(CopyTestCache("bad_rankings")); 1639c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DisableFirstCleanup(); 1640c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetDirectMode(); 1641c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1642c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetTestMode(); // Fail cache reinitialization. 1643c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendDisable(); 1644c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1645c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1646c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionDisableFailure) { 1647c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(CopyTestCache("bad_rankings")); 1648c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DisableFirstCleanup(); 1649c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetDirectMode(); 1650c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetNewEviction(); 1651c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1652c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetTestMode(); // Fail cache reinitialization. 1653c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendDisable(); 1654c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1655c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1656c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This is another type of corruption on the LRU; disable the cache. 1657c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendDisable2() { 1658c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(8, cache_->GetEntryCount()); 1659c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1660c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry* entry; 1661c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void* iter = NULL; 1662c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int count = 0; 1663c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch while (OpenNextEntry(&iter, &entry) == net::OK) { 1664c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(NULL != entry); 1665c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1666c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott count++; 1667c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_LT(count, 9); 1668c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 1669c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1670c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FlushQueueForTest(); 1671c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, cache_->GetEntryCount()); 1672c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1673c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1674c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, DisableSuccess2) { 1675c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(CopyTestCache("list_loop")); 1676c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DisableFirstCleanup(); 1677c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetDirectMode(); 1678c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1679c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendDisable2(); 1680c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1681c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1682c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionDisableSuccess2) { 1683c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(CopyTestCache("list_loop")); 1684c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DisableFirstCleanup(); 1685c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetNewEviction(); 1686c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetDirectMode(); 1687c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1688c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendDisable2(); 1689c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1690c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1691c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, DisableFailure2) { 1692c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(CopyTestCache("list_loop")); 1693c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DisableFirstCleanup(); 1694c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetDirectMode(); 1695c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1696c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetTestMode(); // Fail cache reinitialization. 1697c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendDisable2(); 1698c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1699c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1700c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionDisableFailure2) { 1701c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(CopyTestCache("list_loop")); 1702c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DisableFirstCleanup(); 1703c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetDirectMode(); 1704c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetNewEviction(); 1705c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1706c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetTestMode(); // Fail cache reinitialization. 1707c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendDisable2(); 1708c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1709c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1710c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// If the index size changes when we disable the cache, we should not crash. 1711c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendDisable3() { 1712c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry *entry1, *entry2; 1713c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void* iter = NULL; 1714c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(2, cache_->GetEntryCount()); 1715c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry1)); 1716c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry1->Close(); 1717c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1718c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry2)); 1719c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FlushQueueForTest(); 1720c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1721c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry("Something new", &entry2)); 1722c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry2->Close(); 1723c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1724c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(1, cache_->GetEntryCount()); 1725c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1726c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1727c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, DisableSuccess3) { 1728c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(CopyTestCache("bad_rankings2")); 1729c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DisableFirstCleanup(); 1730c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMaxSize(20 * 1024 * 1024); 1731c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1732c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendDisable3(); 1733c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1734c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1735c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionDisableSuccess3) { 1736c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(CopyTestCache("bad_rankings2")); 1737c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DisableFirstCleanup(); 1738c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMaxSize(20 * 1024 * 1024); 1739c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetNewEviction(); 1740c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1741c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendDisable3(); 1742c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1743c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1744c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// If we disable the cache, already open entries should work as far as possible. 1745c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendDisable4() { 1746c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry *entry1, *entry2, *entry3, *entry4; 1747c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void* iter = NULL; 1748c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry1)); 1749c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1750c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott char key2[2000]; 1751c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott char key3[20000]; 1752c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(key2, sizeof(key2), true); 1753c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(key3, sizeof(key3), true); 1754c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott key2[sizeof(key2) - 1] = '\0'; 1755c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott key3[sizeof(key3) - 1] = '\0'; 1756c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(key2, &entry2)); 1757c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(key3, &entry3)); 1758c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1759c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kBufSize = 20000; 1760513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kBufSize)); 1761c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(buf->data(), 0, kBufSize); 17623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(100, WriteData(entry2, 0, 0, buf, 100, false)); 17633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kBufSize, WriteData(entry3, 0, 0, buf, kBufSize, false)); 1764c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1765c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // This line should disable the cache but not delete it. 1766c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry4)); 176721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(0, cache_->GetEntryCount()); 1768c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1769c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NE(net::OK, CreateEntry("cache is disabled", &entry4)); 1770c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 17713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(100, ReadData(entry2, 0, 0, buf, 100)); 17723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(100, WriteData(entry2, 0, 0, buf, 100, false)); 17733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(100, WriteData(entry2, 1, 0, buf, 100, false)); 1774c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 17753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kBufSize, ReadData(entry3, 0, 0, buf, kBufSize)); 17763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kBufSize, WriteData(entry3, 0, 0, buf, kBufSize, false)); 17773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kBufSize, WriteData(entry3, 1, 0, buf, kBufSize, false)); 1778c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1779c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string key = entry2->GetKey(); 1780c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(sizeof(key2) - 1, key.size()); 1781c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott key = entry3->GetKey(); 1782c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(sizeof(key3) - 1, key.size()); 1783c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1784c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry1->Close(); 1785c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry2->Close(); 1786c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry3->Close(); 1787c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FlushQueueForTest(); // Flushing the Close posts a task to restart the cache. 1788c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FlushQueueForTest(); // This one actually allows that task to complete. 1789c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1790c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, cache_->GetEntryCount()); 1791c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1792c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1793c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, DisableSuccess4) { 1794c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(CopyTestCache("bad_rankings")); 1795c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DisableFirstCleanup(); 1796c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetDirectMode(); 1797c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1798c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendDisable4(); 1799c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1800c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1801c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(DiskCacheBackendTest, NewEvictionDisableSuccess4) { 1802c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(CopyTestCache("bad_rankings")); 1803c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DisableFirstCleanup(); 1804c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetDirectMode(); 1805c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetNewEviction(); 1806c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1807c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendDisable4(); 1808c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1809c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1810c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheTest, Backend_UsageStats) { 1811c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott MessageLoopHelper helper; 1812c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1813c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott FilePath path = GetCacheFilePath(); 1814c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(DeleteCache(path)); 1815c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott scoped_ptr<disk_cache::BackendImpl> cache; 1816c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cache.reset(new disk_cache::BackendImpl( 18173f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen path, base::MessageLoopProxy::CreateForCurrentThread(), 18183f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen NULL)); 1819c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(NULL != cache.get()); 1820c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cache->SetUnitTestMode(); 1821c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, cache->SyncInit()); 1822c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1823c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Wait for a callback that never comes... about 2 secs :). The message loop 1824c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // has to run to allow invocation of the usage timer. 1825c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott helper.WaitUntilCacheIoFinished(1); 1826c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1827c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1828c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendDoomAll() { 1829c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1830c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Time initial = Time::Now(); 1831c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1832c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry *entry1, *entry2; 1833c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry("first", &entry1)); 1834c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry("second", &entry2)); 1835c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry1->Close(); 1836c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry2->Close(); 1837c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1838c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry("third", &entry1)); 1839c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry("fourth", &entry2)); 1840c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1841c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_EQ(4, cache_->GetEntryCount()); 1842c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(net::OK, DoomAllEntries()); 1843c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_EQ(0, cache_->GetEntryCount()); 1844c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1845c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We should stop posting tasks at some point (if we post any). 1846c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->RunAllPending(); 1847c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1848c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry *entry3, *entry4; 1849c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry("third", &entry3)); 1850c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry("fourth", &entry4)); 1851c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1852c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(net::OK, DoomAllEntries()); 1853c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_EQ(0, cache_->GetEntryCount()); 1854c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1855c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry1->Close(); 1856c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry2->Close(); 1857c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry3->Doom(); // The entry should be already doomed, but this must work. 1858c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry3->Close(); 1859c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry4->Close(); 1860c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1861c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Now try with all references released. 1862c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry("third", &entry1)); 1863c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry("fourth", &entry2)); 1864c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry1->Close(); 1865c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry2->Close(); 1866c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1867c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_EQ(2, cache_->GetEntryCount()); 1868c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(net::OK, DoomAllEntries()); 1869c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_EQ(0, cache_->GetEntryCount()); 1870c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1871c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1872c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, DoomAll) { 1873c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendDoomAll(); 1874c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1875c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1876c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionDoomAll) { 1877c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetNewEviction(); 1878c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendDoomAll(); 1879c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1880c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1881c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, MemoryOnlyDoomAll) { 1882c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMemoryOnlyMode(); 1883c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendDoomAll(); 1884c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1885c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 18863345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheBackendTest, AppCacheOnlyDoomAll) { 18873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetCacheType(net::APP_CACHE); 18883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick BackendDoomAll(); 18893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 18903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1891c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// If the index size changes when we doom the cache, we should not crash. 1892c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendDoomAll2() { 1893c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(2, cache_->GetEntryCount()); 1894c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(net::OK, DoomAllEntries()); 1895c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1896c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry* entry; 1897c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry("Something new", &entry)); 1898c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1899c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1900c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(1, cache_->GetEntryCount()); 1901c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1902c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1903c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, DoomAll2) { 1904c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(CopyTestCache("bad_rankings2")); 1905c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DisableFirstCleanup(); 1906c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMaxSize(20 * 1024 * 1024); 1907c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1908c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendDoomAll2(); 1909c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1910c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1911c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionDoomAll2) { 1912c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(CopyTestCache("bad_rankings2")); 1913c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DisableFirstCleanup(); 1914c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMaxSize(20 * 1024 * 1024); 1915c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetNewEviction(); 1916c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1917c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendDoomAll2(); 1918c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1919c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1920c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We should be able to create the same entry on multiple simultaneous instances 1921c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// of the cache. 1922c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheTest, MultipleInstances) { 1923c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ScopedTestCache store1; 1924c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ScopedTestCache store2("cache_test2"); 1925c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ScopedTestCache store3("cache_test3"); 1926c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Thread cache_thread("CacheThread"); 1927c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(cache_thread.StartWithOptions( 1928c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Thread::Options(MessageLoop::TYPE_IO, 0))); 1929c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestCompletionCallback cb; 1930c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1931c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kNumberOfCaches = 2; 1932c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch disk_cache::Backend* cache[kNumberOfCaches]; 1933c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1934c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int rv = disk_cache::BackendImpl::CreateBackend( 1935c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch store1.path(), false, 0, net::DISK_CACHE, disk_cache::kNone, 19363f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen cache_thread.message_loop_proxy(), NULL, &cache[0], &cb); 1937c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, cb.GetResult(rv)); 1938c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = disk_cache::BackendImpl::CreateBackend( 1939c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch store2.path(), false, 0, net::MEDIA_CACHE, disk_cache::kNone, 19403f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen cache_thread.message_loop_proxy(), NULL, &cache[1], &cb); 1941c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, cb.GetResult(rv)); 1942c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1943c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(cache[0] != NULL && cache[1] != NULL); 1944c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1945c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string key("the first key"); 1946c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry* entry; 1947c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < kNumberOfCaches; i++) { 1948c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = cache[i]->CreateEntry(key, &entry, &cb); 1949c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, cb.GetResult(rv)); 1950c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1951c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1952c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete cache[0]; 1953c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete cache[1]; 1954c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1955c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1956c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test the six regions of the curve that determines the max cache size. 1957c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheTest, AutomaticMaxSize) { 1958c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kDefaultSize = 80 * 1024 * 1024; 1959c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int64 large_size = kDefaultSize; 1960c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 largest_size = kint32max; 1961c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1962c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Region 1: expected = available * 0.8 1963c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ((kDefaultSize - 1) * 8 / 10, 1964c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch disk_cache::PreferedCacheSize(large_size - 1)); 1965c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(kDefaultSize * 8 / 10, 1966c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch disk_cache::PreferedCacheSize(large_size)); 1967c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(kDefaultSize - 1, 1968c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch disk_cache::PreferedCacheSize(large_size * 10 / 8 - 1)); 1969c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1970c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Region 2: expected = default_size 1971c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(kDefaultSize, 1972c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch disk_cache::PreferedCacheSize(large_size * 10 / 8)); 1973c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(kDefaultSize, 1974c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch disk_cache::PreferedCacheSize(large_size * 10 - 1)); 1975c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1976c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Region 3: expected = available * 0.1 1977c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(kDefaultSize, 1978c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch disk_cache::PreferedCacheSize(large_size * 10)); 1979c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ((kDefaultSize * 25 - 1) / 10, 1980c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch disk_cache::PreferedCacheSize(large_size * 25 - 1)); 1981c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1982c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Region 4: expected = default_size * 2.5 1983c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(kDefaultSize * 25 / 10, 1984c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch disk_cache::PreferedCacheSize(large_size * 25)); 1985c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(kDefaultSize * 25 / 10, 1986c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch disk_cache::PreferedCacheSize(large_size * 100 - 1)); 1987c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(kDefaultSize * 25 / 10, 1988c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch disk_cache::PreferedCacheSize(large_size * 100)); 1989c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(kDefaultSize * 25 / 10, 1990c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch disk_cache::PreferedCacheSize(large_size * 250 - 1)); 1991c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1992c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Region 5: expected = available * 0.1 1993c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(kDefaultSize * 25 / 10, 1994c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch disk_cache::PreferedCacheSize(large_size * 250)); 1995c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(kint32max - 1, 1996c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch disk_cache::PreferedCacheSize(largest_size * 100 - 1)); 1997c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1998c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Region 6: expected = kint32max 1999c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(kint32max, 2000c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch disk_cache::PreferedCacheSize(largest_size * 100)); 2001c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(kint32max, 2002c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch disk_cache::PreferedCacheSize(largest_size * 10000)); 2003c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 2004c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2005c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that we can "migrate" a running instance from one experiment group to 2006c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// another. 2007c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(DiskCacheBackendTest, Histograms) { 2008c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetDirectMode(); 2009c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitCache(); 2010c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch disk_cache::BackendImpl* backend_ = cache_impl_; // Needed be the macro. 2011c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2012c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (int i = 1; i < 3; i++) { 2013c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CACHE_UMA(HOURS, "FillupTime", i, 28); 2014c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 2015c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 20163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 20173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Make sure that we keep the total memory used by the internal buffers under 20183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// control. 20193345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheBackendTest, TotalBuffersSize1) { 20203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetDirectMode(); 20213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick InitCache(); 20223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string key("the first key"); 20233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick disk_cache::Entry* entry; 20243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 20253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 20263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const int kSize = 200; 2027513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); 20283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CacheTestFillBuffer(buffer->data(), kSize, true); 20293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 20303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick for (int i = 0; i < 10; i++) { 20313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SCOPED_TRACE(i); 20323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Allocate 2MB for this entry. 20333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, true)); 20343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteData(entry, 1, 0, buffer, kSize, true)); 20353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteData(entry, 0, 1024 * 1024, buffer, kSize, false)); 20363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteData(entry, 1, 1024 * 1024, buffer, kSize, false)); 20373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 20383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Delete one of the buffers and truncate the other. 20393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, WriteData(entry, 0, 0, buffer, 0, true)); 20403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, WriteData(entry, 1, 10, buffer, 0, true)); 20413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 20423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Delete the second buffer, writing 10 bytes to disk. 20433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 20443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 20453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 20463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 20473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 20483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, cache_impl_->GetTotalBuffersSize()); 20493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 20503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 20513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// This test assumes at least 150MB of system memory. 20523345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheBackendTest, TotalBuffersSize2) { 20533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetDirectMode(); 20543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick InitCache(); 20553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 20563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const int kOneMB = 1024 * 1024; 20573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(cache_impl_->IsAllocAllowed(0, kOneMB)); 20583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kOneMB, cache_impl_->GetTotalBuffersSize()); 20593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 20603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(cache_impl_->IsAllocAllowed(0, kOneMB)); 20613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kOneMB * 2, cache_impl_->GetTotalBuffersSize()); 20623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 20633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(cache_impl_->IsAllocAllowed(0, kOneMB)); 20643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kOneMB * 3, cache_impl_->GetTotalBuffersSize()); 20653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 20663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick cache_impl_->BufferDeleted(kOneMB); 20673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kOneMB * 2, cache_impl_->GetTotalBuffersSize()); 20683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 20693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Check the upper limit. 20703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_FALSE(cache_impl_->IsAllocAllowed(0, 30 * kOneMB)); 20713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 20723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick for (int i = 0; i < 30; i++) 20733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick cache_impl_->IsAllocAllowed(0, kOneMB); // Ignore the result. 20743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 20753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_FALSE(cache_impl_->IsAllocAllowed(0, kOneMB)); 20763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 20773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 20783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Tests that sharing of external files works and we are able to delete the 20793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// files when we need to. 20803345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheBackendTest, FileSharing) { 20813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetDirectMode(); 20823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick InitCache(); 20833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 20843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick disk_cache::Addr address(0x80000001); 20853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(cache_impl_->CreateExternalFile(&address)); 20863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick FilePath name = cache_impl_->GetFileName(address); 20873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 20883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_refptr<disk_cache::File> file(new disk_cache::File(false)); 20893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick file->Init(name); 20903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 20913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OS_WIN) 20923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DWORD sharing = FILE_SHARE_READ | FILE_SHARE_WRITE; 20933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DWORD access = GENERIC_READ | GENERIC_WRITE; 20943f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen base::win::ScopedHandle file2(CreateFile( 20953f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen name.value().c_str(), access, sharing, NULL, OPEN_EXISTING, 0, NULL)); 20963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_FALSE(file2.IsValid()); 20973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 20983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick sharing |= FILE_SHARE_DELETE; 20993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick file2.Set(CreateFile(name.value().c_str(), access, sharing, NULL, 21003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick OPEN_EXISTING, 0, NULL)); 21013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(file2.IsValid()); 21023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif 21033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 21043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(file_util::Delete(name, false)); 21053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 21063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // We should be able to use the file. 21073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const int kSize = 200; 21083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick char buffer1[kSize]; 21093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick char buffer2[kSize]; 21103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick memset(buffer1, 't', kSize); 21113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick memset(buffer2, 0, kSize); 21123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(file->Write(buffer1, kSize, 0)); 21133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(file->Read(buffer2, kSize, 0)); 21143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, memcmp(buffer1, buffer2, kSize)); 21153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 21163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(disk_cache::DeleteCacheFile(name)); 21173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 2118