backend_unittest.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string_util.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stringprintf.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/third_party/dynamic_annotations/dynamic_annotations.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/platform_thread.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread_restrictions.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/io_buffer.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/test_completion_callback.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/backend_impl.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/cache_util.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/disk_cache_test_base.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/disk_cache_test_util.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/entry_impl.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/histogram_macros.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/mapped_file.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/mem_backend_impl.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_handle.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that can run with different types of caches. 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DiskCacheBackendTest : public DiskCacheTestWithCache { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendBasics(); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendKeying(); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendShutdownWithPendingFileIO(bool fast); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendShutdownWithPendingIO(bool fast); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendShutdownWithPendingCreate(bool fast); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendSetSize(); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendLoad(); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendChain(); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendValidEntry(); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendInvalidEntry(); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendInvalidEntryRead(); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendInvalidEntryWithLoad(); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendTrimInvalidEntry(); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendTrimInvalidEntry2(); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendEnumerations(); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendEnumerations2(); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendInvalidEntryEnumeration(); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendFixEnumerators(); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendDoomRecent(); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendDoomBetween(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendTransaction(const std::string& name, int num_entries, bool load); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendRecoverInsert(); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendRecoverRemove(); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendRecoverWithEviction(); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendInvalidEntry2(); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendInvalidEntry3(); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendInvalidEntry7(); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendInvalidEntry8(); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendInvalidEntry9(bool eviction); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendInvalidEntry10(bool eviction); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendInvalidEntry11(bool eviction); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendTrimInvalidEntry12(); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendDoomAll(); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendDoomAll2(); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendInvalidRankings(); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendInvalidRankings2(); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendDisable(); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendDisable2(); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendDisable3(); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendDisable4(); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendBasics() { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry *entry1 = NULL, *entry2 = NULL; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenEntry("the first key", &entry1)); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("the first key", &entry1)); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NULL != entry1); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1 = NULL; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry("the first key", &entry1)); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NULL != entry1); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1 = NULL; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, CreateEntry("the first key", &entry1)); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry("the first key", &entry1)); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenEntry("some other key", &entry2)); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("some other key", &entry2)); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NULL != entry1); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NULL != entry2); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, cache_->GetEntryCount()); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry3 = NULL; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry("some other key", &entry3)); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NULL != entry3); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(entry2 == entry3); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, cache_->GetEntryCount()); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(net::OK, DoomEntry("some other key")); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry3->Close(); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(net::OK, DoomEntry("the first key")); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, cache_->GetEntryCount()); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("the first key", &entry1)); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("some other key", &entry2)); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Doom(); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(net::OK, DoomEntry("some other key")); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, cache_->GetEntryCount()); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, Basics) { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendBasics(); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionBasics) { 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendBasics(); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlyBasics) { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMemoryOnlyMode(); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendBasics(); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, AppCacheBasics) { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetCacheType(net::APP_CACHE); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendBasics(); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendKeying() { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* kName1 = "the first key"; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* kName2 = "the first Key"; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry *entry1, *entry2; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(kName1, &entry1)); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(kName2, &entry2)); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(entry1 != entry2) << "Case sensitive"; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char buffer[30]; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::strlcpy(buffer, kName1, arraysize(buffer)); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(buffer, &entry2)); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(entry1 == entry2); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::strlcpy(buffer + 1, kName1, arraysize(buffer) - 1); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(buffer + 1, &entry2)); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(entry1 == entry2); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::strlcpy(buffer + 3, kName1, arraysize(buffer) - 3); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(buffer + 3, &entry2)); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(entry1 == entry2); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now verify long keys. 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char buffer2[20000]; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(buffer2, 's', sizeof(buffer2)); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer2[1023] = '\0'; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(buffer2, &entry2)) << "key on block file"; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer2[1023] = 'g'; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer2[19999] = '\0'; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(buffer2, &entry2)) << "key on external file"; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, Keying) { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendKeying(); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionKeying) { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendKeying(); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlyKeying) { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMemoryOnlyMode(); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendKeying(); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, AppCacheKeying) { 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetCacheType(net::APP_CACHE); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendKeying(); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheTest, CreateBackend) { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestCompletionCallback cb; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CleanupCacheDir()); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Thread cache_thread("CacheThread"); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(cache_thread.StartWithOptions( 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Thread::Options(MessageLoop::TYPE_IO, 0))); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test the private factory methods. 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Backend* cache = NULL; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rv = disk_cache::BackendImpl::CreateBackend( 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_path_, false, 0, net::DISK_CACHE, disk_cache::kNoRandom, 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_thread.message_loop_proxy(), NULL, &cache, cb.callback()); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, cb.GetResult(rv)); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(cache); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete cache; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache = disk_cache::MemBackendImpl::CreateBackend(0, NULL); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(cache); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete cache; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache = NULL; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now test the public API. 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = disk_cache::CreateCacheBackend(net::DISK_CACHE, cache_path_, 0, false, 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_thread.message_loop_proxy(), 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, &cache, cb.callback()); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, cb.GetResult(rv)); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(cache); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete cache; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache = NULL; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = disk_cache::CreateCacheBackend(net::MEMORY_CACHE, FilePath(), 0, false, 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL, &cache, cb.callback()); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, cb.GetResult(rv)); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(cache); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete cache; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->RunAllPending(); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Testst that re-creating the cache performs the expected cleanup. 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, CreateBackend_MissingFile) { 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_entry")); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FilePath filename = cache_path_.AppendASCII("data_1"); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_util::Delete(filename, false); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetForceCreation(); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool prev = base::ThreadRestrictions::SetIOAllowed(false); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ThreadRestrictions::SetIOAllowed(prev); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, ExternalFiles) { 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First, let's create a file on the folder. 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FilePath filename = cache_path_.AppendASCII("f_000001"); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSize = 50; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize)); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CacheTestFillBuffer(buffer1->data(), kSize, false); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(kSize, file_util::WriteFile(filename, buffer1->data(), kSize)); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now let's create a file with the cache. 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("key", &entry)); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0, WriteData(entry, 0, 20000, buffer1, 0, false)); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And verify that the first file is still there. 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize)); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(kSize, file_util::ReadFile(filename, buffer2->data(), kSize)); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(buffer1->data(), buffer2->data(), kSize)); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we deal with file-level pending operations at destruction time. 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendShutdownWithPendingFileIO(bool fast) { 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestCompletionCallback cb; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rv; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CleanupCacheDir()); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Thread cache_thread("CacheThread"); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(cache_thread.StartWithOptions( 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Thread::Options(MessageLoop::TYPE_IO, 0))); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Backend* cache; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 flags = disk_cache::kNoBuffering; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!fast) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= disk_cache::kNoRandom; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = disk_cache::BackendImpl::CreateBackend( 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_path_, false, 0, net::DISK_CACHE, flags, 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::MessageLoopProxy::current(), NULL, 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &cache, cb.callback()); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, cb.GetResult(rv)); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::EntryImpl* entry; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = cache->CreateEntry( 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "some key", reinterpret_cast<disk_cache::Entry**>(&entry), 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cb.callback()); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, cb.GetResult(rv)); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSize = 25000; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CacheTestFillBuffer(buffer->data(), kSize, false); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 10 * 1024 * 1024; i += 64 * 1024) { 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We are using the current thread as the cache thread because we want to 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be able to call directly this method to make sure that the OS (instead 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of us switching thread) is returning IO pending. 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = entry->WriteDataImpl(0, i, buffer, kSize, cb.callback(), false); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rv == net::ERR_IO_PENDING) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSize, rv); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't call Close() to avoid going through the queue or we'll deadlock 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // waiting for the operation to finish. 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Release(); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The cache destructor will see one pending operation here. 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete cache; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rv == net::ERR_IO_PENDING) { 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fast) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(cb.have_result()); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(cb.have_result()); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->RunAllPending(); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the actual operation to complete, or we'll keep a file handle that 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // may cause issues later. Note that on Posix systems even though this test 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // uses a single thread, the actual IO is posted to a worker thread and the 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cache destructor breaks the link to reach cb when the operation completes. 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = cb.GetResult(rv); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, ShutdownWithPendingFileIO) { 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendShutdownWithPendingFileIO(false); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking from this test. 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, ShutdownWithPendingFileIO_Fast) { 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The integrity test sets kNoRandom so there's a version mismatch if we don't 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // force new eviction. 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendShutdownWithPendingFileIO(true); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we deal with background-thread pending operations. 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendShutdownWithPendingIO(bool fast) { 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestCompletionCallback cb; 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CleanupCacheDir()); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Thread cache_thread("CacheThread"); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(cache_thread.StartWithOptions( 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Thread::Options(MessageLoop::TYPE_IO, 0))); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Backend* cache; 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 flags = disk_cache::kNoBuffering; 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!fast) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= disk_cache::kNoRandom; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rv = disk_cache::BackendImpl::CreateBackend( 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_path_, false, 0, net::DISK_CACHE, flags, 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_thread.message_loop_proxy(), NULL, &cache, cb.callback()); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, cb.GetResult(rv)); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = cache->CreateEntry("some key", &entry, cb.callback()); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, cb.GetResult(rv)); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The cache destructor will see one pending operation here. 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete cache; 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->RunAllPending(); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, ShutdownWithPendingIO) { 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendShutdownWithPendingIO(false); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking from this test. 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, ShutdownWithPendingIO_Fast) { 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The integrity test sets kNoRandom so there's a version mismatch if we don't 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // force new eviction. 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendShutdownWithPendingIO(true); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we deal with create-type pending operations. 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendShutdownWithPendingCreate(bool fast) { 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestCompletionCallback cb; 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CleanupCacheDir()); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Thread cache_thread("CacheThread"); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(cache_thread.StartWithOptions( 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Thread::Options(MessageLoop::TYPE_IO, 0))); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Backend* cache; 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::BackendFlags flags = 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fast ? disk_cache::kNone : disk_cache::kNoRandom; 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rv = disk_cache::BackendImpl::CreateBackend( 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_path_, false, 0, net::DISK_CACHE, flags, 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_thread.message_loop_proxy(), NULL, &cache, cb.callback()); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, cb.GetResult(rv)); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = cache->CreateEntry("some key", &entry, cb.callback()); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::ERR_IO_PENDING, rv); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete cache; 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(cb.have_result()); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->RunAllPending(); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, ShutdownWithPendingCreate) { 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendShutdownWithPendingCreate(false); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking an entry from this test. 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, ShutdownWithPendingCreate_Fast) { 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The integrity test sets kNoRandom so there's a version mismatch if we don't 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // force new eviction. 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendShutdownWithPendingCreate(true); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheTest, TruncatedIndex) { 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CleanupCacheDir()); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FilePath index = cache_path_.AppendASCII("index"); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(5, file_util::WriteFile(index, "hello", 5)); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Thread cache_thread("CacheThread"); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(cache_thread.StartWithOptions( 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Thread::Options(MessageLoop::TYPE_IO, 0))); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestCompletionCallback cb; 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Backend* backend = NULL; 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rv = disk_cache::BackendImpl::CreateBackend( 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_path_, false, 0, net::DISK_CACHE, disk_cache::kNone, 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_thread.message_loop_proxy(), NULL, &backend, cb.callback()); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(net::OK, cb.GetResult(rv)); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend == NULL); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete backend; 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendSetSize() { 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int cache_size = 0x10000; // 64 kB 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(cache_size); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string first("some key"); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string second("something else"); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(first, &entry)); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(cache_size)); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(buffer->data(), 0, cache_size); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(cache_size / 10, WriteData(entry, 0, 0, buffer, cache_size / 10, 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false)) << "normal file"; 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(net::ERR_FAILED, WriteData(entry, 1, 0, buffer, cache_size / 5, 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false)) << "file size above the limit"; 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // By doubling the total size, we make this file cacheable. 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(cache_size * 2); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(cache_size / 5, WriteData(entry, 1, 0, buffer, cache_size / 5, 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false)); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Let's fill up the cache!. 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(cache_size * 10); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(cache_size * 3 / 4, WriteData(entry, 0, 0, buffer, 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_size * 3 / 4, false)); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(cache_size); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The cache is 95% full. 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(second, &entry)); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(cache_size / 10, WriteData(entry, 0, 0, buffer, cache_size / 10, 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false)); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry2; 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("an extra key", &entry2)); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(cache_size / 10, WriteData(entry2, 0, 0, buffer, cache_size / 10, 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false)); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); // This will trigger the cache trim. 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenEntry(first, &entry2)); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); // Make sure that we are done trimming the cache. 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); // We may have posted two tasks to evict stuff. 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(second, &entry)); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(cache_size / 10, entry->GetDataSize(0)); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, SetSize) { 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendSetSize(); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionSetSize) { 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendSetSize(); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlySetSize) { 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMemoryOnlyMode(); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendSetSize(); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendLoad() { 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int seed = static_cast<int>(Time::Now().ToInternalValue()); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) srand(seed); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entries[100]; 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 100; i++) { 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key = GenerateKey(true); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(key, &entries[i])); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(100, cache_->GetEntryCount()); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 100; i++) { 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int source1 = rand() % 100; 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int source2 = rand() % 100; 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* temp = entries[source1]; 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries[source1] = entries[source2]; 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries[source2] = temp; 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 100; i++) { 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(entries[i]->GetKey(), &entry)); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(entry == entries[i]); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries[i]->Doom(); 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries[i]->Close(); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, cache_->GetEntryCount()); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, Load) { 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Work with a tiny index table (16 entries) 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMask(0xf); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(0x100000); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendLoad(); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionLoad) { 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Work with a tiny index table (16 entries) 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMask(0xf); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(0x100000); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendLoad(); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlyLoad) { 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Work with a tiny index table (16 entries) 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(0x100000); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMemoryOnlyMode(); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendLoad(); 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, AppCacheLoad) { 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetCacheType(net::APP_CACHE); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Work with a tiny index table (16 entries) 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMask(0xf); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(0x100000); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendLoad(); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests the chaining of an entry to the current head. 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendChain() { 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMask(0x1); // 2-entry table. 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(0x3000); // 12 kB. 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("The first key", &entry)); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("The Second key", &entry)); 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, Chain) { 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendChain(); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionChain) { 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendChain(); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, AppCacheChain) { 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetCacheType(net::APP_CACHE); 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendChain(); 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionTrim) { 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 100; i++) { 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string name(StringPrintf("Key %d", i)); 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(name, &entry)); 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i < 90) { 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Entries 0 to 89 are in list 1; 90 to 99 are in list 0. 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(name, &entry)); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The first eviction must come from list 1 (10% limit), the second must come 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from list 0. 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimForTest(false); 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenEntry("Key 0", &entry)); 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimForTest(false); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenEntry("Key 90", &entry)); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Double check that we still have the list tails. 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry("Key 1", &entry)); 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry("Key 91", &entry)); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Before looking for invalid entries, let's check a valid entry. 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendValidEntry() { 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key("Some key"); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSize = 50; 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize)); 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(buffer1->data(), 0, kSize); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::strlcpy(buffer1->data(), "And the data to save", kSize); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer1, kSize, false)); 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateCrash(); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize)); 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(buffer2->data(), 0, kSize); 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer2, kSize)); 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ(buffer1->data(), buffer2->data()); 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, ValidEntry) { 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendValidEntry(); 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionValidEntry) { 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendValidEntry(); 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The same logic of the previous test (ValidEntry), but this time force the 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// entry to be invalid, simulating a crash in the middle. 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntry() { 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use the implementation directly... we need to simulate a crash. 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key("Some key"); 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSize = 50; 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(buffer->data(), 0, kSize); 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::strlcpy(buffer->data(), "And the data to save", kSize); 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, false)); 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateCrash(); 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenEntry(key, &entry)); 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, cache_->GetEntryCount()); 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This and the other intentionally leaky tests below are excluded from 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// valgrind runs by naming them in the files 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// net/data/valgrind/net_unittests.gtest.txt 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The scripts tools/valgrind/chrome_tests.sh 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// read those files and pass the appropriate --gtest_filter to net_unittests. 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry) { 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry(); 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry) { 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry(); 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, AppCacheInvalidEntry) { 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetCacheType(net::APP_CACHE); 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry(); 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Almost the same test, but this time crash the cache after reading an entry. 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntryRead() { 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use the implementation directly... we need to simulate a crash. 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key("Some key"); 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSize = 50; 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(buffer->data(), 0, kSize); 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::strlcpy(buffer->data(), "And the data to save", kSize); 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, false)); 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer, kSize)); 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateCrash(); 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type_ == net::APP_CACHE) { 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reading an entry and crashing should not make it dirty. 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenEntry(key, &entry)); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, cache_->GetEntryCount()); 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntryRead) { 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntryRead(); 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntryRead) { 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntryRead(); 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, AppCacheInvalidEntryRead) { 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetCacheType(net::APP_CACHE); 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntryRead(); 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntryWithLoad() { 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Work with a tiny index table (16 entries) 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMask(0xf); 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(0x100000); 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int seed = static_cast<int>(Time::Now().ToInternalValue()); 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) srand(seed); 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kNumEntries = 100; 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entries[kNumEntries]; 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumEntries; i++) { 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key = GenerateKey(true); 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(key, &entries[i])); 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kNumEntries, cache_->GetEntryCount()); 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumEntries; i++) { 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int source1 = rand() % kNumEntries; 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int source2 = rand() % kNumEntries; 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* temp = entries[source1]; 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries[source1] = entries[source2]; 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries[source2] = temp; 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string keys[kNumEntries]; 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumEntries; i++) { 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keys[i] = entries[i]->GetKey(); 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i < kNumEntries / 2) 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries[i]->Close(); 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateCrash(); 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = kNumEntries / 2; i < kNumEntries; i++) { 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenEntry(keys[i], &entry)); 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumEntries / 2; i++) { 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(keys[i], &entry)); 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kNumEntries / 2, cache_->GetEntryCount()); 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntryWithLoad) { 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntryWithLoad(); 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntryWithLoad) { 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntryWithLoad(); 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, AppCacheInvalidEntryWithLoad) { 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetCacheType(net::APP_CACHE); 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntryWithLoad(); 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendTrimInvalidEntry() { 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use the implementation directly... we need to simulate a crash. 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSize = 0x3000; // 12 kB 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(kSize * 10); 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string first("some key"); 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string second("something else"); 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(first, &entry)); 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(buffer->data(), 0, kSize); 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, false)); 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate a crash. 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateCrash(); 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(second, &entry)); 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, false)); 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, cache_->GetEntryCount()); 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(kSize); 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); // Trim the cache. 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we evicted the entry in less than 20mS, we have one entry in the cache; 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if it took more than that, we posted a task and we'll delete the second 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // entry too. 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->RunAllPending(); 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This may be not thread-safe in general, but for now it's OK so add some 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ThreadSanitizer annotations to ignore data races on cache_. 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See http://crbug.com/55970 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ANNOTATE_IGNORE_READS_BEGIN(); 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(1, cache_->GetEntryCount()); 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ANNOTATE_IGNORE_READS_END(); 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenEntry(first, &entry)); 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, TrimInvalidEntry) { 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTrimInvalidEntry(); 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionTrimInvalidEntry) { 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTrimInvalidEntry(); 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendTrimInvalidEntry2() { 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use the implementation directly... we need to simulate a crash. 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMask(0xf); // 16-entry table. 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSize = 0x3000; // 12 kB 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(kSize * 40); 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(buffer->data(), 0, kSize); 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Writing 32 entries to this cache chains most of them. 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 32; i++) { 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key(base::StringPrintf("some key %d", i)); 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, false)); 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that we are not closing the entries. 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate a crash. 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateCrash(); 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("Something else", &entry)); 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, false)); 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(33, cache_->GetEntryCount()); 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(kSize); 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For the new eviction code, all corrupt entries are on the second list so 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // they are not going away that easy. 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (new_eviction_) { 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(net::OK, DoomAllEntries()); 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); // Trim the cache. 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We may abort the eviction before cleaning up everything. 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->RunAllPending(); 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If it's not clear enough: we may still have eviction tasks running at this 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // time, so the number of entries is changing while we read it. 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN(); 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(30, cache_->GetEntryCount()); 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ANNOTATE_IGNORE_READS_AND_WRITES_END(); 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, TrimInvalidEntry2) { 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTrimInvalidEntry2(); 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionTrimInvalidEntry2) { 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTrimInvalidEntry2(); 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendEnumerations() { 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time initial = Time::Now(); 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int seed = static_cast<int>(initial.ToInternalValue()); 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) srand(seed); 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kNumEntries = 100; 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumEntries; i++) { 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key = GenerateKey(true); 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kNumEntries, cache_->GetEntryCount()); 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time final = Time::Now(); 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter = NULL; 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int count = 0; 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time last_modified[kNumEntries]; 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time last_used[kNumEntries]; 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (OpenNextEntry(&iter, &entry) == net::OK) { 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NULL != entry); 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (count < kNumEntries) { 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_modified[count] = entry->GetLastModified(); 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_used[count] = entry->GetLastUsed(); 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(initial <= last_modified[count]); 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(final >= last_modified[count]); 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) count++; 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kNumEntries, count); 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter = NULL; 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) count = 0; 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The previous enumeration should not have changed the timestamps. 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (OpenNextEntry(&iter, &entry) == net::OK) { 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NULL != entry); 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (count < kNumEntries) { 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(last_modified[count] == entry->GetLastModified()); 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(last_used[count] == entry->GetLastUsed()); 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) count++; 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kNumEntries, count); 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, Enumerations) { 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendEnumerations(); 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionEnumerations) { 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendEnumerations(); 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlyEnumerations) { 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMemoryOnlyMode(); 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendEnumerations(); 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, AppCacheEnumerations) { 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetCacheType(net::APP_CACHE); 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendEnumerations(); 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies enumerations while entries are open. 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendEnumerations2() { 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string first("first"); 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string second("second"); 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry *entry1, *entry2; 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(first, &entry1)); 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(second, &entry2)); 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure that the timestamp is not the same. 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddDelay(); 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(second, &entry1)); 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter = NULL; 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry2)); 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(entry2->GetKey(), second); 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Two entries and the iterator pointing at "first". 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The iterator should still be valid, so we should not crash. 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry2)); 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(entry2->GetKey(), first); 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_->EndEnumeration(&iter); 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Modify the oldest entry and get the newest element. 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(first, &entry1)); 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, WriteData(entry1, 0, 200, NULL, 0, false)); 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry2)); 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type_ == net::APP_CACHE) { 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The list is not updated. 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(entry2->GetKey(), second); 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(entry2->GetKey(), first); 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_->EndEnumeration(&iter); 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, Enumerations2) { 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendEnumerations2(); 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionEnumerations2) { 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendEnumerations2(); 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlyEnumerations2) { 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMemoryOnlyMode(); 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendEnumerations2(); 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, AppCacheEnumerations2) { 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetCacheType(net::APP_CACHE); 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendEnumerations2(); 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify handling of invalid entries while doing enumerations. 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntryEnumeration() { 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use the implementation directly... we need to simulate a crash. 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key("Some key"); 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry *entry, *entry1, *entry2; 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(key, &entry1)); 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSize = 50; 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize)); 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(buffer1->data(), 0, kSize); 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::strlcpy(buffer1->data(), "And the data to save", kSize); 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSize, WriteData(entry1, 0, 0, buffer1, kSize, false)); 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(key, &entry1)); 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSize, ReadData(entry1, 0, 0, buffer1, kSize)); 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key2("Another key"); 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(key2, &entry2)); 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2, cache_->GetEntryCount()); 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateCrash(); 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter = NULL; 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int count = 0; 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (OpenNextEntry(&iter, &entry) == net::OK) { 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NULL != entry); 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(key2, entry->GetKey()); 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) count++; 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, count); 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntryEnumeration) { 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntryEnumeration(); 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntryEnumeration) { 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntryEnumeration(); 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that if for some reason entries are modified close to existing cache 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// iterators, we don't generate fatal errors or reset the cache. 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendFixEnumerators() { 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int seed = static_cast<int>(Time::Now().ToInternalValue()); 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) srand(seed); 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kNumEntries = 10; 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumEntries; i++) { 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key = GenerateKey(true); 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kNumEntries, cache_->GetEntryCount()); 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry *entry1, *entry2; 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter1 = NULL; 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter2 = NULL; 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter1, &entry1)); 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NULL != entry1); 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1 = NULL; 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Let's go to the middle of the list. 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumEntries / 2; i++) { 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry1) 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter1, &entry1)); 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NULL != entry1); 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter2, &entry2)); 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NULL != entry2); 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Messing up with entry1 will modify entry2->next. 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Doom(); 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter2, &entry2)); 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NULL != entry2); 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The link entry2->entry1 should be broken. 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(entry2->GetKey(), entry1->GetKey()); 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And the second iterator should keep working. 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter2, &entry2)); 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NULL != entry2); 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_->EndEnumeration(&iter1); 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_->EndEnumeration(&iter2); 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, FixEnumerators) { 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendFixEnumerators(); 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionFixEnumerators) { 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendFixEnumerators(); 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendDoomRecent() { 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry *entry; 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("first", &entry)); 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("second", &entry)); 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddDelay(); 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time middle = Time::Now(); 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("third", &entry)); 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("fourth", &entry)); 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddDelay(); 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time final = Time::Now(); 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(4, cache_->GetEntryCount()); 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(net::OK, DoomEntriesSince(final)); 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(4, cache_->GetEntryCount()); 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(net::OK, DoomEntriesSince(middle)); 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2, cache_->GetEntryCount()); 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry("second", &entry)); 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, DoomRecent) { 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDoomRecent(); 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionDoomRecent) { 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDoomRecent(); 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlyDoomRecent) { 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMemoryOnlyMode(); 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDoomRecent(); 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendDoomBetween() { 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry *entry; 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("first", &entry)); 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddDelay(); 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time middle_start = Time::Now(); 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("second", &entry)); 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("third", &entry)); 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddDelay(); 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time middle_end = Time::Now(); 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("fourth", &entry)); 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry("fourth", &entry)); 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddDelay(); 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time final = Time::Now(); 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(4, cache_->GetEntryCount()); 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(net::OK, DoomEntriesBetween(middle_start, middle_end)); 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2, cache_->GetEntryCount()); 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry("fourth", &entry)); 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(net::OK, DoomEntriesBetween(middle_start, final)); 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, cache_->GetEntryCount()); 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry("first", &entry)); 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, DoomBetween) { 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDoomBetween(); 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionDoomBetween) { 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDoomBetween(); 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlyDoomBetween) { 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMemoryOnlyMode(); 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDoomBetween(); 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendTransaction(const std::string& name, 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_entries, bool load) { 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) success_ = false; 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache(name)); 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 mask; 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (load) { 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mask = 0xf; 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(0x100000); 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear the settings from the previous run. 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mask = 0; 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(0); 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMask(mask); 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(num_entries + 1, cache_->GetEntryCount()); 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key("the first key"); 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry1; 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(net::OK, OpenEntry(key, &entry1)); 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int actual = cache_->GetEntryCount(); 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (num_entries != actual) { 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(load); 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If there is a heavy load, inserting an entry will make another entry 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // dirty (on the hash bucket) so two entries are removed. 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(num_entries - 1, actual); 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete cache_; 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_ = NULL; 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_impl_ = NULL; 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CheckCacheIntegrity(cache_path_, new_eviction_, mask)); 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) success_ = true; 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendRecoverInsert() { 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tests with an empty cache. 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("insert_empty1", 0, false); 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "insert_empty1"; 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("insert_empty2", 0, false); 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "insert_empty2"; 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("insert_empty3", 0, false); 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "insert_empty3"; 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tests with one entry on the cache. 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("insert_one1", 1, false); 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "insert_one1"; 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("insert_one2", 1, false); 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "insert_one2"; 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("insert_one3", 1, false); 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "insert_one3"; 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tests with one hundred entries on the cache, tiny index. 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("insert_load1", 100, true); 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "insert_load1"; 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("insert_load2", 100, true); 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "insert_load2"; 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, RecoverInsert) { 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendRecoverInsert(); 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionRecoverInsert) { 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendRecoverInsert(); 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendRecoverRemove() { 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removing the only element. 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("remove_one1", 0, false); 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "remove_one1"; 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("remove_one2", 0, false); 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "remove_one2"; 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("remove_one3", 0, false); 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "remove_one3"; 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removing the head. 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("remove_head1", 1, false); 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "remove_head1"; 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("remove_head2", 1, false); 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "remove_head2"; 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("remove_head3", 1, false); 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "remove_head3"; 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removing the tail. 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("remove_tail1", 1, false); 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "remove_tail1"; 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("remove_tail2", 1, false); 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "remove_tail2"; 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("remove_tail3", 1, false); 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "remove_tail3"; 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removing with one hundred entries on the cache, tiny index. 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("remove_load1", 100, true); 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "remove_load1"; 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("remove_load2", 100, true); 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "remove_load2"; 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("remove_load3", 100, true); 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "remove_load3"; 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This case cannot be reverted. 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("remove_one4", 0, false); 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "remove_one4"; 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("remove_head4", 1, false); 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "remove_head4"; 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, RecoverRemove) { 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendRecoverRemove(); 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionRecoverRemove) { 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendRecoverRemove(); 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendRecoverWithEviction() { 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) success_ = false; 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("insert_load1")); 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMask(0xf); 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(0x1000); 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should not crash here. 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableIntegrityCheck(); 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, RecoverWithEviction) { 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendRecoverWithEviction(); 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionRecoverWithEviction) { 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendRecoverWithEviction(); 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests dealing with cache files that cannot be recovered. 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheTest, DeleteOld) { 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("wrong_version")); 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Thread cache_thread("CacheThread"); 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(cache_thread.StartWithOptions( 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Thread::Options(MessageLoop::TYPE_IO, 0))); 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestCompletionCallback cb; 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Backend* cache; 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rv = disk_cache::BackendImpl::CreateBackend( 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_path_, true, 0, net::DISK_CACHE, disk_cache::kNoRandom, 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_thread.message_loop_proxy(), NULL, &cache, cb.callback()); 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, cb.GetResult(rv)); 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoopHelper helper; 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NULL != cache); 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0, cache->GetEntryCount()); 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete cache; 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We want to be able to deal with messed up entries on disk. 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntry2() { 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_entry")); 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry *entry1, *entry2; 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry("the first key", &entry1)); 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenEntry("some other key", &entry2)); 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CheckCacheIntegrity will fail at this point. 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableIntegrityCheck(); 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry2) { 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry2(); 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry2) { 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry2(); 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we don't crash or hang when enumerating this cache. 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntry3() { 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMask(0x1); // 2-entry table. 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(0x3000); // 12 kB. 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter = NULL; 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (OpenNextEntry(&iter, &entry) == net::OK) { 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry3) { 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("dirty_entry3")); 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry3(); 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry3) { 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("dirty_entry4")); 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry3(); 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableIntegrityCheck(); 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we handle a dirty entry on the LRU list, already replaced with 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the same key, and with hash collisions. 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry4) { 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("dirty_entry3")); 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMask(0x1); // 2-entry table. 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(0x3000); // 12 kB. 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimForTest(false); 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we handle a dirty entry on the deleted list, already replaced with 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the same key, and with hash collisions. 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry5) { 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("dirty_entry4")); 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMask(0x1); // 2-entry table. 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(0x3000); // 12 kB. 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimDeletedListForTest(false); 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry6) { 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("dirty_entry5")); 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMask(0x1); // 2-entry table. 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(0x3000); // 12 kB. 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There is a dirty entry (but marked as clean) at the end, pointing to a 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // deleted entry through the hash collision list. We should not re-insert the 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // deleted entry into the index table. 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimForTest(false); 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The cache should be clean (as detected by CheckCacheIntegrity). 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we don't hang when there is a loop on the hash collision list. 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The test cache could be a result of bug 69135. 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, BadNextEntry1) { 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("list_loop2")); 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMask(0x1); // 2-entry table. 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(0x3000); // 12 kB. 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The second entry points at itselft, and the first entry is not accessible 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // though the index, but it is at the head of the LRU. 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("The first key", &entry)); 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimForTest(false); 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimForTest(false); 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry("The first key", &entry)); 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we don't hang when there is a loop on the hash collision list. 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The test cache could be a result of bug 69135. 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, BadNextEntry2) { 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("list_loop3")); 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMask(0x1); // 2-entry table. 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(0x3000); // 12 kB. 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There is a wide loop of 5 entries. 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(net::OK, OpenEntry("Not present key", &entry)); 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry6) { 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_rankings3")); 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The second entry is dirty, but removing it should not corrupt the list. 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(net::OK, OpenEntry("the second key", &entry)); 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry("the first key", &entry)); 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should not delete the cache. 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Doom(); 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry("some other key", &entry)); 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests handling of corrupt entries by keeping the rankings node around, with 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a fatal failure. 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntry7() { 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSize = 0x3000; // 12 kB. 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(kSize * 10); 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string first("some key"); 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string second("something else"); 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(first, &entry)); 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(second, &entry)); 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Corrupt this entry. 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::EntryImpl* entry_impl = 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<disk_cache::EntryImpl*>(entry); 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_impl->rankings()->Data()->next = 0; 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_impl->rankings()->Store(); 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, cache_->GetEntryCount()); 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should detect the bad entry. 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenEntry(second, &entry)); 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should delete the cache. The list still has a corrupt node. 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter = NULL; 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry)); 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, cache_->GetEntryCount()); 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry7) { 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry7(); 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry7) { 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry7(); 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests handling of corrupt entries by keeping the rankings node around, with 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a non fatal failure. 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntry8() { 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSize = 0x3000; // 12 kB 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(kSize * 10); 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string first("some key"); 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string second("something else"); 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(first, &entry)); 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(second, &entry)); 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Corrupt this entry. 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::EntryImpl* entry_impl = 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<disk_cache::EntryImpl*>(entry); 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_impl->rankings()->Data()->contents = 0; 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_impl->rankings()->Store(); 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, cache_->GetEntryCount()); 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should detect the bad entry. 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenEntry(second, &entry)); 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should not delete the cache. 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter = NULL; 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry)); 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry)); 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry8) { 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry8(); 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry8) { 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry8(); 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests handling of corrupt entries detected by enumerations. Note that these 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tests (xx9 to xx11) are basically just going though slightly different 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// codepaths so they are tighlty coupled with the code, but that is better than 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// not testing error handling code. 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntry9(bool eviction) { 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSize = 0x3000; // 12 kB. 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(kSize * 10); 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string first("some key"); 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string second("something else"); 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(first, &entry)); 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(second, &entry)); 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Corrupt this entry. 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::EntryImpl* entry_impl = 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<disk_cache::EntryImpl*>(entry); 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_impl->entry()->Data()->state = 0xbad; 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_impl->entry()->Store(); 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, cache_->GetEntryCount()); 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (eviction) { 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimForTest(false); 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimForTest(false); 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should detect the problem through the list, but we should not delete 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the entry, just fail the iteration. 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter = NULL; 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry)); 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now a full iteration will work, and return one entry. 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry)); 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry)); 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should detect what's left of the bad entry. 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenEntry(second, &entry)); 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, cache_->GetEntryCount()); 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableIntegrityCheck(); 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry9) { 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry9(false); 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry9) { 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry9(false); 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, TrimInvalidEntry9) { 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry9(true); 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionTrimInvalidEntry9) { 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry9(true); 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests handling of corrupt entries detected by enumerations. 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntry10(bool eviction) { 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSize = 0x3000; // 12 kB. 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(kSize * 10); 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string first("some key"); 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string second("something else"); 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(first, &entry)); 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(first, &entry)); 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, WriteData(entry, 0, 200, NULL, 0, false)); 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(second, &entry)); 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Corrupt this entry. 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::EntryImpl* entry_impl = 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<disk_cache::EntryImpl*>(entry); 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_impl->entry()->Data()->state = 0xbad; 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_impl->entry()->Store(); 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("third", &entry)); 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, cache_->GetEntryCount()); 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We have: 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // List 0: third -> second (bad). 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // List 1: first. 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (eviction) { 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Detection order: second -> first -> third. 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimForTest(false); 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, cache_->GetEntryCount()); 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimForTest(false); 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, cache_->GetEntryCount()); 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimForTest(false); 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Detection order: third -> second -> first. 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should detect the problem through the list, but we should not delete 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the entry. 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter = NULL; 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry)); 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry)); 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(first, entry->GetKey()); 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry)); 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableIntegrityCheck(); 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry10) { 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry10(false); 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, TrimInvalidEntry10) { 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry10(true); 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests handling of corrupt entries detected by enumerations. 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntry11(bool eviction) { 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSize = 0x3000; // 12 kB. 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(kSize * 10); 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string first("some key"); 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string second("something else"); 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(first, &entry)); 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(first, &entry)); 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, WriteData(entry, 0, 200, NULL, 0, false)); 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(second, &entry)); 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(second, &entry)); 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, WriteData(entry, 0, 200, NULL, 0, false)); 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Corrupt this entry. 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::EntryImpl* entry_impl = 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<disk_cache::EntryImpl*>(entry); 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_impl->entry()->Data()->state = 0xbad; 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_impl->entry()->Store(); 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("third", &entry)); 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, cache_->GetEntryCount()); 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We have: 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // List 0: third. 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // List 1: second (bad) -> first. 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (eviction) { 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Detection order: third -> first -> second. 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimForTest(false); 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, cache_->GetEntryCount()); 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimForTest(false); 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimForTest(false); 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Detection order: third -> second. 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should detect the problem through the list, but we should not delete 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the entry, just fail the iteration. 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter = NULL; 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry)); 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry)); 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now a full iteration will work, and return two entries. 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry)); 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry)); 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry)); 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableIntegrityCheck(); 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry11) { 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry11(false); 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, TrimInvalidEntry11) { 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry11(true); 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests handling of corrupt entries in the middle of a long eviction run. 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendTrimInvalidEntry12() { 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSize = 0x3000; // 12 kB 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(kSize * 10); 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string first("some key"); 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string second("something else"); 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(first, &entry)); 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(second, &entry)); 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Corrupt this entry. 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::EntryImpl* entry_impl = 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<disk_cache::EntryImpl*>(entry); 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_impl->entry()->Data()->state = 0xbad; 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_impl->entry()->Store(); 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("third", &entry)); 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("fourth", &entry)); 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimForTest(true); 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableIntegrityCheck(); 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, TrimInvalidEntry12) { 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTrimInvalidEntry12(); 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionTrimInvalidEntry12) { 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTrimInvalidEntry12(); 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We want to be able to deal with messed up entries on disk. 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidRankings2() { 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_rankings")); 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry *entry1, *entry2; 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenEntry("the first key", &entry1)); 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry("some other key", &entry2)); 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CheckCacheIntegrity will fail at this point. 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableIntegrityCheck(); 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidRankings2) { 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidRankings2(); 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidRankings2) { 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidRankings2(); 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If the LRU is corrupt, we delete the cache. 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidRankings() { 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter = NULL; 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry)); 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, cache_->GetEntryCount()); 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry)); 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); // Allow the restart to finish. 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, cache_->GetEntryCount()); 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidRankingsSuccess) { 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_rankings")); 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidRankings(); 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidRankingsSuccess) { 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_rankings")); 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidRankings(); 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidRankingsFailure) { 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_rankings")); 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetTestMode(); // Fail cache reinitialization. 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidRankings(); 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidRankingsFailure) { 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_rankings")); 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetTestMode(); // Fail cache reinitialization. 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidRankings(); 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If the LRU is corrupt and we have open entries, we disable the cache. 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendDisable() { 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry *entry1, *entry2; 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter = NULL; 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry1)); 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry2)); 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, cache_->GetEntryCount()); 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, CreateEntry("Something new", &entry2)); 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); // Flushing the Close posts a task to restart the cache. 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); // This one actually allows that task to complete. 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, cache_->GetEntryCount()); 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, DisableSuccess) { 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_rankings")); 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDisable(); 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionDisableSuccess) { 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_rankings")); 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDisable(); 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, DisableFailure) { 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_rankings")); 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetTestMode(); // Fail cache reinitialization. 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDisable(); 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionDisableFailure) { 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_rankings")); 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetTestMode(); // Fail cache reinitialization. 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDisable(); 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is another type of corruption on the LRU; disable the cache. 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendDisable2() { 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(8, cache_->GetEntryCount()); 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter = NULL; 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int count = 0; 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (OpenNextEntry(&iter, &entry) == net::OK) { 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NULL != entry); 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) count++; 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LT(count, 9); 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, cache_->GetEntryCount()); 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, DisableSuccess2) { 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("list_loop")); 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDisable2(); 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionDisableSuccess2) { 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("list_loop")); 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDisable2(); 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, DisableFailure2) { 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("list_loop")); 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetTestMode(); // Fail cache reinitialization. 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDisable2(); 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionDisableFailure2) { 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("list_loop")); 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetTestMode(); // Fail cache reinitialization. 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDisable2(); 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If the index size changes when we disable the cache, we should not crash. 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendDisable3() { 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry *entry1, *entry2; 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter = NULL; 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, cache_->GetEntryCount()); 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry1)); 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry2)); 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("Something new", &entry2)); 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, DisableSuccess3) { 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_rankings2")); 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(20 * 1024 * 1024); 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDisable3(); 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionDisableSuccess3) { 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_rankings2")); 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(20 * 1024 * 1024); 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDisable3(); 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If we disable the cache, already open entries should work as far as possible. 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendDisable4() { 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry *entry1, *entry2, *entry3, *entry4; 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter = NULL; 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry1)); 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char key2[2000]; 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char key3[20000]; 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CacheTestFillBuffer(key2, sizeof(key2), true); 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CacheTestFillBuffer(key3, sizeof(key3), true); 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key2[sizeof(key2) - 1] = '\0'; 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key3[sizeof(key3) - 1] = '\0'; 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(key2, &entry2)); 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(key3, &entry3)); 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBufSize = 20000; 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kBufSize)); 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(buf->data(), 0, kBufSize); 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(100, WriteData(entry2, 0, 0, buf, 100, false)); 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kBufSize, WriteData(entry3, 0, 0, buf, kBufSize, false)); 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This line should disable the cache but not delete it. 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry4)); 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, cache_->GetEntryCount()); 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, CreateEntry("cache is disabled", &entry4)); 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(100, ReadData(entry2, 0, 0, buf, 100)); 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(100, WriteData(entry2, 0, 0, buf, 100, false)); 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(100, WriteData(entry2, 1, 0, buf, 100, false)); 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kBufSize, ReadData(entry3, 0, 0, buf, kBufSize)); 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kBufSize, WriteData(entry3, 0, 0, buf, kBufSize, false)); 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kBufSize, WriteData(entry3, 1, 0, buf, kBufSize, false)); 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key = entry2->GetKey(); 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(sizeof(key2) - 1, key.size()); 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key = entry3->GetKey(); 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(sizeof(key3) - 1, key.size()); 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry3->Close(); 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); // Flushing the Close posts a task to restart the cache. 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); // This one actually allows that task to complete. 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, cache_->GetEntryCount()); 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, DisableSuccess4) { 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_rankings")); 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDisable4(); 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionDisableSuccess4) { 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_rankings")); 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDisable4(); 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheTest, Backend_UsageStats) { 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoopHelper helper; 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CleanupCacheDir()); 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<disk_cache::BackendImpl> cache; 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.reset(new disk_cache::BackendImpl( 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_path_, base::MessageLoopProxy::current(), 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NULL != cache.get()); 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache->SetUnitTestMode(); 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, cache->SyncInit()); 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for a callback that never comes... about 2 secs :). The message loop 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // has to run to allow invocation of the usage timer. 22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) helper.WaitUntilCacheIoFinished(1); 22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendDoomAll() { 22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry *entry1, *entry2; 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("first", &entry1)); 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("second", &entry2)); 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("third", &entry1)); 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("fourth", &entry2)); 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(4, cache_->GetEntryCount()); 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(net::OK, DoomAllEntries()); 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0, cache_->GetEntryCount()); 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should stop posting tasks at some point (if we post any). 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->RunAllPending(); 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry *entry3, *entry4; 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("third", &entry3)); 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("fourth", &entry4)); 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(net::OK, DoomAllEntries()); 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0, cache_->GetEntryCount()); 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry3->Doom(); // The entry should be already doomed, but this must work. 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry3->Close(); 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry4->Close(); 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now try with all references released. 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("third", &entry1)); 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("fourth", &entry2)); 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2, cache_->GetEntryCount()); 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(net::OK, DoomAllEntries()); 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0, cache_->GetEntryCount()); 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(net::OK, DoomAllEntries()); 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, DoomAll) { 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDoomAll(); 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionDoomAll) { 23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDoomAll(); 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlyDoomAll) { 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMemoryOnlyMode(); 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDoomAll(); 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, AppCacheOnlyDoomAll) { 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetCacheType(net::APP_CACHE); 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDoomAll(); 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If the index size changes when we doom the cache, we should not crash. 23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendDoomAll2() { 23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, cache_->GetEntryCount()); 23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(net::OK, DoomAllEntries()); 23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("Something new", &entry)); 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, DoomAll2) { 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_rankings2")); 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(20 * 1024 * 1024); 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDoomAll2(); 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionDoomAll2) { 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_rankings2")); 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(20 * 1024 * 1024); 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDoomAll2(); 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We should be able to create the same entry on multiple simultaneous instances 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of the cache. 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheTest, MultipleInstances) { 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedTempDir store1, store2; 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(store1.CreateUniqueTempDir()); 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(store2.CreateUniqueTempDir()); 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Thread cache_thread("CacheThread"); 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(cache_thread.StartWithOptions( 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Thread::Options(MessageLoop::TYPE_IO, 0))); 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestCompletionCallback cb; 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kNumberOfCaches = 2; 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Backend* cache[kNumberOfCaches]; 23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rv = disk_cache::BackendImpl::CreateBackend( 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) store1.path(), false, 0, net::DISK_CACHE, disk_cache::kNone, 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_thread.message_loop_proxy(), NULL, &cache[0], cb.callback()); 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, cb.GetResult(rv)); 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = disk_cache::BackendImpl::CreateBackend( 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) store2.path(), false, 0, net::MEDIA_CACHE, disk_cache::kNone, 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_thread.message_loop_proxy(), NULL, &cache[1], cb.callback()); 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, cb.GetResult(rv)); 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(cache[0] != NULL && cache[1] != NULL); 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key("the first key"); 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumberOfCaches; i++) { 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = cache[i]->CreateEntry(key, &entry, cb.callback()); 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, cb.GetResult(rv)); 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete cache[0]; 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete cache[1]; 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the six regions of the curve that determines the max cache size. 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheTest, AutomaticMaxSize) { 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kDefaultSize = 80 * 1024 * 1024; 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 large_size = kDefaultSize; 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 largest_size = kint32max; 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Region 1: expected = available * 0.8 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ((kDefaultSize - 1) * 8 / 10, 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::PreferedCacheSize(large_size - 1)); 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDefaultSize * 8 / 10, 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::PreferedCacheSize(large_size)); 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDefaultSize - 1, 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::PreferedCacheSize(large_size * 10 / 8 - 1)); 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Region 2: expected = default_size 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDefaultSize, 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::PreferedCacheSize(large_size * 10 / 8)); 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDefaultSize, 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::PreferedCacheSize(large_size * 10 - 1)); 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Region 3: expected = available * 0.1 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDefaultSize, 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::PreferedCacheSize(large_size * 10)); 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ((kDefaultSize * 25 - 1) / 10, 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::PreferedCacheSize(large_size * 25 - 1)); 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Region 4: expected = default_size * 2.5 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDefaultSize * 25 / 10, 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::PreferedCacheSize(large_size * 25)); 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDefaultSize * 25 / 10, 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::PreferedCacheSize(large_size * 100 - 1)); 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDefaultSize * 25 / 10, 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::PreferedCacheSize(large_size * 100)); 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDefaultSize * 25 / 10, 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::PreferedCacheSize(large_size * 250 - 1)); 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Region 5: expected = available * 0.1 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDefaultSize * 25 / 10, 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::PreferedCacheSize(large_size * 250)); 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kint32max - 1, 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::PreferedCacheSize(largest_size * 100 - 1)); 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Region 6: expected = kint32max 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kint32max, 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::PreferedCacheSize(largest_size * 100)); 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kint32max, 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::PreferedCacheSize(largest_size * 10000)); 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we can "migrate" a running instance from one experiment group to 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// another. 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, Histograms) { 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::BackendImpl* backend_ = cache_impl_; // Needed be the macro. 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 1; i < 3; i++) { 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CACHE_UMA(HOURS, "FillupTime", i, 28); 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure that we keep the total memory used by the internal buffers under 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// control. 24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, TotalBuffersSize1) { 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key("the first key"); 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSize = 200; 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CacheTestFillBuffer(buffer->data(), kSize, true); 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 10; i++) { 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE(i); 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allocate 2MB for this entry. 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, true)); 24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSize, WriteData(entry, 1, 0, buffer, kSize, true)); 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSize, WriteData(entry, 0, 1024 * 1024, buffer, kSize, false)); 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSize, WriteData(entry, 1, 1024 * 1024, buffer, kSize, false)); 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete one of the buffers and truncate the other. 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, WriteData(entry, 0, 0, buffer, 0, true)); 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, WriteData(entry, 1, 10, buffer, 0, true)); 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete the second buffer, writing 10 bytes to disk. 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, cache_impl_->GetTotalBuffersSize()); 24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test assumes at least 150MB of system memory. 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, TotalBuffersSize2) { 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kOneMB = 1024 * 1024; 24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(cache_impl_->IsAllocAllowed(0, kOneMB)); 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kOneMB, cache_impl_->GetTotalBuffersSize()); 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(cache_impl_->IsAllocAllowed(0, kOneMB)); 24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kOneMB * 2, cache_impl_->GetTotalBuffersSize()); 24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(cache_impl_->IsAllocAllowed(0, kOneMB)); 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kOneMB * 3, cache_impl_->GetTotalBuffersSize()); 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_impl_->BufferDeleted(kOneMB); 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kOneMB * 2, cache_impl_->GetTotalBuffersSize()); 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the upper limit. 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(cache_impl_->IsAllocAllowed(0, 30 * kOneMB)); 25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 30; i++) 25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_impl_->IsAllocAllowed(0, kOneMB); // Ignore the result. 25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(cache_impl_->IsAllocAllowed(0, kOneMB)); 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that sharing of external files works and we are able to delete the 25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// files when we need to. 25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, FileSharing) { 25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Addr address(0x80000001); 25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(cache_impl_->CreateExternalFile(&address)); 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FilePath name = cache_impl_->GetFileName(address); 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<disk_cache::File> file(new disk_cache::File(false)); 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file->Init(name); 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DWORD sharing = FILE_SHARE_READ | FILE_SHARE_WRITE; 25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DWORD access = GENERIC_READ | GENERIC_WRITE; 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::ScopedHandle file2(CreateFile( 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name.value().c_str(), access, sharing, NULL, OPEN_EXISTING, 0, NULL)); 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(file2.IsValid()); 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sharing |= FILE_SHARE_DELETE; 25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file2.Set(CreateFile(name.value().c_str(), access, sharing, NULL, 25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OPEN_EXISTING, 0, NULL)); 25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(file2.IsValid()); 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(file_util::Delete(name, false)); 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should be able to use the file. 25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSize = 200; 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char buffer1[kSize]; 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char buffer2[kSize]; 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(buffer1, 't', kSize); 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(buffer2, 0, kSize); 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(file->Write(buffer1, kSize, 0)); 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(file->Read(buffer2, kSize, 0)); 25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(buffer1, buffer2, kSize)); 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(disk_cache::DeleteCacheFile(name)); 25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, UpdateRankForExternalCacheHit) { 25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDirectMode(); 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 2; ++i) { 25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key = StringPrintf("key%d", i); 25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ping the oldest entry. 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_->OnExternalCacheHit("key0"); 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimForTest(false); 25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the older key remains. 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry("key0", &entry)); 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2578