diff options
author | rvargas@google.com <rvargas@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-01-25 23:52:02 +0000 |
---|---|---|
committer | rvargas@google.com <rvargas@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-01-25 23:52:02 +0000 |
commit | ceb61da3987d8b7ed828c88daac779b1fbc8c6f9 (patch) | |
tree | bcbf1cdf1a3288ab7f1540bfa66f6d7742b6b154 /net/disk_cache/backend_unittest.cc | |
parent | 472ce96a4b839814ed93c26d35d07c78de019b17 (diff) | |
download | chromium_src-ceb61da3987d8b7ed828c88daac779b1fbc8c6f9.zip chromium_src-ceb61da3987d8b7ed828c88daac779b1fbc8c6f9.tar.gz chromium_src-ceb61da3987d8b7ed828c88daac779b1fbc8c6f9.tar.bz2 |
Disk cache: Prevent obscure file corruption and deal
with the result of that corruption.
1. Now we mark any open entry as dirty, even if we are
supposed to delete the entry right away because if we
crash before that, we may end up clearing the dirty
flag of a dirty entry.
2. When we look for a parent of a given entry we now
double check that the entry is the one that we want (and
not just another entry with the same key).
3. If we have a loop on the hash collision list (result of
failing to do 1 and 2 above), we figure that out.
4. Now every time we open an entry from an LRU list we end
up using the same code path (with the proper handling of
dirty entries).
BUG=69135
TEST=net_unittests
Review URL: http://codereview.chromium.org/6292011
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@72563 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/disk_cache/backend_unittest.cc')
-rw-r--r-- | net/disk_cache/backend_unittest.cc | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/net/disk_cache/backend_unittest.cc b/net/disk_cache/backend_unittest.cc index 05f17f6..1760837 100644 --- a/net/disk_cache/backend_unittest.cc +++ b/net/disk_cache/backend_unittest.cc @@ -49,6 +49,7 @@ class DiskCacheBackendTest : public DiskCacheTestWithCache { void BackendRecoverInsert(); void BackendRecoverRemove(); void BackendInvalidEntry2(); + void BackendInvalidEntry3(); void BackendNotMarkedButDirty(const std::string& name); void BackendDoomAll(); void BackendDoomAll2(); @@ -1318,7 +1319,96 @@ TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry2) { BackendInvalidEntry2(); } +// Tests that we don't crash or hang when enumerating this cache. +void DiskCacheBackendTest::BackendInvalidEntry3() { + SetMask(0x1); // 2-entry table. + SetMaxSize(0x3000); // 12 kB. + DisableFirstCleanup(); + InitCache(); + + disk_cache::Entry* entry; + void* iter = NULL; + while (OpenNextEntry(&iter, &entry) == net::OK) { + entry->Close(); + } +} + +TEST_F(DiskCacheBackendTest, InvalidEntry3) { + ASSERT_TRUE(CopyTestCache("dirty_entry3")); + BackendInvalidEntry3(); +} + TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry3) { + ASSERT_TRUE(CopyTestCache("dirty_entry4")); + SetNewEviction(); + BackendInvalidEntry3(); + DisableIntegrityCheck(); +} + +// Test that we handle a dirty entry on the LRU list, already replaced with +// the same key, and with hash collisions. +TEST_F(DiskCacheBackendTest, InvalidEntry4) { + ASSERT_TRUE(CopyTestCache("dirty_entry3")); + SetMask(0x1); // 2-entry table. + SetMaxSize(0x3000); // 12 kB. + DisableFirstCleanup(); + InitCache(); + + TrimForTest(false); +} + +// Test that we handle a dirty entry on the deleted list, already replaced with +// the same key, and with hash collisions. +TEST_F(DiskCacheBackendTest, InvalidEntry5) { + ASSERT_TRUE(CopyTestCache("dirty_entry4")); + SetNewEviction(); + SetMask(0x1); // 2-entry table. + SetMaxSize(0x3000); // 12 kB. + DisableFirstCleanup(); + InitCache(); + + TrimDeletedListForTest(false); +} + +// Tests that we don't hang when there is a loop on the hash collision list. +// The test cache could be a result of bug 69135. +TEST_F(DiskCacheBackendTest, BadNextEntry1) { + ASSERT_TRUE(CopyTestCache("list_loop2")); + SetMask(0x1); // 2-entry table. + SetMaxSize(0x3000); // 12 kB. + DisableFirstCleanup(); + InitCache(); + + // The second entry points at itselft, and the first entry is not accessible + // though the index, but it is at the head of the LRU. + + disk_cache::Entry* entry; + ASSERT_EQ(net::OK, CreateEntry("The first key", &entry)); + entry->Close(); + + TrimForTest(false); + TrimForTest(false); + ASSERT_EQ(net::OK, OpenEntry("The first key", &entry)); + entry->Close(); + EXPECT_EQ(1, cache_->GetEntryCount()); +} + +// Tests that we don't hang when there is a loop on the hash collision list. +// The test cache could be a result of bug 69135. +TEST_F(DiskCacheBackendTest, BadNextEntry2) { + ASSERT_TRUE(CopyTestCache("list_loop3")); + SetMask(0x1); // 2-entry table. + SetMaxSize(0x3000); // 12 kB. + DisableFirstCleanup(); + InitCache(); + + // There is a wide loop of 5 entries. + + disk_cache::Entry* entry; + ASSERT_NE(net::OK, OpenEntry("Not present key", &entry)); +} + +TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry6) { ASSERT_TRUE(CopyTestCache("bad_rankings3")); DisableFirstCleanup(); SetNewEviction(); |