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

Side by Side Diff: net/disk_cache/backend_unittest.cc

Issue 12951014: Fix bug in MemEntryImpl, which caused browser crash during clearing (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: Created 7 years, 9 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « AUTHORS ('k') | net/disk_cache/mem_backend_impl.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/basictypes.h" 5 #include "base/basictypes.h"
6 #include "base/file_util.h" 6 #include "base/file_util.h"
7 #include "base/string_util.h" 7 #include "base/string_util.h"
8 #include "base/stringprintf.h" 8 #include "base/stringprintf.h"
9 #include "base/third_party/dynamic_annotations/dynamic_annotations.h" 9 #include "base/third_party/dynamic_annotations/dynamic_annotations.h"
10 #include "base/threading/platform_thread.h" 10 #include "base/threading/platform_thread.h"
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 void BackendInvalidEntry(); 43 void BackendInvalidEntry();
44 void BackendInvalidEntryRead(); 44 void BackendInvalidEntryRead();
45 void BackendInvalidEntryWithLoad(); 45 void BackendInvalidEntryWithLoad();
46 void BackendTrimInvalidEntry(); 46 void BackendTrimInvalidEntry();
47 void BackendTrimInvalidEntry2(); 47 void BackendTrimInvalidEntry2();
48 void BackendEnumerations(); 48 void BackendEnumerations();
49 void BackendEnumerations2(); 49 void BackendEnumerations2();
50 void BackendInvalidEntryEnumeration(); 50 void BackendInvalidEntryEnumeration();
51 void BackendFixEnumerators(); 51 void BackendFixEnumerators();
52 void BackendDoomRecent(); 52 void BackendDoomRecent();
53
54 // Adds 5 sparse entries. |doomed_start| and |doomed_end| if not NULL,
55 // will be filled with times, used by DoomEntriesSince and DoomEntriesBetween.
56 // There are 4 entries after doomed_start and 2 after doomed_end.
57 void InitSparseCache(base::Time* doomed_start, base::Time* doomed_end);
58
53 void BackendDoomBetween(); 59 void BackendDoomBetween();
54 void BackendTransaction(const std::string& name, int num_entries, bool load); 60 void BackendTransaction(const std::string& name, int num_entries, bool load);
55 void BackendRecoverInsert(); 61 void BackendRecoverInsert();
56 void BackendRecoverRemove(); 62 void BackendRecoverRemove();
57 void BackendRecoverWithEviction(); 63 void BackendRecoverWithEviction();
58 void BackendInvalidEntry2(); 64 void BackendInvalidEntry2();
59 void BackendInvalidEntry3(); 65 void BackendInvalidEntry3();
60 void BackendInvalidEntry7(); 66 void BackendInvalidEntry7();
61 void BackendInvalidEntry8(); 67 void BackendInvalidEntry8();
62 void BackendInvalidEntry9(bool eviction); 68 void BackendInvalidEntry9(bool eviction);
(...skipping 1275 matching lines...) Expand 10 before | Expand all | Expand 10 after
1338 TEST_F(DiskCacheBackendTest, NewEvictionDoomRecent) { 1344 TEST_F(DiskCacheBackendTest, NewEvictionDoomRecent) {
1339 SetNewEviction(); 1345 SetNewEviction();
1340 BackendDoomRecent(); 1346 BackendDoomRecent();
1341 } 1347 }
1342 1348
1343 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomRecent) { 1349 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomRecent) {
1344 SetMemoryOnlyMode(); 1350 SetMemoryOnlyMode();
1345 BackendDoomRecent(); 1351 BackendDoomRecent();
1346 } 1352 }
1347 1353
1354 void DiskCacheBackendTest::InitSparseCache(base::Time* doomed_start,
1355 base::Time* doomed_end) {
1356 SetDirectMode();
1357 InitCache();
1358
1359 const int kSize = 50;
1360 // This must be greater then MemEntryImpl::kMaxSparseEntrySize.
1361 const int kOffset = 10 + 1024 * 1024;
1362
1363 disk_cache::Entry* entry0 = NULL;
1364 disk_cache::Entry* entry1 = NULL;
1365 disk_cache::Entry* entry2 = NULL;
1366
1367 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize));
1368 CacheTestFillBuffer(buffer->data(), kSize, false);
1369
1370 ASSERT_EQ(net::OK, CreateEntry("zeroth", &entry0));
1371 ASSERT_EQ(kSize, WriteSparseData(entry0, 0, buffer.get(), kSize));
1372 ASSERT_EQ(kSize,
1373 WriteSparseData(entry0, kOffset + kSize, buffer.get(), kSize));
1374 entry0->Close();
1375
1376 FlushQueueForTest();
1377 AddDelay();
1378 if (doomed_start)
1379 *doomed_start = base::Time::Now();
1380
1381 // Order in rankings list:
1382 // first_part1, first_part2, second_part1, second_part2
1383 ASSERT_EQ(net::OK, CreateEntry("first", &entry1));
1384 ASSERT_EQ(kSize, WriteSparseData(entry1, 0, buffer.get(), kSize));
1385 ASSERT_EQ(kSize,
1386 WriteSparseData(entry1, kOffset + kSize, buffer.get(), kSize));
1387 entry1->Close();
1388
1389 ASSERT_EQ(net::OK, CreateEntry("second", &entry2));
1390 ASSERT_EQ(kSize, WriteSparseData(entry2, 0, buffer.get(), kSize));
1391 ASSERT_EQ(kSize,
1392 WriteSparseData(entry2, kOffset + kSize, buffer.get(), kSize));
1393 entry2->Close();
1394
1395 FlushQueueForTest();
1396 AddDelay();
1397 if (doomed_end)
1398 *doomed_end = base::Time::Now();
1399
1400 // Order in rankings list:
1401 // third_part1, fourth_part1, third_part2, fourth_part2
1402 disk_cache::Entry* entry3 = NULL;
1403 disk_cache::Entry* entry4 = NULL;
1404 ASSERT_EQ(net::OK, CreateEntry("third", &entry3));
1405 ASSERT_EQ(kSize, WriteSparseData(entry3, 0, buffer.get(), kSize));
1406 ASSERT_EQ(net::OK, CreateEntry("fourth", &entry4));
1407 ASSERT_EQ(kSize, WriteSparseData(entry4, 0, buffer.get(), kSize));
1408 ASSERT_EQ(kSize,
1409 WriteSparseData(entry3, kOffset + kSize, buffer.get(), kSize));
1410 ASSERT_EQ(kSize,
1411 WriteSparseData(entry4, kOffset + kSize, buffer.get(), kSize));
1412 entry3->Close();
1413 entry4->Close();
1414
1415 FlushQueueForTest();
1416 AddDelay();
rvargas (doing something else) 2013/03/28 00:31:59 nit: we shouldn't need an extra delay here.
1417 }
1418
1419 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomEntriesSinceSparse) {
1420 SetMemoryOnlyMode();
1421 base::Time start;
1422 InitSparseCache(&start, NULL);
1423 DoomEntriesSince(start);
1424 EXPECT_EQ(1, cache_->GetEntryCount());
1425 }
1426
1427 TEST_F(DiskCacheBackendTest, DoomEntriesSinceSparse) {
1428 base::Time start;
1429 InitSparseCache(&start, NULL);
1430 DoomEntriesSince(start);
1431 // NOTE: BackendImpl counts child entries in it GetEntryCount(), while
rvargas (doing something else) 2013/03/28 00:31:59 type: it -> its
Slava Chigrin 2013/03/28 13:56:19 Done.
1432 // MemBackendImpl does not. Thats why expected value differs here from
1433 // MemoryOnlyDoomEntriesSinceSparse.
1434 EXPECT_EQ(3, cache_->GetEntryCount());
1435 }
1436
1437 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomAllSparse) {
1438 SetMemoryOnlyMode();
1439 InitSparseCache(NULL, NULL);
1440 EXPECT_EQ(net::OK, DoomAllEntries());
1441 EXPECT_EQ(0, cache_->GetEntryCount());
1442 }
1443
1444 TEST_F(DiskCacheBackendTest, DoomAllSparse) {
1445 InitSparseCache(NULL, NULL);
1446 EXPECT_EQ(net::OK, DoomAllEntries());
1447 EXPECT_EQ(0, cache_->GetEntryCount());
1448 }
1449
1348 void DiskCacheBackendTest::BackendDoomBetween() { 1450 void DiskCacheBackendTest::BackendDoomBetween() {
1349 InitCache(); 1451 InitCache();
1350 1452
1351 disk_cache::Entry *entry; 1453 disk_cache::Entry *entry;
1352 ASSERT_EQ(net::OK, CreateEntry("first", &entry)); 1454 ASSERT_EQ(net::OK, CreateEntry("first", &entry));
1353 entry->Close(); 1455 entry->Close();
1354 FlushQueueForTest(); 1456 FlushQueueForTest();
1355 1457
1356 AddDelay(); 1458 AddDelay();
1357 Time middle_start = Time::Now(); 1459 Time middle_start = Time::Now();
(...skipping 23 matching lines...) Expand all
1381 ASSERT_EQ(net::OK, OpenEntry("fourth", &entry)); 1483 ASSERT_EQ(net::OK, OpenEntry("fourth", &entry));
1382 entry->Close(); 1484 entry->Close();
1383 1485
1384 EXPECT_EQ(net::OK, DoomEntriesBetween(middle_start, final)); 1486 EXPECT_EQ(net::OK, DoomEntriesBetween(middle_start, final));
1385 ASSERT_EQ(1, cache_->GetEntryCount()); 1487 ASSERT_EQ(1, cache_->GetEntryCount());
1386 1488
1387 ASSERT_EQ(net::OK, OpenEntry("first", &entry)); 1489 ASSERT_EQ(net::OK, OpenEntry("first", &entry));
1388 entry->Close(); 1490 entry->Close();
1389 } 1491 }
1390 1492
1493 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomBetween) {
rvargas (doing something else) 2013/03/28 00:31:59 nit: don't move this test. (avoid not needed chang
Slava Chigrin 2013/03/28 13:56:19 Done.
1494 SetMemoryOnlyMode();
1495 BackendDoomBetween();
1496 }
1497
1391 TEST_F(DiskCacheBackendTest, DoomBetween) { 1498 TEST_F(DiskCacheBackendTest, DoomBetween) {
1392 BackendDoomBetween(); 1499 BackendDoomBetween();
1393 } 1500 }
1394 1501
1395 TEST_F(DiskCacheBackendTest, NewEvictionDoomBetween) { 1502 TEST_F(DiskCacheBackendTest, NewEvictionDoomBetween) {
1396 SetNewEviction(); 1503 SetNewEviction();
1397 BackendDoomBetween(); 1504 BackendDoomBetween();
1398 } 1505 }
1399 1506
1400 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomBetween) { 1507 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomEntriesBetweenSparse) {
1401 SetMemoryOnlyMode(); 1508 SetMemoryOnlyMode();
1402 BackendDoomBetween(); 1509 base::Time start, end;
1510 InitSparseCache(&start, &end);
1511 DoomEntriesBetween(start, end);
1512 EXPECT_EQ(3, cache_->GetEntryCount());
1513
1514 start = end;
1515 end = base::Time::Now();
rvargas (doing something else) 2013/03/28 00:31:59 ah, I see... OK then for the extra delay.
1516 DoomEntriesBetween(start, end);
1517 EXPECT_EQ(1, cache_->GetEntryCount());
1518 }
1519
1520 TEST_F(DiskCacheBackendTest, DoomEntriesBetweenSparse) {
1521 base::Time start, end;
1522 InitSparseCache(&start, &end);
1523 DoomEntriesBetween(start, end);
1524 EXPECT_EQ(9, cache_->GetEntryCount());
1525
1526 start = end;
1527 end = base::Time::Now();
1528 DoomEntriesBetween(start, end);
1529 EXPECT_EQ(3, cache_->GetEntryCount());
1403 } 1530 }
1404 1531
1405 void DiskCacheBackendTest::BackendTransaction(const std::string& name, 1532 void DiskCacheBackendTest::BackendTransaction(const std::string& name,
1406 int num_entries, bool load) { 1533 int num_entries, bool load) {
1407 success_ = false; 1534 success_ = false;
1408 ASSERT_TRUE(CopyTestCache(name)); 1535 ASSERT_TRUE(CopyTestCache(name));
1409 DisableFirstCleanup(); 1536 DisableFirstCleanup();
1410 1537
1411 uint32 mask; 1538 uint32 mask;
1412 if (load) { 1539 if (load) {
(...skipping 1271 matching lines...) Expand 10 before | Expand all | Expand 10 after
2684 // Ping the oldest entry. 2811 // Ping the oldest entry.
2685 cache_->OnExternalCacheHit("key0"); 2812 cache_->OnExternalCacheHit("key0");
2686 2813
2687 TrimForTest(false); 2814 TrimForTest(false);
2688 2815
2689 // Make sure the older key remains. 2816 // Make sure the older key remains.
2690 EXPECT_EQ(1, cache_->GetEntryCount()); 2817 EXPECT_EQ(1, cache_->GetEntryCount());
2691 ASSERT_EQ(net::OK, OpenEntry("key0", &entry)); 2818 ASSERT_EQ(net::OK, OpenEntry("key0", &entry));
2692 entry->Close(); 2819 entry->Close();
2693 } 2820 }
OLDNEW
« no previous file with comments | « AUTHORS ('k') | net/disk_cache/mem_backend_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698