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