summaryrefslogtreecommitdiffstats
path: root/net/disk_cache/entry_unittest.cc
diff options
context:
space:
mode:
authorgavinp@chromium.org <gavinp@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-29 17:35:57 +0000
committergavinp@chromium.org <gavinp@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-29 17:35:57 +0000
commit783b22dea0148ee262c89c7a69423dc26227853f (patch)
treea2a789fd4807cbcc56d92924153fd1693c6cd2f1 /net/disk_cache/entry_unittest.cc
parent01dd75434167c0e445a1216e89473d070ac91448 (diff)
downloadchromium_src-783b22dea0148ee262c89c7a69423dc26227853f.zip
chromium_src-783b22dea0148ee262c89c7a69423dc26227853f.tar.gz
chromium_src-783b22dea0148ee262c89c7a69423dc26227853f.tar.bz2
Deflake SimpleCache::Close()
It turns out that Close() takes a small, finite amount of time before it is safe to open an entry again, because it must write the EOF record before closing the file. To reduce flakiness, do not permit OpenEntry to proceed while a Close is pending. This is done by placing a more detailed state machine in the SimpleEntryImpl, along with a map of all active entries in the SimpleBackendImpl. Not all flakes are gone (especially around mass dooms), but this should be a strict improvement. R=pliard,pasko,felipeg BUG=233871,236322 Review URL: https://chromiumcodereview.appspot.com/14354008 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@197070 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/disk_cache/entry_unittest.cc')
-rw-r--r--net/disk_cache/entry_unittest.cc47
1 files changed, 39 insertions, 8 deletions
diff --git a/net/disk_cache/entry_unittest.cc b/net/disk_cache/entry_unittest.cc
index ef5ad9b..b98d6fd 100644
--- a/net/disk_cache/entry_unittest.cc
+++ b/net/disk_cache/entry_unittest.cc
@@ -59,6 +59,7 @@ class DiskCacheEntryTest : public DiskCacheTestWithCache {
void DoomSparseEntry();
void PartialSparseEntry();
void EvictOldEntries();
+ void SimpleCacheMakeBadChecksumEntry(const char* key);
};
// This part of the test runs on the background thread.
@@ -2351,12 +2352,7 @@ TEST_F(DiskCacheEntryTest, SimpleCacheDoomedEntry) {
DoomedEntry();
}
-// Tests that the simple cache can detect entries that have bad data.
-TEST_F(DiskCacheEntryTest, SimpleCacheBadChecksum) {
- SetSimpleCacheMode();
- InitCache();
-
- const char key[] = "the first key";
+void DiskCacheEntryTest::SimpleCacheMakeBadChecksumEntry(const char* key) {
disk_cache::Entry* entry = NULL;
ASSERT_EQ(net::OK, CreateEntry(key, &entry));
@@ -2388,15 +2384,50 @@ TEST_F(DiskCacheEntryTest, SimpleCacheBadChecksum) {
base::WritePlatformFile(entry_file0, file_offset,
bad_data.data(), bad_data.size()));
EXPECT_TRUE(base::ClosePlatformFile(entry_file0));
+}
+
+// Tests that the simple cache can detect entries that have bad data.
+TEST_F(DiskCacheEntryTest, SimpleCacheBadChecksum) {
+ SetSimpleCacheMode();
+ InitCache();
+
+ const char key[] = "the first key";
+ SimpleCacheMakeBadChecksumEntry(key);
+
+ disk_cache::Entry* entry = NULL;
// Open the entry.
EXPECT_EQ(net::OK, OpenEntry(key, &entry));
- const size_t kReadBufferSize = 200;
- EXPECT_LE(data.size(), kReadBufferSize);
+ const int kReadBufferSize = 200;
+ DCHECK_GE(kReadBufferSize, entry->GetDataSize(0));
scoped_refptr<net::IOBuffer> read_buffer(new net::IOBuffer(kReadBufferSize));
EXPECT_EQ(net::ERR_FAILED,
ReadData(entry, 0, 0, read_buffer, kReadBufferSize));
+
+ entry->Close();
+}
+
+// Tests that an entry that has had an IO error occur can still be Doomed().
+TEST_F(DiskCacheEntryTest, SimpleCacheErrorThenDoom) {
+ SetSimpleCacheMode();
+ InitCache();
+
+ const char key[] = "the first key";
+ SimpleCacheMakeBadChecksumEntry(key);
+
+ disk_cache::Entry* entry = NULL;
+
+ // Open the entry, forcing an IO error.
+ EXPECT_EQ(net::OK, OpenEntry(key, &entry));
+
+ const int kReadBufferSize = 200;
+ DCHECK_GE(kReadBufferSize, entry->GetDataSize(0));
+ scoped_refptr<net::IOBuffer> read_buffer(new net::IOBuffer(kReadBufferSize));
+ EXPECT_EQ(net::ERR_FAILED,
+ ReadData(entry, 0, 0, read_buffer, kReadBufferSize));
+
+ entry->Doom(); // Should not crash.
entry->Close();
}