Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(106)

Unified Diff: net/disk_cache/backend_unittest.cc

Issue 15203004: Disk cache: Reference CL for the implementation of file format version 3. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/disk_cache/backend_impl.cc ('k') | net/disk_cache/block_files.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/disk_cache/backend_unittest.cc
===================================================================
--- net/disk_cache/backend_unittest.cc (revision 199883)
+++ net/disk_cache/backend_unittest.cc (working copy)
@@ -45,6 +45,8 @@
void BackendSetSize();
void BackendLoad();
void BackendChain();
+ void BucketUse();
+ void BackendNewEvictionTrim();
void BackendValidEntry();
void BackendInvalidEntry();
void BackendInvalidEntryRead();
@@ -83,6 +85,9 @@
void BackendDisable2();
void BackendDisable3();
void BackendDisable4();
+ void BackendTotalBuffersSize1();
+ void BackendTotalBuffersSize2();
+ void BackendUpdateRankForExternalCacheHit();
void TracingBackendBasics();
};
@@ -99,7 +104,7 @@
ASSERT_TRUE(NULL != entry1);
entry1->Close();
entry1 = NULL;
-
+
EXPECT_NE(net::OK, CreateEntry("the first key", &entry1));
ASSERT_EQ(net::OK, OpenEntry("the first key", &entry1));
EXPECT_NE(net::OK, OpenEntry("some other key", &entry2));
@@ -156,6 +161,11 @@
BackendBasics();
}
+TEST_F(DiskCacheBackendTest, V3Basics) {
+ UseVersion3();
+ BackendBasics();
+}
+
void DiskCacheBackendTest::BackendKeying() {
InitCache();
const char* kName1 = "the first key";
@@ -201,11 +211,22 @@
BackendKeying();
}
+TEST_F(DiskCacheBackendTest, V3Keying) {
+ UseVersion3();
+ BackendKeying();
+}
+
TEST_F(DiskCacheBackendTest, NewEvictionKeying) {
SetNewEviction();
BackendKeying();
}
+TEST_F(DiskCacheBackendTest, V3NewEvictionKeying) {
+ UseVersion3();
+ SetNewEviction();
+ BackendKeying();
+}
+
TEST_F(DiskCacheBackendTest, MemoryOnlyKeying) {
SetMemoryOnlyMode();
BackendKeying();
@@ -315,12 +336,12 @@
ASSERT_TRUE(cache_thread.StartWithOptions(
base::Thread::Options(MessageLoop::TYPE_IO, 0)));
- uint32 flags = disk_cache::kNoBuffering;
- if (!fast)
- flags |= disk_cache::kNoRandom;
+ if (fast)
+ AvoidTestFlag();
UseCurrentThread();
- CreateBackend(flags, NULL);
+ CreateBackend(NULL);
+ SetNoBuffering();
disk_cache::EntryImpl* entry;
rv = cache_->CreateEntry(
@@ -392,11 +413,11 @@
ASSERT_TRUE(cache_thread.StartWithOptions(
base::Thread::Options(MessageLoop::TYPE_IO, 0)));
- uint32 flags = disk_cache::kNoBuffering;
- if (!fast)
- flags |= disk_cache::kNoRandom;
+ if (fast)
+ AvoidTestFlag();
- CreateBackend(flags, &cache_thread);
+ CreateBackend(&cache_thread);
+ SetNoBuffering();
disk_cache::Entry* entry;
int rv = cache_->CreateEntry("some key", &entry, cb.callback());
@@ -435,9 +456,9 @@
ASSERT_TRUE(cache_thread.StartWithOptions(
base::Thread::Options(MessageLoop::TYPE_IO, 0)));
- disk_cache::BackendFlags flags =
- fast ? disk_cache::kNone : disk_cache::kNoRandom;
- CreateBackend(flags, &cache_thread);
+ if (fast)
+ AvoidTestFlag();
+ CreateBackend(&cache_thread);
disk_cache::Entry* entry;
int rv = cache_->CreateEntry("some key", &entry, cb.callback());
@@ -523,17 +544,20 @@
false));
disk_cache::Entry* entry2;
- ASSERT_EQ(net::OK, CreateEntry("an extra key", &entry2));
+ std::string extra_key("an extra key");
+ ASSERT_EQ(net::OK, CreateEntry(extra_key, &entry2));
EXPECT_EQ(cache_size / 10, WriteData(entry2, 0, 0, buffer, cache_size / 10,
false));
entry2->Close(); // This will trigger the cache trim.
+ WaitForEntryToClose(extra_key);
- EXPECT_NE(net::OK, OpenEntry(first, &entry2));
-
FlushQueueForTest(); // Make sure that we are done trimming the cache.
FlushQueueForTest(); // We may have posted two tasks to evict stuff.
entry->Close();
+ WaitForEntryToClose(second);
+
+ EXPECT_NE(net::OK, OpenEntry(first, &entry2));
ASSERT_EQ(net::OK, OpenEntry(second, &entry));
EXPECT_EQ(cache_size / 10, entry->GetDataSize(0));
entry->Close();
@@ -543,11 +567,24 @@
BackendSetSize();
}
+TEST_F(DiskCacheBackendTest, V3SetSize) {
+ UseVersion3();
+ UseVersion3();
+ SetNewEviction();
+ BackendSetSize();
+}
+
TEST_F(DiskCacheBackendTest, NewEvictionSetSize) {
SetNewEviction();
BackendSetSize();
}
+TEST_F(DiskCacheBackendTest, V3NewEvictionSetSize) {
+ UseVersion3();
+ SetNewEviction();
+ BackendSetSize();
+}
+
TEST_F(DiskCacheBackendTest, MemoryOnlySetSize) {
SetMemoryOnlyMode();
BackendSetSize();
@@ -654,7 +691,102 @@
BackendChain();
}
-TEST_F(DiskCacheBackendTest, NewEvictionTrim) {
+// Tests the proper use of cell buckets while the index grow.
+void DiskCacheBackendTest::BucketUse() {
+ UseVersion3();
+ InitCache();
+ const int kNumEntries = 20;
+ disk_cache::Entry* entries[kNumEntries];
+ std::string key("The first key");
+
+ // This generates kNumEntries collisions so the extra table has to be used.
+ // There are only 2 extra buckets on the test setup, so the index has to grow.
+ for (int i = 0; i < kNumEntries; i++) {
+ ASSERT_EQ(net::OK, CreateEntry(key, &entries[i]));
+ entries[i]->Doom();
+ FlushQueueForTest();
+ }
+
+ for (int i = 0; i < kNumEntries / 2; i++)
+ entries[i]->Close();
+
+ for (int i = 0; i < kNumEntries / 2; i++) {
+ ASSERT_EQ(net::OK, CreateEntry(key, &entries[i]));
+ entries[i]->Doom();
+ }
+
+ for (int i = 0; i < kNumEntries; i++)
+ entries[i]->Close();
+}
+
+TEST_F(DiskCacheBackendTest, V3BucketUse) {
+ BucketUse();
+}
+
+TEST_F(DiskCacheBackendTest, V3DoubleIndexBucketUse) {
+ PresetTestMode(); // Doubles the index instead of a slow growth.
+ BucketUse();
+}
+
+TEST_F(DiskCacheBackendTest, V3DoubleIndex) {
+ UseVersion3();
+ PresetTestMode();
+ InitCache();
+
+ disk_cache::Entry* entry;
+ const int kNumEntries = 200;
+ for (int i = 0; i < kNumEntries; i++) {
+ std::string name(base::StringPrintf("Key %d", i));
+ ASSERT_EQ(net::OK, CreateEntry(name, &entry));
+ entry->Close();
+ FlushQueueForTest();
+ }
+
+ // Generate enough collisions to force growing the extra table (and with it,
+ // the index).
+ const int kNumSavedEntries = 5;
+ disk_cache::Entry* entries[kNumSavedEntries];
+ std::string key("The first key");
+ for (int i = 0; i < kNumSavedEntries; i++) {
+ ASSERT_EQ(net::OK, CreateEntry(key, &entries[i]));
+ entries[i]->Doom();
+ FlushQueueForTest();
+ }
+
+ for (int i = 0; i < kNumSavedEntries; i++)
+ entries[i]->Close();
+
+ // Verify that all entries are there.
+ for (int i = 0; i < kNumEntries; i++) {
+ std::string name(base::StringPrintf("Key %d", i));
+ ASSERT_EQ(net::OK, OpenEntry(name, &entry));
+ entry->Close();
+ }
+}
+
+// This test leaks memory because it simulates a crash.
+TEST_F(DiskCacheBackendTest, DISABLED_V3Backup) {
+ UseVersion3();
+ PresetTestMode();
+ InitCache();
+
+ disk_cache::Entry* entry;
+ std::string name1("First entry");
+ ASSERT_EQ(net::OK, CreateEntry(name1, &entry));
+ entry->Close();
+ WaitForEntryToClose(name1);
+ AddDelayForTest(40);
+
+ std::string name2("Another entry");
+ ASSERT_EQ(net::OK, CreateEntry(name2, &entry));
+
+ SimulateCrash();
+ EXPECT_EQ(net::OK, OpenEntry(name1, &entry));
+ entry->Close();
+ EXPECT_NE(net::OK, OpenEntry(name2, &entry));
+}
+
+void DiskCacheBackendTest::BackendNewEvictionTrim() {
SetNewEviction();
InitCache();
@@ -668,6 +800,13 @@
ASSERT_EQ(net::OK, OpenEntry(name, &entry));
entry->Close();
}
+ if (!(i % 10))
+ FlushQueueForTest();
+
+ if (i == 0 || i == 90) {
+ WaitForEntryToClose(name);
+ AddDelayForTest(70);
+ }
}
// The first eviction must come from list 1 (10% limit), the second must come
@@ -684,6 +823,15 @@
entry->Close();
}
+TEST_F(DiskCacheBackendTest, NewEvictionTrim) {
+ BackendNewEvictionTrim();
+}
+
+TEST_F(DiskCacheBackendTest, V3NewEvictionTrim) {
+ UseVersion3();
+ BackendNewEvictionTrim();
+}
+
// Before looking for invalid entries, let's check a valid entry.
void DiskCacheBackendTest::BackendValidEntry() {
InitCache();
@@ -1018,6 +1166,8 @@
disk_cache::Entry* entry;
ASSERT_EQ(net::OK, CreateEntry(key, &entry));
entry->Close();
+ if (!(i % 10))
+ FlushQueueForTest();
}
EXPECT_EQ(kNumEntries, cache_->GetEntryCount());
Time final = Time::Now();
@@ -1060,11 +1210,22 @@
BackendEnumerations();
}
+TEST_F(DiskCacheBackendTest, V3Enumerations) {
+ UseVersion3();
+ BackendEnumerations();
+}
+
TEST_F(DiskCacheBackendTest, NewEvictionEnumerations) {
SetNewEviction();
BackendEnumerations();
}
+TEST_F(DiskCacheBackendTest, V3NewEvictionEnumerations) {
+ UseVersion3();
+ SetNewEviction();
+ BackendEnumerations();
+}
+
TEST_F(DiskCacheBackendTest, MemoryOnlyEnumerations) {
SetMemoryOnlyMode();
BackendEnumerations();
@@ -1093,7 +1254,7 @@
FlushQueueForTest();
// Make sure that the timestamp is not the same.
- AddDelay();
+ AddDelayForTest(70);
ASSERT_EQ(net::OK, OpenEntry(second, &entry1));
void* iter = NULL;
ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry2));
@@ -1129,11 +1290,22 @@
BackendEnumerations2();
}
+TEST_F(DiskCacheBackendTest, V3Enumerations2) {
+ UseVersion3();
+ BackendEnumerations2();
+}
+
TEST_F(DiskCacheBackendTest, NewEvictionEnumerations2) {
SetNewEviction();
BackendEnumerations2();
}
+TEST_F(DiskCacheBackendTest, V3NewEvictionEnumerations2) {
+ UseVersion3();
+ SetNewEviction();
+ BackendEnumerations2();
+}
+
TEST_F(DiskCacheBackendTest, MemoryOnlyEnumerations2) {
SetMemoryOnlyMode();
BackendEnumerations2();
@@ -1307,8 +1479,8 @@
entry->Close();
FlushQueueForTest();
- AddDelay();
- Time middle = Time::Now();
+ AddDelayForTest(70);
+ Time middle = GetCurrentTime();
ASSERT_EQ(net::OK, CreateEntry("third", &entry));
entry->Close();
@@ -1316,8 +1488,8 @@
entry->Close();
FlushQueueForTest();
- AddDelay();
- Time final = Time::Now();
+ AddDelayForTest(70);
+ Time final = GetCurrentTime();
ASSERT_EQ(4, cache_->GetEntryCount());
EXPECT_EQ(net::OK, DoomEntriesSince(final));
@@ -1334,11 +1506,22 @@
BackendDoomRecent();
}
+TEST_F(DiskCacheBackendTest, V3DoomRecent) {
+ UseVersion3();
+ BackendDoomRecent();
+}
+
TEST_F(DiskCacheBackendTest, NewEvictionDoomRecent) {
SetNewEviction();
BackendDoomRecent();
}
+TEST_F(DiskCacheBackendTest, V3NewEvictionDoomRecent) {
+ UseVersion3();
+ SetNewEviction();
+ BackendDoomRecent();
+}
+
TEST_F(DiskCacheBackendTest, MemoryOnlyDoomRecent) {
SetMemoryOnlyMode();
BackendDoomRecent();
@@ -1426,6 +1609,17 @@
EXPECT_EQ(3, cache_->GetEntryCount());
}
+TEST_F(DiskCacheBackendTest, V3DoomEntriesSinceSparse) {
+ base::Time start;
+ UseVersion3();
+ InitSparseCache(&start, NULL);
+ DoomEntriesSince(start);
+ // NOTE: BackendImpl counts child entries in its GetEntryCount(), while
+ // MemBackendImpl does not. Thats why expected value differs here from
+ // MemoryOnlyDoomEntriesSinceSparse.
+ EXPECT_EQ(3, cache_->GetEntryCount());
+}
+
TEST_F(DiskCacheBackendTest, MemoryOnlyDoomAllSparse) {
SetMemoryOnlyMode();
InitSparseCache(NULL, NULL);
@@ -1439,6 +1633,13 @@
EXPECT_EQ(0, cache_->GetEntryCount());
}
+TEST_F(DiskCacheBackendTest, V3DoomAllSparse) {
+ UseVersion3();
+ InitSparseCache(NULL, NULL);
+ EXPECT_EQ(net::OK, DoomAllEntries());
+ EXPECT_EQ(0, cache_->GetEntryCount());
+}
+
void DiskCacheBackendTest::BackendDoomBetween() {
InitCache();
@@ -1486,11 +1687,22 @@
BackendDoomBetween();
}
+TEST_F(DiskCacheBackendTest, V3DoomBetween) {
+ UseVersion3();
+ BackendDoomBetween();
+}
+
TEST_F(DiskCacheBackendTest, NewEvictionDoomBetween) {
SetNewEviction();
BackendDoomBetween();
}
+TEST_F(DiskCacheBackendTest, V3NewEvictionDoomBetween) {
+ UseVersion3();
+ SetNewEviction();
+ BackendDoomBetween();
+}
+
TEST_F(DiskCacheBackendTest, MemoryOnlyDoomBetween) {
SetMemoryOnlyMode();
BackendDoomBetween();
@@ -1521,6 +1733,19 @@
EXPECT_EQ(3, cache_->GetEntryCount());
}
+TEST_F(DiskCacheBackendTest, V3DoomEntriesBetweenSparse) {
+ base::Time start, end;
+ UseVersion3();
+ InitSparseCache(&start, &end);
+ DoomEntriesBetween(start, end);
+ EXPECT_EQ(9, cache_->GetEntryCount());
+
+ start = end;
+ end = base::Time::Now();
+ DoomEntriesBetween(start, end);
+ EXPECT_EQ(3, cache_->GetEntryCount());
+}
+
void DiskCacheBackendTest::BackendTransaction(const std::string& name,
int num_entries, bool load) {
success_ = false;
@@ -2514,11 +2739,22 @@
BackendDoomAll();
}
+TEST_F(DiskCacheBackendTest, V3DoomAll) {
+ UseVersion3();
+ BackendDoomAll();
+}
+
TEST_F(DiskCacheBackendTest, NewEvictionDoomAll) {
SetNewEviction();
BackendDoomAll();
}
+TEST_F(DiskCacheBackendTest, V3NewEvictionDoomAll) {
+ UseVersion3();
+ SetNewEviction();
+ BackendDoomAll();
+}
+
TEST_F(DiskCacheBackendTest, MemoryOnlyDoomAll) {
SetMemoryOnlyMode();
BackendDoomAll();
@@ -2662,7 +2898,7 @@
// Make sure that we keep the total memory used by the internal buffers under
// control.
-TEST_F(DiskCacheBackendTest, TotalBuffersSize1) {
+void DiskCacheBackendTest::BackendTotalBuffersSize1() {
InitCache();
std::string key("the first key");
disk_cache::Entry* entry;
@@ -2690,35 +2926,53 @@
}
entry->Close();
- EXPECT_EQ(0, cache_impl_->GetTotalBuffersSize());
+ EXPECT_EQ(0, GetTotalBuffersSize());
}
+TEST_F(DiskCacheBackendTest, TotalBuffersSize1) {
+ BackendTotalBuffersSize1();
+}
+
+TEST_F(DiskCacheBackendTest, V3TotalBuffersSize1) {
+ UseVersion3();
+ BackendTotalBuffersSize1();
+}
+
// This test assumes at least 150MB of system memory.
-TEST_F(DiskCacheBackendTest, TotalBuffersSize2) {
+void DiskCacheBackendTest::BackendTotalBuffersSize2() {
InitCache();
const int kOneMB = 1024 * 1024;
- EXPECT_TRUE(cache_impl_->IsAllocAllowed(0, kOneMB));
- EXPECT_EQ(kOneMB, cache_impl_->GetTotalBuffersSize());
+ EXPECT_TRUE(IsAllocAllowed(0, kOneMB));
+ EXPECT_EQ(kOneMB, GetTotalBuffersSize());
- EXPECT_TRUE(cache_impl_->IsAllocAllowed(0, kOneMB));
- EXPECT_EQ(kOneMB * 2, cache_impl_->GetTotalBuffersSize());
+ EXPECT_TRUE(IsAllocAllowed(0, kOneMB));
+ EXPECT_EQ(kOneMB * 2, GetTotalBuffersSize());
- EXPECT_TRUE(cache_impl_->IsAllocAllowed(0, kOneMB));
- EXPECT_EQ(kOneMB * 3, cache_impl_->GetTotalBuffersSize());
+ EXPECT_TRUE(IsAllocAllowed(0, kOneMB));
+ EXPECT_EQ(kOneMB * 3, GetTotalBuffersSize());
- cache_impl_->BufferDeleted(kOneMB);
- EXPECT_EQ(kOneMB * 2, cache_impl_->GetTotalBuffersSize());
+ BufferDeleted(kOneMB);
+ EXPECT_EQ(kOneMB * 2, GetTotalBuffersSize());
// Check the upper limit.
- EXPECT_FALSE(cache_impl_->IsAllocAllowed(0, 30 * kOneMB));
+ EXPECT_FALSE(IsAllocAllowed(0, 30 * kOneMB));
for (int i = 0; i < 30; i++)
- cache_impl_->IsAllocAllowed(0, kOneMB); // Ignore the result.
+ IsAllocAllowed(0, kOneMB); // Ignore the result.
- EXPECT_FALSE(cache_impl_->IsAllocAllowed(0, kOneMB));
+ EXPECT_FALSE(IsAllocAllowed(0, kOneMB));
}
+TEST_F(DiskCacheBackendTest, TotalBuffersSize2) {
+ BackendTotalBuffersSize2();
+}
+
+TEST_F(DiskCacheBackendTest, V3TotalBuffersSize2) {
+ UseVersion3();
+ BackendTotalBuffersSize2();
+}
+
// Tests that sharing of external files works and we are able to delete the
// files when we need to.
TEST_F(DiskCacheBackendTest, FileSharing) {
@@ -2759,7 +3013,7 @@
EXPECT_TRUE(disk_cache::DeleteCacheFile(name));
}
-TEST_F(DiskCacheBackendTest, UpdateRankForExternalCacheHit) {
+void DiskCacheBackendTest::BackendUpdateRankForExternalCacheHit() {
InitCache();
disk_cache::Entry* entry;
@@ -2768,40 +3022,41 @@
std::string key = base::StringPrintf("key%d", i);
ASSERT_EQ(net::OK, CreateEntry(key, &entry));
entry->Close();
+ AddDelayForTest(70);
}
+ FlushQueueForTest();
// Ping the oldest entry.
+ SetTestMode();
cache_->OnExternalCacheHit("key0");
+ FlushQueueForTest();
TrimForTest(false);
// Make sure the older key remains.
- EXPECT_EQ(1, cache_->GetEntryCount());
+ EXPECT_NE(net::OK, OpenEntry("key1", &entry));
ASSERT_EQ(net::OK, OpenEntry("key0", &entry));
entry->Close();
}
+TEST_F(DiskCacheBackendTest, UpdateRankForExternalCacheHit) {
+ BackendUpdateRankForExternalCacheHit();
+}
+
+TEST_F(DiskCacheBackendTest, V3UpdateRankForExternalCacheHit) {
+ UseVersion3();
+ BackendUpdateRankForExternalCacheHit();
+}
+
TEST_F(DiskCacheBackendTest, ShaderCacheUpdateRankForExternalCacheHit) {
SetCacheType(net::SHADER_CACHE);
- InitCache();
+ BackendUpdateRankForExternalCacheHit();
+}
- disk_cache::Entry* entry;
-
- for (int i = 0; i < 2; ++i) {
- std::string key = base::StringPrintf("key%d", i);
- ASSERT_EQ(net::OK, CreateEntry(key, &entry));
- entry->Close();
- }
-
- // Ping the oldest entry.
- cache_->OnExternalCacheHit("key0");
-
- TrimForTest(false);
-
- // Make sure the older key remains.
- EXPECT_EQ(1, cache_->GetEntryCount());
- ASSERT_EQ(net::OK, OpenEntry("key0", &entry));
- entry->Close();
+TEST_F(DiskCacheBackendTest, V3ShaderCacheUpdateRankForExternalCacheHit) {
+ UseVersion3();
+ SetCacheType(net::SHADER_CACHE);
+ BackendUpdateRankForExternalCacheHit();
}
void DiskCacheBackendTest::TracingBackendBasics() {
« no previous file with comments | « net/disk_cache/backend_impl.cc ('k') | net/disk_cache/block_files.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698