13f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/basictypes.h" 63f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/threading/platform_thread.h" 7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/timer.h" 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/string_util.h" 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/io_buffer.h" 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/net_errors.h" 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/test_completion_callback.h" 123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/disk_cache/backend_impl.h" 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/disk_cache/disk_cache_test_base.h" 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/disk_cache/disk_cache_test_util.h" 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/disk_cache/entry_impl.h" 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/disk_cache/mem_entry_impl.h" 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/gtest/include/gtest/gtest.h" 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottusing base::Time; 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottextern volatile int g_cache_tests_received; 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottextern volatile bool g_cache_tests_error; 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Tests that can run with different types of caches. 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass DiskCacheEntryTest : public DiskCacheTestWithCache { 263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public: 273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void InternalSyncIOBackground(disk_cache::Entry* entry); 283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void ExternalSyncIOBackground(disk_cache::Entry* entry); 293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott protected: 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void InternalSyncIO(); 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void InternalAsyncIO(); 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void ExternalSyncIO(); 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void ExternalAsyncIO(); 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void StreamAccess(); 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void GetKey(); 373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void GetTimes(); 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void GrowData(); 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void TruncateData(); 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void ZeroLengthIO(); 413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void Buffering(); 423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void SizeChanges(); 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void ReuseEntry(int size); 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void InvalidData(); 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void DoomNormalEntry(); 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void DoomedEntry(); 473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void BasicSparseIO(); 483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void HugeSparseIO(); 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void GetAvailableRange(); 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void CouldBeSparse(); 5121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen void UpdateSparseEntry(); 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void DoomSparseEntry(); 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void PartialSparseEntry(); 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Simple task to run part of a test from the cache thread. 573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass SyncIOTask : public Task { 583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public: 593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SyncIOTask(DiskCacheEntryTest* test, disk_cache::Entry* entry) 603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick : test_(test), entry_(entry) {} 613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick protected: 633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DiskCacheEntryTest* test_; 643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick disk_cache::Entry* entry_; 653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}; 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass InternalSyncIOTask : public SyncIOTask { 683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public: 693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick InternalSyncIOTask(DiskCacheEntryTest* test, disk_cache::Entry* entry) 703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick : SyncIOTask(test, entry) {} 713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual void Run() { 733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick test_->InternalSyncIOBackground(entry_); 743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}; 763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// This part of the test runs on the background thread. 783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid DiskCacheEntryTest::InternalSyncIOBackground(disk_cache::Entry* entry) { 79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize1 = 10; 80513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize1)); 81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(buffer1->data(), kSize1, false); 823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, entry->ReadData(0, 0, buffer1, kSize1, NULL)); 83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base::strlcpy(buffer1->data(), "the data", kSize1); 843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(10, entry->WriteData(0, 0, buffer1, kSize1, NULL, false)); 85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(buffer1->data(), 0, kSize1); 863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(10, entry->ReadData(0, 0, buffer1, kSize1, NULL)); 87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_STREQ("the data", buffer1->data()); 88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize2 = 5000; 90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize3 = 10000; 91513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize2)); 92513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer3(new net::IOBuffer(kSize3)); 93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(buffer3->data(), 0, kSize3); 94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(buffer2->data(), kSize2, false); 95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base::strlcpy(buffer2->data(), "The really big data goes here", kSize2); 963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(5000, entry->WriteData(1, 1500, buffer2, kSize2, NULL, false)); 97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(buffer2->data(), 0, kSize2); 983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(4989, entry->ReadData(1, 1511, buffer2, kSize2, NULL)); 99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_STREQ("big data goes here", buffer2->data()); 1003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(5000, entry->ReadData(1, 0, buffer2, kSize2, NULL)); 101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, memcmp(buffer2->data(), buffer3->data(), 1500)); 1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(1500, entry->ReadData(1, 5000, buffer2, kSize2, NULL)); 103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, entry->ReadData(1, 6500, buffer2, kSize2, NULL)); 1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(6500, entry->ReadData(1, 0, buffer3, kSize3, NULL)); 1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(8192, entry->WriteData(1, 0, buffer3, 8192, NULL, false)); 1073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(8192, entry->ReadData(1, 0, buffer3, kSize3, NULL)); 1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(8192, entry->GetDataSize(1)); 109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // We need to delete the memory buffer on this thread. 1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, entry->WriteData(0, 0, NULL, 0, NULL, true)); 1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, entry->WriteData(1, 0, NULL, 0, NULL, true)); 1133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 1143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// We need to support synchronous IO even though it is not a supported operation 1163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// from the point of view of the disk cache's public interface, because we use 1173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// it internally, not just by a few tests, but as part of the implementation 1183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// (see sparse_control.cc, for example). 1193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid DiskCacheEntryTest::InternalSyncIO() { 1203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick disk_cache::Entry* entry = NULL; 1213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, CreateEntry("the first key", &entry)); 1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(NULL != entry); 1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // The bulk of the test runs from within the task, on the cache thread. 1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RunTaskForTest(new InternalSyncIOTask(this, entry)); 1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Doom(); 1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FlushQueueForTest(); 130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, cache_->GetEntryCount()); 131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, InternalSyncIO) { 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetDirectMode(); 135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InternalSyncIO(); 137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, MemoryOnlyInternalSyncIO) { 140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMemoryOnlyMode(); 141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InternalSyncIO(); 143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheEntryTest::InternalAsyncIO() { 1463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick disk_cache::Entry* entry = NULL; 1473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, CreateEntry("the first key", &entry)); 1483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(NULL != entry); 149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Avoid using internal buffers for the test. We have to write something to 151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // the entry and close it so that we flush the internal buffer to disk. After 152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // that, IO operations will be really hitting the disk. We don't care about 153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // the content, so just extending the entry is enough (all extensions zero- 154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // fill any holes). 1553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, WriteData(entry, 0, 15 * 1024, NULL, 0, false)); 1563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, WriteData(entry, 1, 15 * 1024, NULL, 0, false)); 1573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 1583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, OpenEntry("the first key", &entry)); 159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Let's verify that each IO goes to the right callback object. 161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CallbackTest callback1(false); 162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CallbackTest callback2(false); 163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CallbackTest callback3(false); 164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CallbackTest callback4(false); 165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CallbackTest callback5(false); 166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CallbackTest callback6(false); 167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CallbackTest callback7(false); 168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CallbackTest callback8(false); 169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CallbackTest callback9(false); 170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CallbackTest callback10(false); 171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CallbackTest callback11(false); 172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CallbackTest callback12(false); 173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CallbackTest callback13(false); 174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott g_cache_tests_error = false; 176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott g_cache_tests_received = 0; 177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott MessageLoopHelper helper; 179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize1 = 10; 181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize2 = 5000; 182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize3 = 10000; 183513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize1)); 184513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize2)); 185513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer3(new net::IOBuffer(kSize3)); 186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(buffer1->data(), kSize1, false); 187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(buffer2->data(), kSize2, false); 188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(buffer3->data(), kSize3, false); 189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, entry->ReadData(0, 15 * 1024, buffer1, kSize1, &callback1)); 191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base::strlcpy(buffer1->data(), "the data", kSize1); 192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int expected = 0; 1933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int ret = entry->WriteData(0, 0, buffer1, kSize1, &callback2, false); 194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(10 == ret || net::ERR_IO_PENDING == ret); 195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (net::ERR_IO_PENDING == ret) 196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott expected++; 197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); 199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(buffer2->data(), 0, kSize2); 2003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ret = entry->ReadData(0, 0, buffer2, kSize1, &callback3); 201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(10 == ret || net::ERR_IO_PENDING == ret); 202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (net::ERR_IO_PENDING == ret) 203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott expected++; 204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); 206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_STREQ("the data", buffer2->data()); 207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base::strlcpy(buffer2->data(), "The really big data goes here", kSize2); 2093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ret = entry->WriteData(1, 1500, buffer2, kSize2, &callback4, true); 210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(5000 == ret || net::ERR_IO_PENDING == ret); 211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (net::ERR_IO_PENDING == ret) 212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott expected++; 213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); 215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(buffer3->data(), 0, kSize3); 2163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ret = entry->ReadData(1, 1511, buffer3, kSize2, &callback5); 217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(4989 == ret || net::ERR_IO_PENDING == ret); 218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (net::ERR_IO_PENDING == ret) 219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott expected++; 220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); 222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_STREQ("big data goes here", buffer3->data()); 2233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ret = entry->ReadData(1, 0, buffer2, kSize2, &callback6); 224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(5000 == ret || net::ERR_IO_PENDING == ret); 225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (net::ERR_IO_PENDING == ret) 226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott expected++; 227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(buffer3->data(), 0, kSize3); 229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); 231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, memcmp(buffer2->data(), buffer3->data(), 1500)); 2323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ret = entry->ReadData(1, 5000, buffer2, kSize2, &callback7); 233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(1500 == ret || net::ERR_IO_PENDING == ret); 234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (net::ERR_IO_PENDING == ret) 235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott expected++; 236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ret = entry->ReadData(1, 0, buffer3, kSize3, &callback9); 238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(6500 == ret || net::ERR_IO_PENDING == ret); 239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (net::ERR_IO_PENDING == ret) 240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott expected++; 241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ret = entry->WriteData(1, 0, buffer3, 8192, &callback10, true); 243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(8192 == ret || net::ERR_IO_PENDING == ret); 244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (net::ERR_IO_PENDING == ret) 245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott expected++; 246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); 2483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ret = entry->ReadData(1, 0, buffer3, kSize3, &callback11); 249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(8192 == ret || net::ERR_IO_PENDING == ret); 250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (net::ERR_IO_PENDING == ret) 251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott expected++; 252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(8192, entry->GetDataSize(1)); 254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ret = entry->ReadData(0, 0, buffer1, kSize1, &callback12); 256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(10 == ret || net::ERR_IO_PENDING == ret); 257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (net::ERR_IO_PENDING == ret) 258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott expected++; 259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ret = entry->ReadData(1, 0, buffer2, kSize2, &callback13); 261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(5000 == ret || net::ERR_IO_PENDING == ret); 262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (net::ERR_IO_PENDING == ret) 263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott expected++; 264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); 266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_FALSE(g_cache_tests_error); 268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(expected, g_cache_tests_received); 269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Doom(); 2713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FlushQueueForTest(); 273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, cache_->GetEntryCount()); 274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 275c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, InternalAsyncIO) { 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetDirectMode(); 278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InternalAsyncIO(); 280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, MemoryOnlyInternalAsyncIO) { 283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMemoryOnlyMode(); 284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InternalAsyncIO(); 286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass ExternalSyncIOTask : public SyncIOTask { 2893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public: 2903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ExternalSyncIOTask(DiskCacheEntryTest* test, disk_cache::Entry* entry) 2913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick : SyncIOTask(test, entry) {} 292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual void Run() { 2943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick test_->ExternalSyncIOBackground(entry_); 2953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 2963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}; 2973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// This part of the test runs on the background thread. 2993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid DiskCacheEntryTest::ExternalSyncIOBackground(disk_cache::Entry* entry) { 300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize1 = 17000; 301c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize2 = 25000; 302513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize1)); 303513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize2)); 304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(buffer1->data(), kSize1, false); 305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(buffer2->data(), kSize2, false); 306c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base::strlcpy(buffer1->data(), "the data", kSize1); 3073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(17000, entry->WriteData(0, 0, buffer1, kSize1, NULL, false)); 308c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(buffer1->data(), 0, kSize1); 3093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(17000, entry->ReadData(0, 0, buffer1, kSize1, NULL)); 310c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_STREQ("the data", buffer1->data()); 311c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 312c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base::strlcpy(buffer2->data(), "The really big data goes here", kSize2); 3133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(25000, entry->WriteData(1, 10000, buffer2, kSize2, NULL, false)); 314c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(buffer2->data(), 0, kSize2); 3153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(24989, entry->ReadData(1, 10011, buffer2, kSize2, NULL)); 316c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_STREQ("big data goes here", buffer2->data()); 3173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(25000, entry->ReadData(1, 0, buffer2, kSize2, NULL)); 318c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, memcmp(buffer2->data(), buffer2->data(), 10000)); 3193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(5000, entry->ReadData(1, 30000, buffer2, kSize2, NULL)); 320c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, entry->ReadData(1, 35000, buffer2, kSize2, NULL)); 3223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(17000, entry->ReadData(1, 0, buffer1, kSize1, NULL)); 3233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(17000, entry->WriteData(1, 20000, buffer1, kSize1, NULL, false)); 3243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(37000, entry->GetDataSize(1)); 325c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // We need to delete the memory buffer on this thread. 3273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, entry->WriteData(0, 0, NULL, 0, NULL, true)); 3283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, entry->WriteData(1, 0, NULL, 0, NULL, true)); 3293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 3303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid DiskCacheEntryTest::ExternalSyncIO() { 3323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick disk_cache::Entry* entry; 3333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, CreateEntry("the first key", &entry)); 3343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // The bulk of the test runs from within the task, on the cache thread. 3363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RunTaskForTest(new ExternalSyncIOTask(this, entry)); 3373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Doom(); 3393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FlushQueueForTest(); 341c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, cache_->GetEntryCount()); 342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, ExternalSyncIO) { 345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetDirectMode(); 346c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 347c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ExternalSyncIO(); 348c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 349c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3503345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheEntryTest, ExternalSyncIONoBuffer) { 3513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetDirectMode(); 3523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick InitCache(); 3533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick cache_impl_->SetFlags(disk_cache::kNoBuffering); 3543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ExternalSyncIO(); 3553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 3563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 357c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, MemoryOnlyExternalSyncIO) { 358c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMemoryOnlyMode(); 359c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 360c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ExternalSyncIO(); 361c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 362c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 363c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheEntryTest::ExternalAsyncIO() { 3643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick disk_cache::Entry* entry; 3653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, CreateEntry("the first key", &entry)); 366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 367c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Let's verify that each IO goes to the right callback object. 368c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CallbackTest callback1(false); 369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CallbackTest callback2(false); 370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CallbackTest callback3(false); 371c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CallbackTest callback4(false); 372c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CallbackTest callback5(false); 373c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CallbackTest callback6(false); 374c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CallbackTest callback7(false); 375c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CallbackTest callback8(false); 376c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CallbackTest callback9(false); 377c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 378c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott g_cache_tests_error = false; 379c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott g_cache_tests_received = 0; 380c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int expected = 0; 381c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 382c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott MessageLoopHelper helper; 383c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 384c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize1 = 17000; 385c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize2 = 25000; 386c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize3 = 25000; 387513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize1)); 388513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize2)); 389513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer3(new net::IOBuffer(kSize3)); 390c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(buffer1->data(), kSize1, false); 391c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(buffer2->data(), kSize2, false); 392c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(buffer3->data(), kSize3, false); 393c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base::strlcpy(buffer1->data(), "the data", kSize1); 3943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int ret = entry->WriteData(0, 0, buffer1, kSize1, &callback1, false); 395c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(17000 == ret || net::ERR_IO_PENDING == ret); 396c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (net::ERR_IO_PENDING == ret) 397c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott expected++; 398c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 399c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); 400c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 401c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(buffer2->data(), 0, kSize1); 4023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ret = entry->ReadData(0, 0, buffer2, kSize1, &callback2); 403c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(17000 == ret || net::ERR_IO_PENDING == ret); 404c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (net::ERR_IO_PENDING == ret) 405c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott expected++; 406c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 407c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); 408c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_STREQ("the data", buffer1->data()); 409c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 410c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base::strlcpy(buffer2->data(), "The really big data goes here", kSize2); 4113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ret = entry->WriteData(1, 10000, buffer2, kSize2, &callback3, false); 412c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(25000 == ret || net::ERR_IO_PENDING == ret); 413c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (net::ERR_IO_PENDING == ret) 414c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott expected++; 415c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 416c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); 417c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 418c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(buffer3->data(), 0, kSize3); 4193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ret = entry->ReadData(1, 10011, buffer3, kSize3, &callback4); 420c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(24989 == ret || net::ERR_IO_PENDING == ret); 421c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (net::ERR_IO_PENDING == ret) 422c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott expected++; 423c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 424c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); 425c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_STREQ("big data goes here", buffer3->data()); 4263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ret = entry->ReadData(1, 0, buffer2, kSize2, &callback5); 427c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(25000 == ret || net::ERR_IO_PENDING == ret); 428c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (net::ERR_IO_PENDING == ret) 429c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott expected++; 430c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 431c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); 432c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, memcmp(buffer2->data(), buffer2->data(), 10000)); 4333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ret = entry->ReadData(1, 30000, buffer2, kSize2, &callback6); 434c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(5000 == ret || net::ERR_IO_PENDING == ret); 435c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (net::ERR_IO_PENDING == ret) 436c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott expected++; 437c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 4383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, entry->ReadData(1, 35000, buffer2, kSize2, &callback7)); 4393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ret = entry->ReadData(1, 0, buffer1, kSize1, &callback8); 440c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(17000 == ret || net::ERR_IO_PENDING == ret); 441c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (net::ERR_IO_PENDING == ret) 442c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott expected++; 4433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ret = entry->WriteData(1, 20000, buffer1, kSize1, &callback9, false); 444c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(17000 == ret || net::ERR_IO_PENDING == ret); 445c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (net::ERR_IO_PENDING == ret) 446c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott expected++; 447c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 448c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); 4493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(37000, entry->GetDataSize(1)); 450c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 451c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_FALSE(g_cache_tests_error); 452c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(expected, g_cache_tests_received); 453c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 4543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Doom(); 4553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FlushQueueForTest(); 457c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, cache_->GetEntryCount()); 458c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 459c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 460c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, ExternalAsyncIO) { 461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetDirectMode(); 462c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 463c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ExternalAsyncIO(); 464c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 465c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 4663345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheEntryTest, ExternalAsyncIONoBuffer) { 4673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetDirectMode(); 4683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick InitCache(); 4693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick cache_impl_->SetFlags(disk_cache::kNoBuffering); 4703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ExternalAsyncIO(); 4713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 4723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 473c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, MemoryOnlyExternalAsyncIO) { 474c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMemoryOnlyMode(); 475c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 476c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ExternalAsyncIO(); 477c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 478c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 479c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheEntryTest::StreamAccess() { 4803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick disk_cache::Entry* entry = NULL; 481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry("the first key", &entry)); 482c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(NULL != entry); 483c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 484c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kBufferSize = 1024; 485513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kBufferSize)); 486513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kBufferSize)); 487c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 488c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kNumStreams = 3; 489c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < kNumStreams; i++) { 490c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(buffer1->data(), kBufferSize, false); 4913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kBufferSize, WriteData(entry, i, 0, buffer1, kBufferSize, false)); 492c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(buffer2->data(), 0, kBufferSize); 4933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kBufferSize, ReadData(entry, i, 0, buffer2, kBufferSize)); 494c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, memcmp(buffer1->data(), buffer2->data(), kBufferSize)); 495c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 496c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 497c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(net::ERR_INVALID_ARGUMENT, 4983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ReadData(entry, kNumStreams, 0, buffer1, kBufferSize)); 499c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 500c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 501c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 502c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, StreamAccess) { 503c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 504c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott StreamAccess(); 505c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 506c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 507c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, MemoryOnlyStreamAccess) { 508c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMemoryOnlyMode(); 509c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 510c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott StreamAccess(); 511c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 512c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 513c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheEntryTest::GetKey() { 5143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string key("the first key"); 5153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick disk_cache::Entry* entry; 5163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 5173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(key, entry->GetKey()) << "short key"; 5183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 519c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 520c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int seed = static_cast<int>(Time::Now().ToInternalValue()); 521c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott srand(seed); 522c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott char key_buffer[20000]; 523c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 524c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(key_buffer, 3000, true); 525c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott key_buffer[1000] = '\0'; 526c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick key = key_buffer; 5283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 5293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(key == entry->GetKey()) << "1000 bytes key"; 5303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 531c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 532c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott key_buffer[1000] = 'p'; 533c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott key_buffer[3000] = '\0'; 5343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick key = key_buffer; 5353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 5363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(key == entry->GetKey()) << "medium size key"; 5373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 538c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 539c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(key_buffer, sizeof(key_buffer), true); 540c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott key_buffer[19999] = '\0'; 541c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick key = key_buffer; 5433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 5443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(key == entry->GetKey()) << "long key"; 5453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 546c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 547c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 548c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, GetKey) { 549c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 550c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GetKey(); 551c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 552c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 553c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, MemoryOnlyGetKey) { 554c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMemoryOnlyMode(); 555c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 556c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GetKey(); 557c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 558c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid DiskCacheEntryTest::GetTimes() { 5603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string key("the first key"); 5613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick disk_cache::Entry* entry; 5623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Time t1 = Time::Now(); 5643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 5653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(entry->GetLastModified() >= t1); 5663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(entry->GetLastModified() == entry->GetLastUsed()); 5673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5683f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen base::PlatformThread::Sleep(20); 5693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Time t2 = Time::Now(); 5703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(t2 > t1); 5713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, WriteData(entry, 0, 200, NULL, 0, false)); 5723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (type_ == net::APP_CACHE) { 5733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(entry->GetLastModified() < t2); 5743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else { 5753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(entry->GetLastModified() >= t2); 5763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 5773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(entry->GetLastModified() == entry->GetLastUsed()); 5783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5793f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen base::PlatformThread::Sleep(20); 5803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Time t3 = Time::Now(); 5813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(t3 > t2); 5823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const int kSize = 200; 583513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); 5843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer, kSize)); 5853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (type_ == net::APP_CACHE) { 5863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(entry->GetLastUsed() < t2); 5873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(entry->GetLastModified() < t2); 5883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else { 5893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(entry->GetLastUsed() >= t3); 5903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(entry->GetLastModified() < t3); 5913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 5923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 5933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 5943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5953345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheEntryTest, GetTimes) { 5963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick InitCache(); 5973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GetTimes(); 5983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 5993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 6003345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheEntryTest, MemoryOnlyGetTimes) { 6013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetMemoryOnlyMode(); 6023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick InitCache(); 6033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GetTimes(); 6043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 6053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 6063345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheEntryTest, AppCacheGetTimes) { 6073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetCacheType(net::APP_CACHE); 6083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick InitCache(); 6093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GetTimes(); 6103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 6113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 612c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheEntryTest::GrowData() { 613c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string key1("the first key"); 6143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick disk_cache::Entry* entry; 6153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, CreateEntry(key1, &entry)); 616c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 617c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize = 20000; 618513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize)); 619513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize)); 620c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(buffer1->data(), kSize, false); 621c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(buffer2->data(), 0, kSize); 622c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 623c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base::strlcpy(buffer1->data(), "the data", kSize); 6243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(10, WriteData(entry, 0, 0, buffer1, 10, false)); 6253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(10, ReadData(entry, 0, 0, buffer2, 10)); 626c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_STREQ("the data", buffer2->data()); 6273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(10, entry->GetDataSize(0)); 628c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 6293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(2000, WriteData(entry, 0, 0, buffer1, 2000, false)); 6303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(2000, entry->GetDataSize(0)); 6313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(2000, ReadData(entry, 0, 0, buffer2, 2000)); 632c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 2000)); 633c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 6343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(20000, WriteData(entry, 0, 0, buffer1, kSize, false)); 6353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(20000, entry->GetDataSize(0)); 6363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(20000, ReadData(entry, 0, 0, buffer2, kSize)); 637c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), kSize)); 6383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 639c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 640c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(buffer2->data(), 0, kSize); 6413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string key2("Second key"); 6423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, CreateEntry(key2, &entry)); 6433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(10, WriteData(entry, 0, 0, buffer1, 10, false)); 6443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(10, entry->GetDataSize(0)); 6453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 646c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 647c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Go from an internal address to a bigger block size. 6483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, OpenEntry(key2, &entry)); 6493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(2000, WriteData(entry, 0, 0, buffer1, 2000, false)); 6503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(2000, entry->GetDataSize(0)); 6513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(2000, ReadData(entry, 0, 0, buffer2, 2000)); 652c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 2000)); 6533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 654c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(buffer2->data(), 0, kSize); 655c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 656c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Go from an internal address to an external one. 6573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, OpenEntry(key2, &entry)); 6583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(20000, WriteData(entry, 0, 0, buffer1, kSize, false)); 6593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(20000, entry->GetDataSize(0)); 6603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(20000, ReadData(entry, 0, 0, buffer2, kSize)); 661c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), kSize)); 6623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 6633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 6643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Double check the size from disk. 6653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, OpenEntry(key2, &entry)); 6663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(20000, entry->GetDataSize(0)); 6673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 6683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Now extend the entry without actual data. 6693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, WriteData(entry, 0, 45500, buffer1, 0, false)); 6703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 6713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 6723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // And check again from disk. 6733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, OpenEntry(key2, &entry)); 6743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(45500, entry->GetDataSize(0)); 6753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 676c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 677c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 678c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, GrowData) { 679c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 680c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GrowData(); 681c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 682c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 6833345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheEntryTest, GrowDataNoBuffer) { 6843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetDirectMode(); 6853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick InitCache(); 6863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick cache_impl_->SetFlags(disk_cache::kNoBuffering); 6873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GrowData(); 6883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 6893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 690c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, MemoryOnlyGrowData) { 691c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMemoryOnlyMode(); 692c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 693c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GrowData(); 694c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 695c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 696c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheEntryTest::TruncateData() { 6973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string key("the first key"); 6983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick disk_cache::Entry* entry; 6993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 700c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 701c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize1 = 20000; 702c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize2 = 20000; 703513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize1)); 704513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize2)); 705c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 706c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(buffer1->data(), kSize1, false); 707c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(buffer2->data(), 0, kSize2); 708c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 709c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Simple truncation: 7103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(200, WriteData(entry, 0, 0, buffer1, 200, false)); 7113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(200, entry->GetDataSize(0)); 7123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(100, WriteData(entry, 0, 0, buffer1, 100, false)); 7133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(200, entry->GetDataSize(0)); 7143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(100, WriteData(entry, 0, 0, buffer1, 100, true)); 7153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(100, entry->GetDataSize(0)); 7163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, WriteData(entry, 0, 50, buffer1, 0, true)); 7173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(50, entry->GetDataSize(0)); 7183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, WriteData(entry, 0, 0, buffer1, 0, true)); 7193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, entry->GetDataSize(0)); 7203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 7213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 722c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 723c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Go to an external file. 7243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(20000, WriteData(entry, 0, 0, buffer1, 20000, true)); 7253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(20000, entry->GetDataSize(0)); 7263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(20000, ReadData(entry, 0, 0, buffer2, 20000)); 727c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 20000)); 728c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(buffer2->data(), 0, kSize2); 729c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 730c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // External file truncation 7313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(18000, WriteData(entry, 0, 0, buffer1, 18000, false)); 7323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(20000, entry->GetDataSize(0)); 7333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(18000, WriteData(entry, 0, 0, buffer1, 18000, true)); 7343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(18000, entry->GetDataSize(0)); 7353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, WriteData(entry, 0, 17500, buffer1, 0, true)); 7363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(17500, entry->GetDataSize(0)); 737c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 738c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // And back to an internal block. 7393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(600, WriteData(entry, 0, 1000, buffer1, 600, true)); 7403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(1600, entry->GetDataSize(0)); 7413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(600, ReadData(entry, 0, 1000, buffer2, 600)); 742c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 600)); 7433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(1000, ReadData(entry, 0, 0, buffer2, 1000)); 744c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 1000)) << 745c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Preserves previous data"; 746c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 747c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Go from external file to zero length. 7483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(20000, WriteData(entry, 0, 0, buffer1, 20000, true)); 7493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(20000, entry->GetDataSize(0)); 7503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, WriteData(entry, 0, 0, buffer1, 0, true)); 7513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, entry->GetDataSize(0)); 752c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 7533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 754c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 755c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 756c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, TruncateData) { 757c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 758c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TruncateData(); 759c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 760c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 7613345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheEntryTest, TruncateDataNoBuffer) { 7623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetDirectMode(); 7633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick InitCache(); 7643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick cache_impl_->SetFlags(disk_cache::kNoBuffering); 7653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick TruncateData(); 7663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 7673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 768c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, MemoryOnlyTruncateData) { 769c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMemoryOnlyMode(); 770c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 771c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TruncateData(); 772c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 773c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 774c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheEntryTest::ZeroLengthIO() { 7753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string key("the first key"); 7763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick disk_cache::Entry* entry; 7773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 778c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 7793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, ReadData(entry, 0, 0, NULL, 0)); 7803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, WriteData(entry, 0, 0, NULL, 0, false)); 781c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 782c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // This write should extend the entry. 7833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, WriteData(entry, 0, 1000, NULL, 0, false)); 7843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, ReadData(entry, 0, 500, NULL, 0)); 7853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, ReadData(entry, 0, 2000, NULL, 0)); 7863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(1000, entry->GetDataSize(0)); 7873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 7883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, WriteData(entry, 0, 100000, NULL, 0, true)); 7893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, ReadData(entry, 0, 50000, NULL, 0)); 7903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(100000, entry->GetDataSize(0)); 7913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 79221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Let's verify the actual content. 7933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const int kSize = 20; 7943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const char zeros[kSize] = {}; 795513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); 7963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 7973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CacheTestFillBuffer(buffer->data(), kSize, false); 7983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, ReadData(entry, 0, 500, buffer, kSize)); 7993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(!memcmp(buffer->data(), zeros, kSize)); 8003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CacheTestFillBuffer(buffer->data(), kSize, false); 8023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, ReadData(entry, 0, 5000, buffer, kSize)); 8033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(!memcmp(buffer->data(), zeros, kSize)); 8043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CacheTestFillBuffer(buffer->data(), kSize, false); 8063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, ReadData(entry, 0, 50000, buffer, kSize)); 8073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(!memcmp(buffer->data(), zeros, kSize)); 8083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 810c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 811c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 812c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, ZeroLengthIO) { 813c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 814c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ZeroLengthIO(); 815c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 816c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 8173345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheEntryTest, ZeroLengthIONoBuffer) { 8183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetDirectMode(); 8193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick InitCache(); 8203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick cache_impl_->SetFlags(disk_cache::kNoBuffering); 8213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ZeroLengthIO(); 8223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 8233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 824c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, MemoryOnlyZeroLengthIO) { 825c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMemoryOnlyMode(); 826c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 827c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ZeroLengthIO(); 828c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 829c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 8303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Tests that we handle the content correctly when buffering. 8313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid DiskCacheEntryTest::Buffering() { 8323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string key("the first key"); 8333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick disk_cache::Entry* entry; 8343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 8353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const int kSize = 200; 837513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize)); 838513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize)); 8393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CacheTestFillBuffer(buffer1->data(), kSize, true); 8403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CacheTestFillBuffer(buffer2->data(), kSize, true); 8413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteData(entry, 1, 0, buffer1, kSize, false)); 8433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 8443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Write a little more and read what we wrote before. 8463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 8473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteData(entry, 1, 5000, buffer1, kSize, false)); 8483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, ReadData(entry, 1, 0, buffer2, kSize)); 8493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize)); 8503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Now go to an external file. 8523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteData(entry, 1, 18000, buffer1, kSize, false)); 8533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 8543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Write something else and verify old data. 8563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 8573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteData(entry, 1, 10000, buffer1, kSize, false)); 8583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CacheTestFillBuffer(buffer2->data(), kSize, true); 8593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, ReadData(entry, 1, 5000, buffer2, kSize)); 8603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize)); 8613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CacheTestFillBuffer(buffer2->data(), kSize, true); 8623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, ReadData(entry, 1, 0, buffer2, kSize)); 8633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize)); 8643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CacheTestFillBuffer(buffer2->data(), kSize, true); 8653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, ReadData(entry, 1, 18000, buffer2, kSize)); 8663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize)); 8673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Extend the file some more. 8693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteData(entry, 1, 23000, buffer1, kSize, false)); 8703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 8713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // And now make sure that we can deal with data in both places (ram/disk). 8733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 8743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteData(entry, 1, 17000, buffer1, kSize, false)); 8753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // We should not overwrite the data at 18000 with this. 8773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteData(entry, 1, 19000, buffer1, kSize, false)); 8783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CacheTestFillBuffer(buffer2->data(), kSize, true); 8793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, ReadData(entry, 1, 18000, buffer2, kSize)); 8803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize)); 8813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CacheTestFillBuffer(buffer2->data(), kSize, true); 8823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, ReadData(entry, 1, 17000, buffer2, kSize)); 8833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize)); 8843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteData(entry, 1, 22900, buffer1, kSize, false)); 8863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CacheTestFillBuffer(buffer2->data(), kSize, true); 8873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(100, ReadData(entry, 1, 23000, buffer2, kSize)); 8883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data() + 100, 100)); 8893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CacheTestFillBuffer(buffer2->data(), kSize, true); 8913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(100, ReadData(entry, 1, 23100, buffer2, kSize)); 8923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data() + 100, 100)); 8933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 894513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Extend the file again and read before without closing the entry. 895513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_EQ(kSize, WriteData(entry, 1, 25000, buffer1, kSize, false)); 896513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_EQ(kSize, WriteData(entry, 1, 45000, buffer1, kSize, false)); 897513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch CacheTestFillBuffer(buffer2->data(), kSize, true); 898513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_EQ(kSize, ReadData(entry, 1, 25000, buffer2, kSize)); 899513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize)); 900513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch CacheTestFillBuffer(buffer2->data(), kSize, true); 901513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_EQ(kSize, ReadData(entry, 1, 45000, buffer2, kSize)); 902513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize)); 903513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 9043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 9053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 9063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9073345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheEntryTest, Buffering) { 9083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick InitCache(); 9093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Buffering(); 9103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 9113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9123345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheEntryTest, BufferingNoBuffer) { 9133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetDirectMode(); 9143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick InitCache(); 9153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick cache_impl_->SetFlags(disk_cache::kNoBuffering); 9163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Buffering(); 9173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 9183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Some extra tests to make sure that buffering works properly when changing 9203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// the entry size. 9213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid DiskCacheEntryTest::SizeChanges() { 9223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string key("the first key"); 9233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick disk_cache::Entry* entry; 9243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 9253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const int kSize = 200; 9273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const char zeros[kSize] = {}; 928513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize)); 929513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize)); 9303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CacheTestFillBuffer(buffer1->data(), kSize, true); 9313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CacheTestFillBuffer(buffer2->data(), kSize, true); 9323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteData(entry, 1, 0, buffer1, kSize, true)); 9343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteData(entry, 1, 17000, buffer1, kSize, true)); 9353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteData(entry, 1, 23000, buffer1, kSize, true)); 9363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 9373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Extend the file and read between the old size and the new write. 9393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 9403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(23000 + kSize, entry->GetDataSize(1)); 9413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteData(entry, 1, 25000, buffer1, kSize, true)); 9423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(25000 + kSize, entry->GetDataSize(1)); 9433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, ReadData(entry, 1, 24000, buffer2, kSize)); 9443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(!memcmp(buffer2->data(), zeros, kSize)); 9453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Read at the end of the old file size. 947513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_EQ(kSize, ReadData(entry, 1, 23000 + kSize - 35, buffer2, kSize)); 9483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data() + kSize - 35, 35)); 9493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Read slightly before the last write. 9513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CacheTestFillBuffer(buffer2->data(), kSize, true); 9523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, ReadData(entry, 1, 24900, buffer2, kSize)); 9533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(!memcmp(buffer2->data(), zeros, 100)); 9543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(!memcmp(buffer2->data() + 100, buffer1->data(), kSize - 100)); 9553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Extend the entry a little more. 9573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteData(entry, 1, 26000, buffer1, kSize, true)); 9583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(26000 + kSize, entry->GetDataSize(1)); 9593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CacheTestFillBuffer(buffer2->data(), kSize, true); 9603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, ReadData(entry, 1, 25900, buffer2, kSize)); 9613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(!memcmp(buffer2->data(), zeros, 100)); 9623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(!memcmp(buffer2->data() + 100, buffer1->data(), kSize - 100)); 9633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // And now reduce the size. 9653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteData(entry, 1, 25000, buffer1, kSize, true)); 9663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(25000 + kSize, entry->GetDataSize(1)); 9673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(28, ReadData(entry, 1, 25000 + kSize - 28, buffer2, kSize)); 9683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data() + kSize - 28, 28)); 9693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Reduce the size with a buffer that is not extending the size. 9713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteData(entry, 1, 24000, buffer1, kSize, false)); 9723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(25000 + kSize, entry->GetDataSize(1)); 9733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteData(entry, 1, 24500, buffer1, kSize, true)); 9743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(24500 + kSize, entry->GetDataSize(1)); 9753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, ReadData(entry, 1, 23900, buffer2, kSize)); 9763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(!memcmp(buffer2->data(), zeros, 100)); 9773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(!memcmp(buffer2->data() + 100, buffer1->data(), kSize - 100)); 9783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // And now reduce the size below the old size. 9803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteData(entry, 1, 19000, buffer1, kSize, true)); 9813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(19000 + kSize, entry->GetDataSize(1)); 9823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, ReadData(entry, 1, 18900, buffer2, kSize)); 9833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(!memcmp(buffer2->data(), zeros, 100)); 9843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(!memcmp(buffer2->data() + 100, buffer1->data(), kSize - 100)); 9853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Verify that the actual file is truncated. 9873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 9883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 9893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(19000 + kSize, entry->GetDataSize(1)); 9903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 9923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 9933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9943345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheEntryTest, SizeChanges) { 9953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick InitCache(); 9963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SizeChanges(); 9973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 9983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9993345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheEntryTest, SizeChangesNoBuffer) { 10003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetDirectMode(); 10013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick InitCache(); 10023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick cache_impl_->SetFlags(disk_cache::kNoBuffering); 10033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SizeChanges(); 10043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 10053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1006c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Write more than the total cache capacity but to a single entry. |size| is the 1007c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// amount of bytes to write each time. 1008c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheEntryTest::ReuseEntry(int size) { 1009c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string key1("the first key"); 10103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick disk_cache::Entry* entry; 1011c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(key1, &entry)); 1012c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1013c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1014c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string key2("the second key"); 1015c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(key2, &entry)); 1016c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1017513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(size)); 1018c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(buffer->data(), size, false); 1019c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1020c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < 15; i++) { 10213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, WriteData(entry, 0, 0, buffer, 0, true)); 10223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(size, WriteData(entry, 0, 0, buffer, size, false)); 1023c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1024c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenEntry(key2, &entry)); 1025c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1026c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1027c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1028c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenEntry(key1, &entry)) << "have not evicted this entry"; 1029c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1030c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1031c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1032c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, ReuseExternalEntry) { 1033c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetDirectMode(); 1034c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMaxSize(200 * 1024); 1035c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1036c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ReuseEntry(20 * 1024); 1037c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1038c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1039c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, MemoryOnlyReuseExternalEntry) { 1040c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetDirectMode(); 1041c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMemoryOnlyMode(); 1042c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMaxSize(200 * 1024); 1043c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1044c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ReuseEntry(20 * 1024); 1045c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1046c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1047c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, ReuseInternalEntry) { 1048c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetDirectMode(); 1049c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMaxSize(100 * 1024); 1050c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1051c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ReuseEntry(10 * 1024); 1052c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1053c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1054c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, MemoryOnlyReuseInternalEntry) { 1055c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetDirectMode(); 1056c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMemoryOnlyMode(); 1057c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMaxSize(100 * 1024); 1058c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1059c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ReuseEntry(10 * 1024); 1060c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1061c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1062c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Reading somewhere that was not written should return zeros. 1063c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheEntryTest::InvalidData() { 10643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string key("the first key"); 10653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick disk_cache::Entry* entry; 10663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 1067c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1068c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize1 = 20000; 1069c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize2 = 20000; 1070c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize3 = 20000; 1071513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize1)); 1072513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize2)); 1073513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer3(new net::IOBuffer(kSize3)); 1074c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1075c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(buffer1->data(), kSize1, false); 1076c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(buffer2->data(), 0, kSize2); 1077c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1078c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Simple data grow: 10793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(200, WriteData(entry, 0, 400, buffer1, 200, false)); 10803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(600, entry->GetDataSize(0)); 10813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(100, ReadData(entry, 0, 300, buffer3, 100)); 1082c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 100)); 10833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 10843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 1085c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1086c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The entry is now on disk. Load it and extend it. 10873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(200, WriteData(entry, 0, 800, buffer1, 200, false)); 10883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(1000, entry->GetDataSize(0)); 10893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(100, ReadData(entry, 0, 700, buffer3, 100)); 1090c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 100)); 10913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 10923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 1093c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1094c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // This time using truncate. 10953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(200, WriteData(entry, 0, 1800, buffer1, 200, true)); 10963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(2000, entry->GetDataSize(0)); 10973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(100, ReadData(entry, 0, 1500, buffer3, 100)); 1098c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 100)); 1099c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Go to an external file. 11013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(200, WriteData(entry, 0, 19800, buffer1, 200, false)); 11023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(20000, entry->GetDataSize(0)); 11033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(4000, ReadData(entry, 0, 14000, buffer3, 4000)); 1104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 4000)); 1105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // And back to an internal block. 11073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(600, WriteData(entry, 0, 1000, buffer1, 600, true)); 11083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(1600, entry->GetDataSize(0)); 11093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(600, ReadData(entry, 0, 1000, buffer3, 600)); 1110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(!memcmp(buffer3->data(), buffer1->data(), 600)); 1111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Extend it again. 11133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(600, WriteData(entry, 0, 2000, buffer1, 600, false)); 11143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(2600, entry->GetDataSize(0)); 11153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(200, ReadData(entry, 0, 1800, buffer3, 200)); 1116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 200)); 1117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // And again (with truncation flag). 11193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(600, WriteData(entry, 0, 3000, buffer1, 600, true)); 11203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(3600, entry->GetDataSize(0)); 11213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(200, ReadData(entry, 0, 2800, buffer3, 200)); 1122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 200)); 1123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 11243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 1125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, InvalidData) { 1128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InvalidData(); 1130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 11323345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheEntryTest, InvalidDataNoBuffer) { 11333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetDirectMode(); 11343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick InitCache(); 11353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick cache_impl_->SetFlags(disk_cache::kNoBuffering); 11363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick InvalidData(); 11373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 11383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, MemoryOnlyInvalidData) { 1140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMemoryOnlyMode(); 1141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InvalidData(); 1143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 11453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Tests that the cache preserves the buffer of an IO operation. 11463345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheEntryTest, ReadWriteDestroyBuffer) { 11473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick InitCache(); 11483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string key("the first key"); 11493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick disk_cache::Entry* entry; 11503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 11513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 11523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const int kSize = 200; 1153513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); 11543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CacheTestFillBuffer(buffer->data(), kSize, false); 11553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 11563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick TestCompletionCallback cb; 11573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(net::ERR_IO_PENDING, 11583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->WriteData(0, 0, buffer, kSize, &cb, false)); 11593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 11603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Release our reference to the buffer. 11613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick buffer = NULL; 11623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, cb.WaitForResult()); 11633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 11643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // And now test with a Read(). 11653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick buffer = new net::IOBuffer(kSize); 11663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CacheTestFillBuffer(buffer->data(), kSize, false); 11673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 11683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(net::ERR_IO_PENDING, entry->ReadData(0, 0, buffer, kSize, &cb)); 11693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick buffer = NULL; 11703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, cb.WaitForResult()); 11713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 11723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 11733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 11743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid DiskCacheEntryTest::DoomNormalEntry() { 11763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string key("the first key"); 11773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick disk_cache::Entry* entry; 11783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 11793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Doom(); 11803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 1181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize = 20000; 1183513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); 1184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(buffer->data(), kSize, true); 1185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott buffer->data()[19999] = '\0'; 1186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 11873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick key = buffer->data(); 11883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 11893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(20000, WriteData(entry, 0, 0, buffer, kSize, false)); 11903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(20000, WriteData(entry, 1, 0, buffer, kSize, false)); 11913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Doom(); 11923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 1193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FlushQueueForTest(); 1195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, cache_->GetEntryCount()); 1196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, DoomEntry) { 1199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetDirectMode(); 1200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DoomNormalEntry(); 1202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, MemoryOnlyDoomEntry) { 1205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMemoryOnlyMode(); 1206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DoomNormalEntry(); 1208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Verify that basic operations work as expected with doomed entries. 1211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheEntryTest::DoomedEntry() { 1212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string key("the first key"); 12133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick disk_cache::Entry* entry; 1214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 1215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Doom(); 1216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FlushQueueForTest(); 1218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, cache_->GetEntryCount()); 1219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Time initial = Time::Now(); 12203f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen base::PlatformThread::Sleep(20); 1221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize1 = 2000; 1223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize2 = 2000; 1224513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize1)); 1225513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize2)); 1226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(buffer1->data(), kSize1, false); 1227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(buffer2->data(), 0, kSize2); 1228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 12293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(2000, WriteData(entry, 0, 0, buffer1, 2000, false)); 12303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(2000, ReadData(entry, 0, 0, buffer2, 2000)); 1231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, memcmp(buffer1->data(), buffer2->data(), kSize1)); 1232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(key, entry->GetKey()); 1233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(initial < entry->GetLastModified()); 1234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(initial < entry->GetLastUsed()); 1235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, DoomedEntry) { 1240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetDirectMode(); 1241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DoomedEntry(); 1243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, MemoryOnlyDoomedEntry) { 1246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMemoryOnlyMode(); 1247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DoomedEntry(); 1249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Test that child entries in a memory cache backend are not visible from 1252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// enumerations. 1253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, MemoryOnlyEnumerationWithSparseEntries) { 1254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMemoryOnlyMode(); 1255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize = 4096; 1258513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kSize)); 1259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(buf->data(), kSize, false); 1260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string key("the first key"); 1262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry* parent_entry; 1263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(key, &parent_entry)); 1264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Writes to the parent entry. 1266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(kSize, parent_entry->WriteSparseData(0, buf, kSize, NULL)); 1267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // This write creates a child entry and writes to it. 1269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(kSize, parent_entry->WriteSparseData(8192, buf, kSize, NULL)); 1270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott parent_entry->Close(); 1272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Perform the enumerations. 1274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void* iter = NULL; 1275c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry* entry = NULL; 1276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int count = 0; 1277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch while (OpenNextEntry(&iter, &entry) == net::OK) { 1278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(entry != NULL); 1279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ++count; 1280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::MemEntryImpl* mem_entry = 1281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott reinterpret_cast<disk_cache::MemEntryImpl*>(entry); 1282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(disk_cache::MemEntryImpl::kParentEntry, mem_entry->type()); 1283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mem_entry->Close(); 1284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(1, count); 1286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Writes |buf_1| to offset and reads it back as |buf_2|. 1289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid VerifySparseIO(disk_cache::Entry* entry, int64 offset, 12903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick net::IOBuffer* buf_1, int size, net::IOBuffer* buf_2) { 12913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick TestCompletionCallback cb; 1292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(buf_2->data(), 0, size); 12943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int ret = entry->ReadSparseData(offset, buf_2, size, &cb); 12953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, cb.GetResult(ret)); 1296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 12973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ret = entry->WriteSparseData(offset, buf_1, size, &cb); 12983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(size, cb.GetResult(ret)); 1299c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 13003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ret = entry->ReadSparseData(offset, buf_2, size, &cb); 13013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(size, cb.GetResult(ret)); 1302c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1303c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, memcmp(buf_1->data(), buf_2->data(), size)); 1304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1306c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Reads |size| bytes from |entry| at |offset| and verifies that they are the 1307c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// same as the content of the provided |buffer|. 1308c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid VerifyContentSparseIO(disk_cache::Entry* entry, int64 offset, char* buffer, 13093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int size) { 13103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick TestCompletionCallback cb; 1311c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1312513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buf_1(new net::IOBuffer(size)); 1313c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(buf_1->data(), 0, size); 13143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int ret = entry->ReadSparseData(offset, buf_1, size, &cb); 13153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(size, cb.GetResult(ret)); 1316c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1317c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, memcmp(buf_1->data(), buffer, size)); 1318c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1319c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 13203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid DiskCacheEntryTest::BasicSparseIO() { 1321c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string key("the first key"); 1322c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry* entry; 1323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 1324c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1325c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize = 2048; 1326513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buf_1(new net::IOBuffer(kSize)); 1327513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buf_2(new net::IOBuffer(kSize)); 1328c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(buf_1->data(), kSize, false); 1329c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1330c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Write at offset 0. 13313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick VerifySparseIO(entry, 0, buf_1, kSize, buf_2); 1332c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1333c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Write at offset 0x400000 (4 MB). 13343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick VerifySparseIO(entry, 0x400000, buf_1, kSize, buf_2); 1335c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1336c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Write at offset 0x800000000 (32 GB). 13373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick VerifySparseIO(entry, 0x800000000LL, buf_1, kSize, buf_2); 1338c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1339c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1340c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1341c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Check everything again. 1342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 13433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick VerifyContentSparseIO(entry, 0, buf_1->data(), kSize); 13443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick VerifyContentSparseIO(entry, 0x400000, buf_1->data(), kSize); 13453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick VerifyContentSparseIO(entry, 0x800000000LL, buf_1->data(), kSize); 1346c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1347c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1348c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 13493345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheEntryTest, BasicSparseIO) { 1350c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 13513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick BasicSparseIO(); 1352c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1353c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 13543345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheEntryTest, MemoryOnlyBasicSparseIO) { 1355c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMemoryOnlyMode(); 1356c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 13573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick BasicSparseIO(); 1358c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1359c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 13603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid DiskCacheEntryTest::HugeSparseIO() { 1361c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string key("the first key"); 1362c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry* entry; 1363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 1364c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1365c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Write 1.2 MB so that we cover multiple entries. 1366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize = 1200 * 1024; 1367513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buf_1(new net::IOBuffer(kSize)); 1368513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buf_2(new net::IOBuffer(kSize)); 1369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(buf_1->data(), kSize, false); 1370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1371c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Write at offset 0x20F0000 (33 MB - 64 KB). 13723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick VerifySparseIO(entry, 0x20F0000, buf_1, kSize, buf_2); 1373c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1374c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1375c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Check it again. 1376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 13773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick VerifyContentSparseIO(entry, 0x20F0000, buf_1->data(), kSize); 1378c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1379c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1380c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 13813345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheEntryTest, HugeSparseIO) { 1382c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 13833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick HugeSparseIO(); 1384c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1385c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 13863345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheEntryTest, MemoryOnlyHugeSparseIO) { 1387c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMemoryOnlyMode(); 1388c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 13893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick HugeSparseIO(); 1390c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1391c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1392c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheEntryTest::GetAvailableRange() { 1393c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string key("the first key"); 1394c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry* entry; 1395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 1396c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1397c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize = 16 * 1024; 1398513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kSize)); 1399c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(buf->data(), kSize, false); 1400c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1401c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Write at offset 0x20F0000 (33 MB - 64 KB), and 0x20F4400 (33 MB - 47 KB). 14023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteSparseData(entry, 0x20F0000, buf, kSize)); 14033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteSparseData(entry, 0x20F4400, buf, kSize)); 1404c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1405c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // We stop at the first empty block. 1406c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int64 start; 1407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestCompletionCallback cb; 1408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int rv = entry->GetAvailableRange(0x20F0000, kSize * 2, &start, &cb); 1409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(kSize, cb.GetResult(rv)); 1410c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0x20F0000, start); 1411c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1412c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott start = 0; 1413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = entry->GetAvailableRange(0, kSize, &start, &cb); 1414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(0, cb.GetResult(rv)); 1415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = entry->GetAvailableRange(0x20F0000 - kSize, kSize, &start, &cb); 1416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(0, cb.GetResult(rv)); 1417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = entry->GetAvailableRange(0, 0x2100000, &start, &cb); 1418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(kSize, cb.GetResult(rv)); 1419c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0x20F0000, start); 1420c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1421c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // We should be able to Read based on the results of GetAvailableRange. 1422c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott start = -1; 1423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = entry->GetAvailableRange(0x2100000, kSize, &start, &cb); 1424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(0, cb.GetResult(rv)); 1425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = entry->ReadSparseData(start, buf, kSize, &cb); 1426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(0, cb.GetResult(rv)); 1427c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1428c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott start = 0; 1429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = entry->GetAvailableRange(0x20F2000, kSize, &start, &cb); 1430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(0x2000, cb.GetResult(rv)); 1431c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0x20F2000, start); 14323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0x2000, ReadSparseData(entry, start, buf, kSize)); 1433c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1434c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Make sure that we respect the |len| argument. 1435c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott start = 0; 1436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = entry->GetAvailableRange(0x20F0001 - kSize, kSize, &start, &cb); 1437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1, cb.GetResult(rv)); 1438c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0x20F0000, start); 1439c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1440c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1441c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1442c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1443c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, GetAvailableRange) { 1444c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1445c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GetAvailableRange(); 1446c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1447c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1448c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, MemoryOnlyGetAvailableRange) { 1449c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMemoryOnlyMode(); 1450c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1451c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GetAvailableRange(); 1452c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1453c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid DiskCacheEntryTest::CouldBeSparse() { 1455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string key("the first key"); 1456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch disk_cache::Entry* entry; 1457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 1458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const int kSize = 16 * 1024; 1460513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kSize)); 1461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CacheTestFillBuffer(buf->data(), kSize, false); 1462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Write at offset 0x20F0000 (33 MB - 64 KB). 14643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteSparseData(entry, 0x20F0000, buf, kSize)); 1465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(entry->CouldBeSparse()); 1467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry->Close(); 1468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 1470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(entry->CouldBeSparse()); 1471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry->Close(); 1472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now verify a regular entry. 1474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch key.assign("another key"); 1475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 1476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(entry->CouldBeSparse()); 1477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 14783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteData(entry, 0, 0, buf, kSize, false)); 14793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteData(entry, 1, 0, buf, kSize, false)); 14803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteData(entry, 2, 0, buf, kSize, false)); 1481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(entry->CouldBeSparse()); 1483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry->Close(); 1484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 1486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(entry->CouldBeSparse()); 1487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry->Close(); 1488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1490c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(DiskCacheEntryTest, CouldBeSparse) { 1491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitCache(); 1492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CouldBeSparse(); 1493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1494c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1495c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(DiskCacheEntryTest, MemoryCouldBeSparse) { 1496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetMemoryOnlyMode(); 1497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitCache(); 1498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CouldBeSparse(); 1499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1501c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, MemoryOnlyMisalignedSparseIO) { 1502c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMemoryOnlyMode(); 1503c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1504c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1505c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize = 8192; 1506513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buf_1(new net::IOBuffer(kSize)); 1507513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buf_2(new net::IOBuffer(kSize)); 1508c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(buf_1->data(), kSize, false); 1509c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1510c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string key("the first key"); 1511c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry* entry; 1512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 1513c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1514c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // This loop writes back to back starting from offset 0 and 9000. 1515c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < kSize; i += 1024) { 1516513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::WrappedIOBuffer> buf_3( 1517513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch new net::WrappedIOBuffer(buf_1->data() + i)); 15183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick VerifySparseIO(entry, i, buf_3, 1024, buf_2); 15193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick VerifySparseIO(entry, 9000 + i, buf_3, 1024, buf_2); 1520c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1521c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1522c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Make sure we have data written. 15233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick VerifyContentSparseIO(entry, 0, buf_1->data(), kSize); 15243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick VerifyContentSparseIO(entry, 9000, buf_1->data(), kSize); 1525c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1526c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // This tests a large write that spans 3 entries from a misaligned offset. 15273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick VerifySparseIO(entry, 20481, buf_1, 8192, buf_2); 1528c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1529c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1530c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1531c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1532c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, MemoryOnlyMisalignedGetAvailableRange) { 1533c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMemoryOnlyMode(); 1534c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1535c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1536c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize = 8192; 1537513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kSize)); 1538c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(buf->data(), kSize, false); 1539c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1540c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry* entry; 1541c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string key("the first key"); 1542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 1543c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1544c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Writes in the middle of an entry. 1545c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(1024, entry->WriteSparseData(0, buf, 1024, NULL)); 1546c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(1024, entry->WriteSparseData(5120, buf, 1024, NULL)); 1547c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(1024, entry->WriteSparseData(10000, buf, 1024, NULL)); 1548c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1549c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Writes in the middle of an entry and spans 2 child entries. 1550c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(8192, entry->WriteSparseData(50000, buf, 8192, NULL)); 1551c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1552c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int64 start; 1553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestCompletionCallback cb; 1554c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Test that we stop at a discontinuous child at the second block. 1555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int rv = entry->GetAvailableRange(0, 10000, &start, &cb); 1556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1024, cb.GetResult(rv)); 1557c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, start); 1558c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1559c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Test that number of bytes is reported correctly when we start from the 1560c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // middle of a filled region. 1561c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = entry->GetAvailableRange(512, 10000, &start, &cb); 1562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(512, cb.GetResult(rv)); 1563c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(512, start); 1564c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1565c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Test that we found bytes in the child of next block. 1566c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = entry->GetAvailableRange(1024, 10000, &start, &cb); 1567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1024, cb.GetResult(rv)); 1568c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(5120, start); 1569c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1570c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Test that the desired length is respected. It starts within a filled 1571c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // region. 1572c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = entry->GetAvailableRange(5500, 512, &start, &cb); 1573c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(512, cb.GetResult(rv)); 1574c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(5500, start); 1575c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1576c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Test that the desired length is respected. It starts before a filled 1577c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // region. 1578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = entry->GetAvailableRange(5000, 620, &start, &cb); 1579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(500, cb.GetResult(rv)); 1580c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(5120, start); 1581c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1582c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Test that multiple blocks are scanned. 1583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = entry->GetAvailableRange(40000, 20000, &start, &cb); 1584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(8192, cb.GetResult(rv)); 1585c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(50000, start); 1586c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1587c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1588c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1589c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 159021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid DiskCacheEntryTest::UpdateSparseEntry() { 159121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen std::string key("the first key"); 159221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen disk_cache::Entry* entry1; 159321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(net::OK, CreateEntry(key, &entry1)); 159421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 159521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const int kSize = 2048; 159621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen scoped_refptr<net::IOBuffer> buf_1(new net::IOBuffer(kSize)); 159721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen scoped_refptr<net::IOBuffer> buf_2(new net::IOBuffer(kSize)); 159821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen CacheTestFillBuffer(buf_1->data(), kSize, false); 159921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 160021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Write at offset 0. 160121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen VerifySparseIO(entry1, 0, buf_1, kSize, buf_2); 160221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entry1->Close(); 160321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 160421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Write at offset 2048. 160521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(net::OK, OpenEntry(key, &entry1)); 160621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen VerifySparseIO(entry1, 2048, buf_1, kSize, buf_2); 160721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 160821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen disk_cache::Entry* entry2; 160921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(net::OK, CreateEntry("the second key", &entry2)); 161021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 161121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entry1->Close(); 161221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entry2->Close(); 161321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen FlushQueueForTest(); 161421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (memory_only_) 161521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(2, cache_->GetEntryCount()); 161621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen else 161721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(3, cache_->GetEntryCount()); 161821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 161921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 162021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTEST_F(DiskCacheEntryTest, UpdateSparseEntry) { 162121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen SetDirectMode(); 162221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen SetCacheType(net::MEDIA_CACHE); 162321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen InitCache(); 162421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen UpdateSparseEntry(); 162521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 162621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 162721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTEST_F(DiskCacheEntryTest, MemoryOnlyUpdateSparseEntry) { 162821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen SetMemoryOnlyMode(); 162921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen SetCacheType(net::MEDIA_CACHE); 163021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen InitCache(); 163121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen UpdateSparseEntry(); 163221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 163321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 1634c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheEntryTest::DoomSparseEntry() { 1635c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string key1("the first key"); 1636c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string key2("the second key"); 1637c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry *entry1, *entry2; 1638c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(key1, &entry1)); 1639c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(key2, &entry2)); 1640c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1641c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize = 4 * 1024; 1642513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kSize)); 1643c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(buf->data(), kSize, false); 1644c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1645c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int64 offset = 1024; 1646c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Write to a bunch of ranges. 1647c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < 12; i++) { 1648c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(kSize, entry1->WriteSparseData(offset, buf, kSize, NULL)); 1649c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Keep the second map under the default size. 1650c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (i < 9) 1651c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(kSize, entry2->WriteSparseData(offset, buf, kSize, NULL)); 1652c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott offset *= 4; 1653c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1654c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1655c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (memory_only_) 1656c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(2, cache_->GetEntryCount()); 1657c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 1658c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(15, cache_->GetEntryCount()); 1659c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1660c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Doom the first entry while it's still open. 1661c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry1->Doom(); 1662c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry1->Close(); 1663c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry2->Close(); 1664c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1665c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Doom the second entry after it's fully saved. 1666c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(net::OK, DoomEntry(key2)); 1667c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1668c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Make sure we do all needed work. This may fail for entry2 if between Close 1669c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // and DoomEntry the system decides to remove all traces of the file from the 1670c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // system cache so we don't see that there is pending IO. 1671c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott MessageLoop::current()->RunAllPending(); 1672c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1673c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (memory_only_) { 1674c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, cache_->GetEntryCount()); 1675c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else { 1676c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (5 == cache_->GetEntryCount()) { 1677c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Most likely we are waiting for the result of reading the sparse info 1678c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // (it's always async on Posix so it is easy to miss). Unfortunately we 1679c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // don't have any signal to watch for so we can only wait. 16803f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen base::PlatformThread::Sleep(500); 1681c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott MessageLoop::current()->RunAllPending(); 1682c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1683c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, cache_->GetEntryCount()); 1684c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1685c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1686c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1687c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, DoomSparseEntry) { 1688c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetDirectMode(); 1689c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UseCurrentThread(); 1690c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1691c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DoomSparseEntry(); 1692c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1693c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1694c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, MemoryOnlyDoomSparseEntry) { 1695c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMemoryOnlyMode(); 1696c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1697c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DoomSparseEntry(); 1698c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1699c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 17003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// A CompletionCallback that deletes the cache from within the callback. The way 17013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// a TestCompletionCallback works means that all tasks (even new ones) are 17023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// executed by the message loop before returning to the caller so the only way 17033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// to simulate a race is to execute what we want on the callback. 17043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass SparseTestCompletionCallback : public TestCompletionCallback { 17053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public: 17063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick explicit SparseTestCompletionCallback(disk_cache::Backend* cache) 17073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick : cache_(cache) {} 17083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 17093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual void RunWithParams(const Tuple1<int>& params) { 17103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick delete cache_; 17113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick TestCompletionCallback::RunWithParams(params); 17123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 17133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private: 17143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick disk_cache::Backend* cache_; 17153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DISALLOW_COPY_AND_ASSIGN(SparseTestCompletionCallback); 17163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}; 17173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 17183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Tests that we don't crash when the backend is deleted while we are working 17193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// deleting the sub-entries of a sparse entry. 17203345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheEntryTest, DoomSparseEntry2) { 17213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetDirectMode(); 17223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick UseCurrentThread(); 17233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick InitCache(); 17243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string key("the key"); 17253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick disk_cache::Entry* entry; 17263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 17273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 17283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const int kSize = 4 * 1024; 1729513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kSize)); 17303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CacheTestFillBuffer(buf->data(), kSize, false); 17313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 17323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int64 offset = 1024; 17333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Write to a bunch of ranges. 17343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick for (int i = 0; i < 12; i++) { 17353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, entry->WriteSparseData(offset, buf, kSize, NULL)); 17363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick offset *= 4; 17373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 17383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(9, cache_->GetEntryCount()); 17393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 17403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick entry->Close(); 17413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SparseTestCompletionCallback cb(cache_); 17423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int rv = cache_->DoomEntry(key, &cb); 17433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(net::ERR_IO_PENDING, rv); 17443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(net::OK, cb.WaitForResult()); 17453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 17463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // TearDown will attempt to delete the cache_. 17473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick cache_ = NULL; 17483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 17493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1750c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheEntryTest::PartialSparseEntry() { 1751c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string key("the first key"); 1752c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry* entry; 1753c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 1754c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1755c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // We should be able to deal with IO that is not aligned to the block size 1756c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // of a sparse entry, at least to write a big range without leaving holes. 1757c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize = 4 * 1024; 1758c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSmallSize = 128; 1759513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buf1(new net::IOBuffer(kSize)); 1760c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(buf1->data(), kSize, false); 1761c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1762c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The first write is just to extend the entry. The third write occupies 1763c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // a 1KB block partially, it may not be written internally depending on the 1764c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // implementation. 17653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteSparseData(entry, 20000, buf1, kSize)); 17663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteSparseData(entry, 500, buf1, kSize)); 17673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSmallSize, WriteSparseData(entry, 1080321, buf1, kSmallSize)); 1768c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1769c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 1770c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1771513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buf2(new net::IOBuffer(kSize)); 1772c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(buf2->data(), 0, kSize); 17733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, ReadSparseData(entry, 8000, buf2, kSize)); 1774c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 17753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(500, ReadSparseData(entry, kSize, buf2, kSize)); 1776c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, memcmp(buf2->data(), buf1->data() + kSize - 500, 500)); 17773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, ReadSparseData(entry, 0, buf2, kSize)); 1778c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1779c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // This read should not change anything. 17803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(96, ReadSparseData(entry, 24000, buf2, kSize)); 17813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(500, ReadSparseData(entry, kSize, buf2, kSize)); 17823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, ReadSparseData(entry, 99, buf2, kSize)); 1783c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1784c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int rv; 1785c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int64 start; 1786c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestCompletionCallback cb; 1787c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (memory_only_) { 1788c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = entry->GetAvailableRange(0, 600, &start, &cb); 1789c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(100, cb.GetResult(rv)); 1790c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(500, start); 1791c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else { 1792c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = entry->GetAvailableRange(0, 2048, &start, &cb); 1793c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1024, cb.GetResult(rv)); 1794c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(1024, start); 1795c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1796c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = entry->GetAvailableRange(kSize, kSize, &start, &cb); 1797c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(500, cb.GetResult(rv)); 1798c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(kSize, start); 1799c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = entry->GetAvailableRange(20 * 1024, 10000, &start, &cb); 1800c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(3616, cb.GetResult(rv)); 1801c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(20 * 1024, start); 1802c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1803c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 1. Query before a filled 1KB block. 1804c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 2. Query within a filled 1KB block. 1805c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 3. Query beyond a filled 1KB block. 1806c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (memory_only_) { 1807c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = entry->GetAvailableRange(19400, kSize, &start, &cb); 1808c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(3496, cb.GetResult(rv)); 1809c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(20000, start); 1810c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else { 1811c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = entry->GetAvailableRange(19400, kSize, &start, &cb); 1812c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(3016, cb.GetResult(rv)); 1813c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(20480, start); 1814c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1815c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = entry->GetAvailableRange(3073, kSize, &start, &cb); 1816c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1523, cb.GetResult(rv)); 1817c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(3073, start); 1818c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = entry->GetAvailableRange(4600, kSize, &start, &cb); 1819c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(0, cb.GetResult(rv)); 1820c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(4600, start); 1821c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1822c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Now make another write and verify that there is no hole in between. 18233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteSparseData(entry, 500 + kSize, buf1, kSize)); 1824c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = entry->GetAvailableRange(1024, 10000, &start, &cb); 1825c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(7 * 1024 + 500, cb.GetResult(rv)); 1826c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(1024, start); 18273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, ReadSparseData(entry, kSize, buf2, kSize)); 1828c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, memcmp(buf2->data(), buf1->data() + kSize - 500, 500)); 1829c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, memcmp(buf2->data() + 500, buf1->data(), kSize - 500)); 1830c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1831c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1832c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1833c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1834c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, PartialSparseEntry) { 1835c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1836c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott PartialSparseEntry(); 1837c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1838c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1839c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, MemoryPartialSparseEntry) { 1840c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetMemoryOnlyMode(); 1841c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1842c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott PartialSparseEntry(); 1843c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1844c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1845c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that corrupt sparse children are removed automatically. 1846c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, CleanupSparseEntry) { 1847c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1848c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string key("the first key"); 1849c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry* entry; 1850c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 1851c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1852c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize = 4 * 1024; 1853513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buf1(new net::IOBuffer(kSize)); 1854c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(buf1->data(), kSize, false); 1855c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1856c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int k1Meg = 1024 * 1024; 18573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteSparseData(entry, 8192, buf1, kSize)); 18583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteSparseData(entry, k1Meg + 8192, buf1, kSize)); 18593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteSparseData(entry, 2 * k1Meg + 8192, buf1, kSize)); 1860c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1861c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(4, cache_->GetEntryCount()); 1862c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1863c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void* iter = NULL; 1864c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int count = 0; 1865c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string child_key[2]; 1866c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch while (OpenNextEntry(&iter, &entry) == net::OK) { 1867c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(entry != NULL); 1868c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Writing to an entry will alter the LRU list and invalidate the iterator. 1869c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (entry->GetKey() != key && count < 2) 1870c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott child_key[count++] = entry->GetKey(); 1871c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1872c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1873c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < 2; i++) { 1874c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenEntry(child_key[i], &entry)); 1875c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Overwrite the header's magic and signature. 18763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(12, WriteData(entry, 2, 0, buf1, 12, false)); 1877c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1878c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1879c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1880c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(4, cache_->GetEntryCount()); 1881c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 1882c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1883c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Two children should be gone. One while reading and one while writing. 18843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, ReadSparseData(entry, 2 * k1Meg + 8192, buf1, kSize)); 18853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, WriteSparseData(entry, k1Meg + 16384, buf1, kSize)); 18863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0, ReadSparseData(entry, k1Meg + 8192, buf1, kSize)); 1887c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1888c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // We never touched this one. 18893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kSize, ReadSparseData(entry, 8192, buf1, kSize)); 1890c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1891c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1892c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // We re-created one of the corrupt children. 1893c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(3, cache_->GetEntryCount()); 1894c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1895c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1896c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheEntryTest, CancelSparseIO) { 1897c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UseCurrentThread(); 1898c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott InitCache(); 1899c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string key("the first key"); 1900c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry* entry; 1901c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 1902c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1903c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int kSize = 40 * 1024; 1904513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kSize)); 1905c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CacheTestFillBuffer(buf->data(), kSize, false); 1906c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1907c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This will open and write two "real" entries. 1908c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestCompletionCallback cb1, cb2, cb3, cb4, cb5; 1909c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int rv = entry->WriteSparseData(1024 * 1024 - 4096, buf, kSize, &cb1); 1910c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(net::ERR_IO_PENDING, rv); 1911c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1912c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int64 offset = 0; 1913c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = entry->GetAvailableRange(offset, kSize, &offset, &cb5); 1914c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = cb5.GetResult(rv); 1915c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!cb1.have_result()) { 1916c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We may or may not have finished writing to the entry. If we have not, 1917c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // we cannot start another operation at this time. 1918c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(net::ERR_CACHE_OPERATION_NOT_SUPPORTED, rv); 1919c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1920c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1921c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // We cancel the pending operation, and register multiple notifications. 1922c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->CancelSparseIO(); 1923c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(net::ERR_IO_PENDING, entry->ReadyForSparseIO(&cb2)); 1924c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(net::ERR_IO_PENDING, entry->ReadyForSparseIO(&cb3)); 1925c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->CancelSparseIO(); // Should be a no op at this point. 1926c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(net::ERR_IO_PENDING, entry->ReadyForSparseIO(&cb4)); 1927c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1928c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!cb1.have_result()) { 1929c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(net::ERR_CACHE_OPERATION_NOT_SUPPORTED, 1930c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry->ReadSparseData(offset, buf, kSize, NULL)); 1931c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(net::ERR_CACHE_OPERATION_NOT_SUPPORTED, 1932c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry->WriteSparseData(offset, buf, kSize, NULL)); 1933c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1934c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1935c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now see if we receive all notifications. Note that we should not be able 1936c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // to write everything (unless the timing of the system is really weird). 1937c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = cb1.WaitForResult(); 1938c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(rv == 4096 || rv == kSize); 1939c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(net::OK, cb2.WaitForResult()); 1940c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(net::OK, cb3.WaitForResult()); 1941c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(net::OK, cb4.WaitForResult()); 1942c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1943c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = entry->GetAvailableRange(offset, kSize, &offset, &cb5); 1944c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(0, cb5.GetResult(rv)); 1945c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott entry->Close(); 1946c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1947ea380985f4dd3c72953f7df161674e1644d6de90Kristian Monsen 1948ea380985f4dd3c72953f7df161674e1644d6de90Kristian Monsen// Tests that we perform sanity checks on an entry's key. Note that there are 1949ea380985f4dd3c72953f7df161674e1644d6de90Kristian Monsen// other tests that exercise sanity checks by using saved corrupt files. 1950ea380985f4dd3c72953f7df161674e1644d6de90Kristian MonsenTEST_F(DiskCacheEntryTest, KeySanityCheck) { 1951ea380985f4dd3c72953f7df161674e1644d6de90Kristian Monsen UseCurrentThread(); 1952ea380985f4dd3c72953f7df161674e1644d6de90Kristian Monsen InitCache(); 1953ea380985f4dd3c72953f7df161674e1644d6de90Kristian Monsen std::string key("the first key"); 1954ea380985f4dd3c72953f7df161674e1644d6de90Kristian Monsen disk_cache::Entry* entry; 1955ea380985f4dd3c72953f7df161674e1644d6de90Kristian Monsen ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 1956ea380985f4dd3c72953f7df161674e1644d6de90Kristian Monsen 1957ea380985f4dd3c72953f7df161674e1644d6de90Kristian Monsen disk_cache::EntryImpl* entry_impl = 1958ea380985f4dd3c72953f7df161674e1644d6de90Kristian Monsen static_cast<disk_cache::EntryImpl*>(entry); 1959ea380985f4dd3c72953f7df161674e1644d6de90Kristian Monsen disk_cache::EntryStore* store = entry_impl->entry()->Data(); 1960ea380985f4dd3c72953f7df161674e1644d6de90Kristian Monsen 1961ea380985f4dd3c72953f7df161674e1644d6de90Kristian Monsen // We have reserved space for a short key (one block), let's say that the key 1962ea380985f4dd3c72953f7df161674e1644d6de90Kristian Monsen // takes more than one block, and remove the NULLs after the actual key. 1963ea380985f4dd3c72953f7df161674e1644d6de90Kristian Monsen store->key_len = 800; 1964ea380985f4dd3c72953f7df161674e1644d6de90Kristian Monsen memset(store->key + key.size(), 'k', sizeof(store->key) - key.size()); 1965ea380985f4dd3c72953f7df161674e1644d6de90Kristian Monsen entry_impl->entry()->set_modified(); 1966ea380985f4dd3c72953f7df161674e1644d6de90Kristian Monsen entry->Close(); 1967ea380985f4dd3c72953f7df161674e1644d6de90Kristian Monsen 1968ea380985f4dd3c72953f7df161674e1644d6de90Kristian Monsen // We have a corrupt entry. Now reload it. We should NOT read beyond the 1969ea380985f4dd3c72953f7df161674e1644d6de90Kristian Monsen // allocated buffer here. 1970ea380985f4dd3c72953f7df161674e1644d6de90Kristian Monsen ASSERT_NE(net::OK, OpenEntry(key, &entry)); 1971ea380985f4dd3c72953f7df161674e1644d6de90Kristian Monsen DisableIntegrityCheck(); 1972ea380985f4dd3c72953f7df161674e1644d6de90Kristian Monsen} 1973