Index: net/disk_cache/entry_unittest.cc |
=================================================================== |
--- net/disk_cache/entry_unittest.cc (revision 20076) |
+++ net/disk_cache/entry_unittest.cc (working copy) |
@@ -38,6 +38,7 @@ |
void BasicSparseIO(bool async); |
void HugeSparseIO(bool async); |
void GetAvailableRange(); |
+ void DoomSparseEntry(); |
}; |
void DiskCacheEntryTest::InternalSyncIO() { |
@@ -826,7 +827,7 @@ |
// Test that child entries in a memory cache backend are not visible from |
// enumerations. |
-TEST_F(DiskCacheEntryTest, MemoryOnlyEnumerationWithSlaveEntries) { |
+TEST_F(DiskCacheEntryTest, MemoryOnlyEnumerationWithSparseEntries) { |
SetMemoryOnlyMode(); |
InitCache(); |
@@ -1128,3 +1129,59 @@ |
entry->Close(); |
} |
+ |
+void DiskCacheEntryTest::DoomSparseEntry() { |
+ std::string key1("the first key"); |
+ std::string key2("the second key"); |
+ disk_cache::Entry *entry1, *entry2; |
+ ASSERT_TRUE(cache_->CreateEntry(key1, &entry1)); |
+ ASSERT_TRUE(cache_->CreateEntry(key2, &entry2)); |
+ |
+ const int kSize = 4 * 1024; |
+ scoped_refptr<net::IOBuffer> buf = new net::IOBuffer(kSize); |
+ CacheTestFillBuffer(buf->data(), kSize, false); |
+ |
+ int64 offset = 1024; |
+ // Write to a bunch of ranges. |
+ for (int i = 0; i < 12; i++) { |
+ EXPECT_EQ(kSize, entry1->WriteSparseData(offset, buf, kSize, NULL)); |
+ // Keep the second map under the default size. |
+ if (i < 9) |
+ EXPECT_EQ(kSize, entry2->WriteSparseData(offset, buf, kSize, NULL)); |
+ offset *= 4; |
+ } |
+ |
+ if (memory_only_) |
+ EXPECT_EQ(2, cache_->GetEntryCount()); |
+ else |
+ EXPECT_EQ(15, cache_->GetEntryCount()); |
+ |
+ // Doom the first entry while it's still open. |
+ entry1->Doom(); |
+ entry1->Close(); |
+ entry2->Close(); |
+ |
+ // Doom the second entry after it's fully saved. |
+ EXPECT_TRUE(cache_->DoomEntry(key2)); |
+ |
+ // Make sure we do all needed work. This may fail for entry2 if between Close |
+ // and DoomEntry the system decides to remove all traces of the file from the |
+ // system cache so we don't see that there is pending IO. |
+ MessageLoop::current()->RunAllPending(); |
+ |
+ if (memory_only_) |
+ EXPECT_EQ(0, cache_->GetEntryCount()); |
+ else |
+ EXPECT_EQ(0, cache_->GetEntryCount()); |
+} |
+ |
+TEST_F(DiskCacheEntryTest, DoomSparseEntry) { |
+ InitCache(); |
+ DoomSparseEntry(); |
+} |
+ |
+TEST_F(DiskCacheEntryTest, DISABLED_MemoryOnlyDoomSparseEntry) { |
+ SetMemoryOnlyMode(); |
+ InitCache(); |
+ DoomSparseEntry(); |
+} |