Index: net/disk_cache/backend_unittest.cc |
diff --git a/net/disk_cache/backend_unittest.cc b/net/disk_cache/backend_unittest.cc |
index ebd2f578ae578a2df3d50d7b20f2642d0d26aa4d..394c43fb9f60423844a16acb0be1f295f3b9e15f 100644 |
--- a/net/disk_cache/backend_unittest.cc |
+++ b/net/disk_cache/backend_unittest.cc |
@@ -2947,6 +2947,46 @@ TEST_F(DiskCacheBackendTest, MemoryOnlyBackendEviction) { |
// TODO(gavinp): Enable BackendEviction test for simple cache after performance |
// problems are addressed. See crbug.com/588184 for more information. |
+// This overly specific looking test is a regression test aimed at |
+// crbug.com/589186. |
+TEST_F(DiskCacheBackendTest, MemoryCacheUseAfterFree) { |
mmenke
2016/02/25 07:14:05
Should we run similar tests for disk cache impleme
gavinp
2016/02/25 15:55:32
Acknowledged.
|
+ SetMemoryOnlyMode(); |
+ |
+ const int kMaxSize = 200 * 1024; |
+ const int kMaxEntryCount = 20; |
+ const int kWriteSize = kMaxSize / kMaxEntryCount; |
+ |
+ SetMaxSize(kMaxSize); |
+ InitCache(); |
+ |
+ scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kWriteSize)); |
+ CacheTestFillBuffer(buffer->data(), kWriteSize, false); |
+ |
+ // Create an entry to be our sparse entry that gets written later. |
+ disk_cache::Entry* entry; |
+ ASSERT_EQ(net::OK, CreateEntry("first parent", &entry)); |
+ disk_cache::ScopedEntryPtr first_parent(entry); |
+ EXPECT_EQ(1024, first_parent->WriteSparseData(0, buffer.get(), 1024, |
mmenke
2016/02/25 07:14:06
Should have a comment about why this first write i
gavinp
2016/02/25 15:55:32
Actually, it's not needed, so it's removed.
|
+ net::CompletionCallback())); |
+ |
+ // Create a ton of entries, and keep them open, to put the cache well above |
+ // its eviction threshhold. |
+ const int kTooManyEntriesCount = kMaxEntryCount * 2; |
+ disk_cache::ScopedEntryPtr open_entries[kTooManyEntriesCount]; |
mmenke
2016/02/25 07:14:06
optional: I'd suggest just using a std::vector<di
gavinp
2016/02/25 15:55:32
Done.
|
+ std::string key_prefix("prefix"); |
+ for (int i = 0; i < kTooManyEntriesCount; ++i) { |
+ ASSERT_EQ(net::OK, CreateEntry(key_prefix + base::IntToString(i), &entry)); |
+ EXPECT_EQ(kWriteSize, |
+ WriteData(entry, 1, 0, buffer.get(), kWriteSize, false)); |
+ open_entries[i].reset(entry); |
+ } |
+ EXPECT_LT(kMaxSize, CalculateSizeOfAllEntries()); |
+ |
+ // Writing this sparse data should not crash. |
+ EXPECT_EQ(1024, first_parent->WriteSparseData(32768, buffer.get(), 1024, |
+ net::CompletionCallback())); |
+} |
+ |
TEST_F(DiskCacheTest, Backend_UsageStatsTimer) { |
MessageLoopHelper helper; |