| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/basictypes.h" | 5 #include "base/basictypes.h" |
| 6 #include "base/bind.h" | 6 #include "base/bind.h" |
| 7 #include "base/bind_helpers.h" | 7 #include "base/bind_helpers.h" |
| 8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
| 9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
| 10 #include "base/stringprintf.h" | 10 #include "base/stringprintf.h" |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 | 28 |
| 29 // Tests that can run with different types of caches. | 29 // Tests that can run with different types of caches. |
| 30 class DiskCacheEntryTest : public DiskCacheTestWithCache { | 30 class DiskCacheEntryTest : public DiskCacheTestWithCache { |
| 31 public: | 31 public: |
| 32 void InternalSyncIOBackground(disk_cache::Entry* entry); | 32 void InternalSyncIOBackground(disk_cache::Entry* entry); |
| 33 void ExternalSyncIOBackground(disk_cache::Entry* entry); | 33 void ExternalSyncIOBackground(disk_cache::Entry* entry); |
| 34 | 34 |
| 35 protected: | 35 protected: |
| 36 void InternalSyncIO(); | 36 void InternalSyncIO(); |
| 37 void InternalAsyncIO(); | 37 void InternalAsyncIO(); |
| 38 void InternalConcurrentIO(); |
| 38 void ExternalSyncIO(); | 39 void ExternalSyncIO(); |
| 39 void ExternalAsyncIO(); | 40 void ExternalAsyncIO(); |
| 40 void ReleaseBuffer(); | 41 void ReleaseBuffer(); |
| 41 void StreamAccess(); | 42 void StreamAccess(); |
| 42 void GetKey(); | 43 void GetKey(); |
| 43 void GetTimes(); | 44 void GetTimes(); |
| 44 void GrowData(); | 45 void GrowData(); |
| 45 void TruncateData(); | 46 void TruncateData(); |
| 46 void ZeroLengthIO(); | 47 void ZeroLengthIO(); |
| 47 void Buffering(); | 48 void Buffering(); |
| 48 void SizeAtCreate(); | 49 void SizeAtCreate(); |
| 49 void SizeChanges(); | 50 void SizeChanges(); |
| 50 void ReuseEntry(int size); | 51 void ReuseEntry(int size); |
| 51 void InvalidData(); | 52 void InvalidData(); |
| 52 void ReadWriteDestroyBuffer(); | 53 void ReadWriteDestroyBuffer(); |
| 53 void DoomNormalEntry(); | 54 void DoomNormalEntry(); |
| 54 void DoomEntryNextToOpenEntry(); | 55 void DoomEntryNextToOpenEntry(); |
| 55 void DoomedEntry(); | 56 void DoomedEntry(); |
| 57 void MissingData(); |
| 56 void BasicSparseIO(); | 58 void BasicSparseIO(); |
| 57 void HugeSparseIO(); | 59 void HugeSparseIO(); |
| 58 void GetAvailableRange(); | 60 void SparseGetAvailableRange(); |
| 59 void CouldBeSparse(); | 61 void CouldBeSparse(); |
| 60 void UpdateSparseEntry(); | 62 void UpdateSparseEntry(); |
| 61 void DoomSparseEntry(); | 63 void DoomSparseEntry(); |
| 64 void DoomSparseEntry2(); |
| 62 void PartialSparseEntry(); | 65 void PartialSparseEntry(); |
| 63 void SimpleCacheMakeBadChecksumEntry(const char* key); | 66 void SimpleCacheMakeBadChecksumEntry(const char* key); |
| 67 void CleanupSparseEntry(); |
| 68 void CancelSparseIO(); |
| 69 void ReadyForSparseIONoCancel(); |
| 64 }; | 70 }; |
| 65 | 71 |
| 66 // This part of the test runs on the background thread. | 72 // This part of the test runs on the background thread. |
| 67 void DiskCacheEntryTest::InternalSyncIOBackground(disk_cache::Entry* entry) { | 73 void DiskCacheEntryTest::InternalSyncIOBackground(disk_cache::Entry* entry) { |
| 68 const int kSize1 = 10; | 74 const int kSize1 = 10; |
| 69 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize1)); | 75 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize1)); |
| 70 CacheTestFillBuffer(buffer1->data(), kSize1, false); | 76 CacheTestFillBuffer(buffer1->data(), kSize1, false); |
| 71 EXPECT_EQ(0, entry->ReadData( | 77 EXPECT_EQ(0, entry->ReadData(0, 0, buffer1.get(), kSize1, |
| 72 0, 0, buffer1, kSize1, net::CompletionCallback())); | 78 net::CompletionCallback())); |
| 73 base::strlcpy(buffer1->data(), "the data", kSize1); | 79 base::strlcpy(buffer1->data(), "the data", kSize1); |
| 74 EXPECT_EQ(10, entry->WriteData( | 80 EXPECT_EQ(10, entry->WriteData(0, 0, buffer1.get(), kSize1, |
| 75 0, 0, buffer1, kSize1, net::CompletionCallback(), false)); | 81 net::CompletionCallback(), false)); |
| 76 memset(buffer1->data(), 0, kSize1); | 82 memset(buffer1->data(), 0, kSize1); |
| 77 EXPECT_EQ(10, entry->ReadData( | 83 EXPECT_EQ(10, entry->ReadData(0, 0, buffer1.get(), kSize1, |
| 78 0, 0, buffer1, kSize1, net::CompletionCallback())); | 84 net::CompletionCallback())); |
| 79 EXPECT_STREQ("the data", buffer1->data()); | 85 EXPECT_STREQ("the data", buffer1->data()); |
| 80 | 86 |
| 81 const int kSize2 = 5000; | 87 const int kSize2 = 5000; |
| 82 const int kSize3 = 10000; | 88 const int kSize3 = 10000; |
| 83 scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize2)); | 89 scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize2)); |
| 84 scoped_refptr<net::IOBuffer> buffer3(new net::IOBuffer(kSize3)); | 90 scoped_refptr<net::IOBuffer> buffer3(new net::IOBuffer(kSize3)); |
| 85 memset(buffer3->data(), 0, kSize3); | 91 memset(buffer3->data(), 0, kSize3); |
| 86 CacheTestFillBuffer(buffer2->data(), kSize2, false); | 92 CacheTestFillBuffer(buffer2->data(), kSize2, false); |
| 87 base::strlcpy(buffer2->data(), "The really big data goes here", kSize2); | 93 base::strlcpy(buffer2->data(), "The really big data goes here", kSize2); |
| 88 EXPECT_EQ(5000, entry->WriteData( | 94 EXPECT_EQ(5000, entry->WriteData(1, 1500, buffer2.get(), kSize2, |
| 89 1, 1500, buffer2, kSize2, net::CompletionCallback(), false)); | 95 net::CompletionCallback(), false)); |
| 90 memset(buffer2->data(), 0, kSize2); | 96 memset(buffer2->data(), 0, kSize2); |
| 91 EXPECT_EQ(4989, entry->ReadData( | 97 EXPECT_EQ(4989, entry->ReadData(1, 1511, buffer2.get(), kSize2, |
| 92 1, 1511, buffer2, kSize2, net::CompletionCallback())); | 98 net::CompletionCallback())); |
| 93 EXPECT_STREQ("big data goes here", buffer2->data()); | 99 EXPECT_STREQ("big data goes here", buffer2->data()); |
| 94 EXPECT_EQ(5000, entry->ReadData( | 100 EXPECT_EQ(5000, entry->ReadData(1, 0, buffer2.get(), kSize2, |
| 95 1, 0, buffer2, kSize2, net::CompletionCallback())); | 101 net::CompletionCallback())); |
| 96 EXPECT_EQ(0, memcmp(buffer2->data(), buffer3->data(), 1500)); | 102 EXPECT_EQ(0, memcmp(buffer2->data(), buffer3->data(), 1500)); |
| 97 EXPECT_EQ(1500, entry->ReadData( | 103 EXPECT_EQ(1500, entry->ReadData(1, 5000, buffer2.get(), kSize2, |
| 98 1, 5000, buffer2, kSize2, net::CompletionCallback())); | 104 net::CompletionCallback())); |
| 99 | 105 |
| 100 EXPECT_EQ(0, entry->ReadData( | 106 EXPECT_EQ(0, entry->ReadData(1, 6500, buffer2.get(), kSize2, |
| 101 1, 6500, buffer2, kSize2, net::CompletionCallback())); | 107 net::CompletionCallback())); |
| 102 EXPECT_EQ(6500, entry->ReadData( | 108 EXPECT_EQ(6500, entry->ReadData(1, 0, buffer3.get(), kSize3, |
| 103 1, 0, buffer3, kSize3, net::CompletionCallback())); | 109 net::CompletionCallback())); |
| 104 EXPECT_EQ(8192, entry->WriteData( | 110 EXPECT_EQ(8192, entry->WriteData(1, 0, buffer3.get(), 8192, |
| 105 1, 0, buffer3, 8192, net::CompletionCallback(), false)); | 111 net::CompletionCallback(), false)); |
| 106 EXPECT_EQ(8192, entry->ReadData( | 112 EXPECT_EQ(8192, entry->ReadData(1, 0, buffer3.get(), kSize3, |
| 107 1, 0, buffer3, kSize3, net::CompletionCallback())); | 113 net::CompletionCallback())); |
| 108 EXPECT_EQ(8192, entry->GetDataSize(1)); | 114 EXPECT_EQ(8192, entry->GetDataSize(1)); |
| 109 | 115 |
| 110 // We need to delete the memory buffer on this thread. | 116 // We need to delete the memory buffer on this thread. |
| 111 EXPECT_EQ(0, entry->WriteData( | 117 EXPECT_EQ(0, |
| 112 0, 0, NULL, 0, net::CompletionCallback(), true)); | 118 entry->WriteData(0, 0, NULL, 0, net::CompletionCallback(), true)); |
| 113 EXPECT_EQ(0, entry->WriteData( | 119 EXPECT_EQ(0, |
| 114 1, 0, NULL, 0, net::CompletionCallback(), true)); | 120 entry->WriteData(1, 0, NULL, 0, net::CompletionCallback(), true)); |
| 115 } | 121 } |
| 116 | 122 |
| 117 // We need to support synchronous IO even though it is not a supported operation | 123 // We need to support synchronous IO even though it is not a supported operation |
| 118 // from the point of view of the disk cache's public interface, because we use | 124 // from the point of view of the disk cache's public interface, because we use |
| 119 // it internally, not just by a few tests, but as part of the implementation | 125 // it internally, not just by a few tests, but as part of the implementation |
| 120 // (see sparse_control.cc, for example). | 126 // (see sparse_control.cc, for example). |
| 121 void DiskCacheEntryTest::InternalSyncIO() { | 127 void DiskCacheEntryTest::InternalSyncIO() { |
| 122 disk_cache::Entry* entry = NULL; | 128 disk_cache::Entry* entry = NULL; |
| 123 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry)); | 129 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry)); |
| 124 ASSERT_TRUE(NULL != entry); | 130 ASSERT_TRUE(NULL != entry); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 156 // that, IO operations will be really hitting the disk. We don't care about | 162 // that, IO operations will be really hitting the disk. We don't care about |
| 157 // the content, so just extending the entry is enough (all extensions zero- | 163 // the content, so just extending the entry is enough (all extensions zero- |
| 158 // fill any holes). | 164 // fill any holes). |
| 159 EXPECT_EQ(0, WriteData(entry, 0, 15 * 1024, NULL, 0, false)); | 165 EXPECT_EQ(0, WriteData(entry, 0, 15 * 1024, NULL, 0, false)); |
| 160 EXPECT_EQ(0, WriteData(entry, 1, 15 * 1024, NULL, 0, false)); | 166 EXPECT_EQ(0, WriteData(entry, 1, 15 * 1024, NULL, 0, false)); |
| 161 entry->Close(); | 167 entry->Close(); |
| 162 ASSERT_EQ(net::OK, OpenEntry("the first key", &entry)); | 168 ASSERT_EQ(net::OK, OpenEntry("the first key", &entry)); |
| 163 | 169 |
| 164 MessageLoopHelper helper; | 170 MessageLoopHelper helper; |
| 165 // Let's verify that each IO goes to the right callback object. | 171 // Let's verify that each IO goes to the right callback object. |
| 166 CallbackTest callback1(&helper, false); | 172 CallbackTest cb1(&helper, false); |
| 167 CallbackTest callback2(&helper, false); | 173 CallbackTest cb2(&helper, false); |
| 168 CallbackTest callback3(&helper, false); | 174 CallbackTest cb3(&helper, false); |
| 169 CallbackTest callback4(&helper, false); | 175 CallbackTest cb4(&helper, false); |
| 170 CallbackTest callback5(&helper, false); | 176 CallbackTest cb5(&helper, false); |
| 171 CallbackTest callback6(&helper, false); | 177 CallbackTest cb6(&helper, false); |
| 172 CallbackTest callback7(&helper, false); | 178 CallbackTest cb7(&helper, false); |
| 173 CallbackTest callback8(&helper, false); | 179 CallbackTest cb8(&helper, false); |
| 174 CallbackTest callback9(&helper, false); | |
| 175 CallbackTest callback10(&helper, false); | |
| 176 CallbackTest callback11(&helper, false); | |
| 177 CallbackTest callback12(&helper, false); | |
| 178 CallbackTest callback13(&helper, false); | |
| 179 | 180 |
| 180 const int kSize1 = 10; | 181 const int kSize1 = 10; |
| 181 const int kSize2 = 5000; | 182 const int kSize2 = 5000; |
| 182 const int kSize3 = 10000; | 183 const int kSize3 = 10000; |
| 183 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize1)); | 184 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize1)); |
| 184 scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize2)); | 185 scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize2)); |
| 185 scoped_refptr<net::IOBuffer> buffer3(new net::IOBuffer(kSize3)); | 186 scoped_refptr<net::IOBuffer> buffer3(new net::IOBuffer(kSize3)); |
| 186 CacheTestFillBuffer(buffer1->data(), kSize1, false); | 187 CacheTestFillBuffer(buffer1->data(), kSize1, false); |
| 187 CacheTestFillBuffer(buffer2->data(), kSize2, false); | 188 CacheTestFillBuffer(buffer2->data(), kSize2, false); |
| 188 CacheTestFillBuffer(buffer3->data(), kSize3, false); | 189 CacheTestFillBuffer(buffer3->data(), kSize3, false); |
| 189 | 190 |
| 190 EXPECT_EQ(0, entry->ReadData( | 191 int ret = entry->ReadData(0, 15 * 1024, buffer1.get(), kSize1, |
| 191 0, 15 * 1024, buffer1, kSize1, | 192 cb1.callback()); |
| 192 base::Bind(&CallbackTest::Run, base::Unretained(&callback1)))); | 193 int expected = 0; |
| 194 EXPECT_TRUE(0 == ret || net::ERR_IO_PENDING == ret); |
| 195 if (net::ERR_IO_PENDING == ret) |
| 196 expected++; |
| 197 |
| 193 base::strlcpy(buffer1->data(), "the data", kSize1); | 198 base::strlcpy(buffer1->data(), "the data", kSize1); |
| 194 int expected = 0; | 199 ret = entry->WriteData(0, 0, buffer1.get(), kSize1, cb2.callback(), false); |
| 195 int ret = entry->WriteData( | |
| 196 0, 0, buffer1, kSize1, | |
| 197 base::Bind(&CallbackTest::Run, base::Unretained(&callback2)), false); | |
| 198 EXPECT_TRUE(10 == ret || net::ERR_IO_PENDING == ret); | 200 EXPECT_TRUE(10 == ret || net::ERR_IO_PENDING == ret); |
| 199 if (net::ERR_IO_PENDING == ret) | 201 if (net::ERR_IO_PENDING == ret) |
| 200 expected++; | 202 expected++; |
| 201 | 203 |
| 202 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); | 204 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); |
| 205 |
| 203 memset(buffer2->data(), 0, kSize2); | 206 memset(buffer2->data(), 0, kSize2); |
| 204 ret = entry->ReadData( | 207 EXPECT_EQ(10, ReadData(entry, 0, 0, buffer2.get(), kSize1)); |
| 205 0, 0, buffer2, kSize1, | |
| 206 base::Bind(&CallbackTest::Run, base::Unretained(&callback3))); | |
| 207 EXPECT_TRUE(10 == ret || net::ERR_IO_PENDING == ret); | |
| 208 if (net::ERR_IO_PENDING == ret) | |
| 209 expected++; | |
| 210 | |
| 211 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); | |
| 212 EXPECT_STREQ("the data", buffer2->data()); | 208 EXPECT_STREQ("the data", buffer2->data()); |
| 213 | 209 |
| 214 base::strlcpy(buffer2->data(), "The really big data goes here", kSize2); | 210 base::strlcpy(buffer2->data(), "The really big data goes here", kSize2); |
| 215 ret = entry->WriteData( | 211 EXPECT_EQ(5000, WriteData(entry, 1, 1500, buffer2.get(), kSize2, true)); |
| 216 1, 1500, buffer2, kSize2, | |
| 217 base::Bind(&CallbackTest::Run, base::Unretained(&callback4)), true); | |
| 218 EXPECT_TRUE(5000 == ret || net::ERR_IO_PENDING == ret); | |
| 219 if (net::ERR_IO_PENDING == ret) | |
| 220 expected++; | |
| 221 | |
| 222 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); | |
| 223 memset(buffer3->data(), 0, kSize3); | |
| 224 ret = entry->ReadData( | |
| 225 1, 1511, buffer3, kSize2, | |
| 226 base::Bind(&CallbackTest::Run, base::Unretained(&callback5))); | |
| 227 EXPECT_TRUE(4989 == ret || net::ERR_IO_PENDING == ret); | |
| 228 if (net::ERR_IO_PENDING == ret) | |
| 229 expected++; | |
| 230 | |
| 231 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); | |
| 232 EXPECT_STREQ("big data goes here", buffer3->data()); | |
| 233 ret = entry->ReadData( | |
| 234 1, 0, buffer2, kSize2, | |
| 235 base::Bind(&CallbackTest::Run, base::Unretained(&callback6))); | |
| 236 EXPECT_TRUE(5000 == ret || net::ERR_IO_PENDING == ret); | |
| 237 if (net::ERR_IO_PENDING == ret) | |
| 238 expected++; | |
| 239 | 212 |
| 240 memset(buffer3->data(), 0, kSize3); | 213 memset(buffer3->data(), 0, kSize3); |
| 214 EXPECT_EQ(4989, ReadData(entry, 1, 1511, buffer3.get(), kSize2)); |
| 215 EXPECT_STREQ("big data goes here", buffer3->data()); |
| 241 | 216 |
| 242 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); | 217 ret = ReadData(entry, 1, 0, buffer2.get(), kSize2); |
| 218 EXPECT_TRUE(ret == 1500 || ret == 5000); |
| 219 memset(buffer3->data(), 0, kSize3); |
| 243 EXPECT_EQ(0, memcmp(buffer2->data(), buffer3->data(), 1500)); | 220 EXPECT_EQ(0, memcmp(buffer2->data(), buffer3->data(), 1500)); |
| 244 ret = entry->ReadData( | 221 |
| 245 1, 5000, buffer2, kSize2, | 222 ret = entry->ReadData(1, 5000, buffer2.get(), kSize2, cb3.callback()); |
| 246 base::Bind(&CallbackTest::Run, base::Unretained(&callback7))); | |
| 247 EXPECT_TRUE(1500 == ret || net::ERR_IO_PENDING == ret); | 223 EXPECT_TRUE(1500 == ret || net::ERR_IO_PENDING == ret); |
| 248 if (net::ERR_IO_PENDING == ret) | 224 if (net::ERR_IO_PENDING == ret) |
| 249 expected++; | 225 expected++; |
| 250 | 226 |
| 251 ret = entry->ReadData( | 227 ret = entry->ReadData(1, 0, buffer3.get(), kSize3, cb4.callback()); |
| 252 1, 0, buffer3, kSize3, | |
| 253 base::Bind(&CallbackTest::Run, base::Unretained(&callback9))); | |
| 254 EXPECT_TRUE(6500 == ret || net::ERR_IO_PENDING == ret); | 228 EXPECT_TRUE(6500 == ret || net::ERR_IO_PENDING == ret); |
| 255 if (net::ERR_IO_PENDING == ret) | 229 if (net::ERR_IO_PENDING == ret) |
| 256 expected++; | 230 expected++; |
| 257 | 231 |
| 258 ret = entry->WriteData( | 232 ret = entry->WriteData(1, 0, buffer3.get(), 8192, cb5.callback(), true); |
| 259 1, 0, buffer3, 8192, | |
| 260 base::Bind(&CallbackTest::Run, base::Unretained(&callback10)), true); | |
| 261 EXPECT_TRUE(8192 == ret || net::ERR_IO_PENDING == ret); | 233 EXPECT_TRUE(8192 == ret || net::ERR_IO_PENDING == ret); |
| 262 if (net::ERR_IO_PENDING == ret) | 234 if (net::ERR_IO_PENDING == ret) |
| 263 expected++; | 235 expected++; |
| 264 | 236 |
| 265 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); | 237 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); |
| 266 ret = entry->ReadData( | 238 ret = entry->ReadData(1, 0, buffer3.get(), kSize3, cb6.callback()); |
| 267 1, 0, buffer3, kSize3, | |
| 268 base::Bind(&CallbackTest::Run, base::Unretained(&callback11))); | |
| 269 EXPECT_TRUE(8192 == ret || net::ERR_IO_PENDING == ret); | 239 EXPECT_TRUE(8192 == ret || net::ERR_IO_PENDING == ret); |
| 270 if (net::ERR_IO_PENDING == ret) | 240 if (net::ERR_IO_PENDING == ret) |
| 271 expected++; | 241 expected++; |
| 272 | 242 |
| 273 EXPECT_EQ(8192, entry->GetDataSize(1)); | 243 EXPECT_EQ(8192, entry->GetDataSize(1)); |
| 274 | 244 |
| 275 ret = entry->ReadData( | 245 ret = entry->ReadData(0, 0, buffer1.get(), kSize1, cb7.callback()); |
| 276 0, 0, buffer1, kSize1, | |
| 277 base::Bind(&CallbackTest::Run, base::Unretained(&callback12))); | |
| 278 EXPECT_TRUE(10 == ret || net::ERR_IO_PENDING == ret); | 246 EXPECT_TRUE(10 == ret || net::ERR_IO_PENDING == ret); |
| 279 if (net::ERR_IO_PENDING == ret) | 247 if (net::ERR_IO_PENDING == ret) |
| 280 expected++; | 248 expected++; |
| 281 | 249 |
| 282 ret = entry->ReadData( | 250 ret = entry->ReadData(1, 0, buffer2.get(), kSize2, cb8.callback()); |
| 283 1, 0, buffer2, kSize2, | |
| 284 base::Bind(&CallbackTest::Run, base::Unretained(&callback13))); | |
| 285 EXPECT_TRUE(5000 == ret || net::ERR_IO_PENDING == ret); | 251 EXPECT_TRUE(5000 == ret || net::ERR_IO_PENDING == ret); |
| 286 if (net::ERR_IO_PENDING == ret) | 252 if (net::ERR_IO_PENDING == ret) |
| 287 expected++; | 253 expected++; |
| 288 | 254 |
| 289 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); | 255 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); |
| 290 | 256 |
| 291 EXPECT_FALSE(helper.callback_reused_error()); | 257 EXPECT_FALSE(helper.callback_reused_error()); |
| 292 | 258 |
| 293 entry->Doom(); | 259 entry->Doom(); |
| 294 entry->Close(); | 260 entry->Close(); |
| 295 FlushQueueForTest(); | 261 FlushQueueForTest(); |
| 296 EXPECT_EQ(0, cache_->GetEntryCount()); | 262 EXPECT_EQ(0, cache_->GetEntryCount()); |
| 297 } | 263 } |
| 298 | 264 |
| 299 TEST_F(DiskCacheEntryTest, InternalAsyncIO) { | 265 TEST_F(DiskCacheEntryTest, InternalAsyncIO) { |
| 300 InitCache(); | 266 InitCache(); |
| 301 InternalAsyncIO(); | 267 InternalAsyncIO(); |
| 302 } | 268 } |
| 303 | 269 |
| 270 TEST_F(DiskCacheEntryTest, V3InternalAsyncIO) { |
| 271 UseVersion3(); |
| 272 InitCache(); |
| 273 InternalAsyncIO(); |
| 274 } |
| 275 |
| 304 TEST_F(DiskCacheEntryTest, MemoryOnlyInternalAsyncIO) { | 276 TEST_F(DiskCacheEntryTest, MemoryOnlyInternalAsyncIO) { |
| 305 SetMemoryOnlyMode(); | 277 SetMemoryOnlyMode(); |
| 306 InitCache(); | 278 InitCache(); |
| 307 InternalAsyncIO(); | 279 InternalAsyncIO(); |
| 308 } | 280 } |
| 309 | 281 |
| 310 // This part of the test runs on the background thread. | 282 // This part of the test runs on the background thread. |
| 311 void DiskCacheEntryTest::ExternalSyncIOBackground(disk_cache::Entry* entry) { | 283 void DiskCacheEntryTest::ExternalSyncIOBackground(disk_cache::Entry* entry) { |
| 312 const int kSize1 = 17000; | 284 const int kSize1 = 17000; |
| 313 const int kSize2 = 25000; | 285 const int kSize2 = 25000; |
| 314 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize1)); | 286 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize1)); |
| 315 scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize2)); | 287 scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize2)); |
| 316 CacheTestFillBuffer(buffer1->data(), kSize1, false); | 288 CacheTestFillBuffer(buffer1->data(), kSize1, false); |
| 317 CacheTestFillBuffer(buffer2->data(), kSize2, false); | 289 CacheTestFillBuffer(buffer2->data(), kSize2, false); |
| 318 base::strlcpy(buffer1->data(), "the data", kSize1); | 290 base::strlcpy(buffer1->data(), "the data", kSize1); |
| 319 EXPECT_EQ(17000, entry->WriteData( | 291 EXPECT_EQ(17000, entry->WriteData(0, 0, buffer1.get(), kSize1, |
| 320 0, 0, buffer1, kSize1, net::CompletionCallback(), false)); | 292 net::CompletionCallback(), false)); |
| 321 memset(buffer1->data(), 0, kSize1); | 293 memset(buffer1->data(), 0, kSize1); |
| 322 EXPECT_EQ(17000, entry->ReadData( | 294 EXPECT_EQ(17000, entry->ReadData(0, 0, buffer1.get(), kSize1, |
| 323 0, 0, buffer1, kSize1, net::CompletionCallback())); | 295 net::CompletionCallback())); |
| 324 EXPECT_STREQ("the data", buffer1->data()); | 296 EXPECT_STREQ("the data", buffer1->data()); |
| 325 | 297 |
| 326 base::strlcpy(buffer2->data(), "The really big data goes here", kSize2); | 298 base::strlcpy(buffer2->data(), "The really big data goes here", kSize2); |
| 327 EXPECT_EQ(25000, entry->WriteData( | 299 EXPECT_EQ(25000, entry->WriteData(1, 10000, buffer2.get(), kSize2, |
| 328 1, 10000, buffer2, kSize2, net::CompletionCallback(), false)); | 300 net::CompletionCallback(), false)); |
| 329 memset(buffer2->data(), 0, kSize2); | 301 memset(buffer2->data(), 0, kSize2); |
| 330 EXPECT_EQ(24989, entry->ReadData( | 302 EXPECT_EQ(24989, entry->ReadData(1, 10011, buffer2.get(), kSize2, |
| 331 1, 10011, buffer2, kSize2, net::CompletionCallback())); | 303 net::CompletionCallback())); |
| 332 EXPECT_STREQ("big data goes here", buffer2->data()); | 304 EXPECT_STREQ("big data goes here", buffer2->data()); |
| 333 EXPECT_EQ(25000, entry->ReadData( | 305 EXPECT_EQ(25000, entry->ReadData(1, 0, buffer2.get(), kSize2, |
| 334 1, 0, buffer2, kSize2, net::CompletionCallback())); | 306 net::CompletionCallback())); |
| 335 EXPECT_EQ(0, memcmp(buffer2->data(), buffer2->data(), 10000)); | 307 EXPECT_EQ(5000, entry->ReadData(1, 30000, buffer2.get(), kSize2, |
| 336 EXPECT_EQ(5000, entry->ReadData( | 308 net::CompletionCallback())); |
| 337 1, 30000, buffer2, kSize2, net::CompletionCallback())); | |
| 338 | 309 |
| 339 EXPECT_EQ(0, entry->ReadData( | 310 EXPECT_EQ(0, entry->ReadData(1, 35000, buffer2.get(), kSize2, |
| 340 1, 35000, buffer2, kSize2, net::CompletionCallback())); | 311 net::CompletionCallback())); |
| 341 EXPECT_EQ(17000, entry->ReadData( | 312 EXPECT_EQ(17000, entry->ReadData(1, 0, buffer1.get(), kSize1, |
| 342 1, 0, buffer1, kSize1, net::CompletionCallback())); | 313 net::CompletionCallback())); |
| 343 EXPECT_EQ(17000, entry->WriteData( | 314 EXPECT_EQ(17000, entry->WriteData(1, 20000, buffer1.get(), kSize1, |
| 344 1, 20000, buffer1, kSize1, net::CompletionCallback(), false)); | 315 net::CompletionCallback(), false)); |
| 345 EXPECT_EQ(37000, entry->GetDataSize(1)); | 316 EXPECT_EQ(37000, entry->GetDataSize(1)); |
| 346 | 317 |
| 347 // We need to delete the memory buffer on this thread. | 318 // We need to delete the memory buffer on this thread. |
| 348 EXPECT_EQ(0, entry->WriteData( | 319 EXPECT_EQ(0, |
| 349 0, 0, NULL, 0, net::CompletionCallback(), true)); | 320 entry->WriteData(0, 0, NULL, 0, net::CompletionCallback(), true)); |
| 350 EXPECT_EQ(0, entry->WriteData( | 321 EXPECT_EQ(0, |
| 351 1, 0, NULL, 0, net::CompletionCallback(), true)); | 322 entry->WriteData(1, 0, NULL, 0, net::CompletionCallback(), true)); |
| 352 } | 323 } |
| 353 | 324 |
| 354 void DiskCacheEntryTest::ExternalSyncIO() { | 325 void DiskCacheEntryTest::ExternalSyncIO() { |
| 355 disk_cache::Entry* entry; | 326 disk_cache::Entry* entry; |
| 356 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry)); | 327 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry)); |
| 357 | 328 |
| 358 // The bulk of the test runs from within the callback, on the cache thread. | 329 // The bulk of the test runs from within the callback, on the cache thread. |
| 359 RunTaskForTest(base::Bind(&DiskCacheEntryTest::ExternalSyncIOBackground, | 330 RunTaskForTest(base::Bind(&DiskCacheEntryTest::ExternalSyncIOBackground, |
| 360 base::Unretained(this), | 331 base::Unretained(this), |
| 361 entry)); | 332 entry)); |
| 362 | 333 |
| 363 entry->Doom(); | 334 entry->Doom(); |
| 364 entry->Close(); | 335 entry->Close(); |
| 365 FlushQueueForTest(); | 336 FlushQueueForTest(); |
| 366 EXPECT_EQ(0, cache_->GetEntryCount()); | 337 EXPECT_EQ(0, cache_->GetEntryCount()); |
| 367 } | 338 } |
| 368 | 339 |
| 369 TEST_F(DiskCacheEntryTest, ExternalSyncIO) { | 340 TEST_F(DiskCacheEntryTest, ExternalSyncIO) { |
| 370 InitCache(); | 341 InitCache(); |
| 371 ExternalSyncIO(); | 342 ExternalSyncIO(); |
| 372 } | 343 } |
| 373 | 344 |
| 345 TEST_F(DiskCacheEntryTest, V3ExternalSyncIO) { |
| 346 UseVersion3(); |
| 347 InitCache(); |
| 348 ExternalSyncIO(); |
| 349 } |
| 350 |
| 374 TEST_F(DiskCacheEntryTest, ExternalSyncIONoBuffer) { | 351 TEST_F(DiskCacheEntryTest, ExternalSyncIONoBuffer) { |
| 375 InitCache(); | 352 InitCache(); |
| 376 cache_impl_->SetFlags(disk_cache::kNoBuffering); | 353 SetNoBuffering(); |
| 377 ExternalSyncIO(); | 354 ExternalSyncIO(); |
| 378 } | 355 } |
| 379 | 356 |
| 380 TEST_F(DiskCacheEntryTest, MemoryOnlyExternalSyncIO) { | 357 TEST_F(DiskCacheEntryTest, MemoryOnlyExternalSyncIO) { |
| 381 SetMemoryOnlyMode(); | 358 SetMemoryOnlyMode(); |
| 382 InitCache(); | 359 InitCache(); |
| 383 ExternalSyncIO(); | 360 ExternalSyncIO(); |
| 384 } | 361 } |
| 385 | 362 |
| 386 void DiskCacheEntryTest::ExternalAsyncIO() { | 363 void DiskCacheEntryTest::ExternalAsyncIO() { |
| 387 disk_cache::Entry* entry; | 364 disk_cache::Entry* entry; |
| 388 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry)); | 365 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry)); |
| 389 | 366 |
| 390 int expected = 0; | 367 int expected = 0; |
| 391 | 368 |
| 392 MessageLoopHelper helper; | 369 MessageLoopHelper helper; |
| 393 // Let's verify that each IO goes to the right callback object. | 370 // Let's verify that each IO goes to the right callback object. |
| 394 CallbackTest callback1(&helper, false); | 371 CallbackTest cb1(&helper, false); |
| 395 CallbackTest callback2(&helper, false); | 372 CallbackTest cb2(&helper, false); |
| 396 CallbackTest callback3(&helper, false); | 373 CallbackTest cb3(&helper, false); |
| 397 CallbackTest callback4(&helper, false); | 374 CallbackTest cb4(&helper, false); |
| 398 CallbackTest callback5(&helper, false); | |
| 399 CallbackTest callback6(&helper, false); | |
| 400 CallbackTest callback7(&helper, false); | |
| 401 CallbackTest callback8(&helper, false); | |
| 402 CallbackTest callback9(&helper, false); | |
| 403 | 375 |
| 404 const int kSize1 = 17000; | 376 const int kSize1 = 17000; |
| 405 const int kSize2 = 25000; | 377 const int kSize2 = 25000; |
| 406 const int kSize3 = 25000; | 378 const int kSize3 = 25000; |
| 407 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize1)); | 379 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize1)); |
| 408 scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize2)); | 380 scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize2)); |
| 409 scoped_refptr<net::IOBuffer> buffer3(new net::IOBuffer(kSize3)); | 381 scoped_refptr<net::IOBuffer> buffer3(new net::IOBuffer(kSize3)); |
| 410 CacheTestFillBuffer(buffer1->data(), kSize1, false); | 382 CacheTestFillBuffer(buffer1->data(), kSize1, false); |
| 411 CacheTestFillBuffer(buffer2->data(), kSize2, false); | 383 CacheTestFillBuffer(buffer2->data(), kSize2, false); |
| 412 CacheTestFillBuffer(buffer3->data(), kSize3, false); | 384 CacheTestFillBuffer(buffer3->data(), kSize3, false); |
| 385 |
| 413 base::strlcpy(buffer1->data(), "the data", kSize1); | 386 base::strlcpy(buffer1->data(), "the data", kSize1); |
| 414 int ret = entry->WriteData( | 387 EXPECT_EQ(17000, WriteData(entry, 0, 0, buffer1.get(), kSize1, false)); |
| 415 0, 0, buffer1, kSize1, | 388 |
| 416 base::Bind(&CallbackTest::Run, base::Unretained(&callback1)), false); | 389 memset(buffer2->data(), 0, kSize1); |
| 390 EXPECT_EQ(17000, ReadData(entry, 0, 0, buffer2.get(), kSize1)); |
| 391 EXPECT_STREQ("the data", buffer2->data()); |
| 392 |
| 393 base::strlcpy(buffer2->data(), "The really big data goes here", kSize2); |
| 394 EXPECT_EQ(25000, WriteData(entry, 1, 10000, buffer2.get(), kSize2, false)); |
| 395 |
| 396 memset(buffer3->data(), 0, kSize3); |
| 397 EXPECT_EQ(24989, ReadData(entry, 1, 10011, buffer3.get(), kSize3)); |
| 398 EXPECT_STREQ("big data goes here", buffer3->data()); |
| 399 |
| 400 EXPECT_EQ(25000, ReadData(entry, 1, 0, buffer2.get(), kSize2)); |
| 401 memset(buffer3->data(), 0, kSize3); |
| 402 EXPECT_EQ(0, memcmp(buffer2->data(), buffer3->data(), 10000)); |
| 403 |
| 404 int ret = entry->ReadData(1, 30000, buffer2.get(), kSize2, cb1.callback()); |
| 405 EXPECT_TRUE(5000 == ret || net::ERR_IO_PENDING == ret); |
| 406 if (net::ERR_IO_PENDING == ret) |
| 407 expected++; |
| 408 |
| 409 EXPECT_EQ(0, |
| 410 entry->ReadData(1, 35000, buffer2.get(), kSize2, cb2.callback())); |
| 411 ret = entry->ReadData(1, 0, buffer1.get(), kSize1, cb3.callback()); |
| 417 EXPECT_TRUE(17000 == ret || net::ERR_IO_PENDING == ret); | 412 EXPECT_TRUE(17000 == ret || net::ERR_IO_PENDING == ret); |
| 418 if (net::ERR_IO_PENDING == ret) | 413 if (net::ERR_IO_PENDING == ret) |
| 419 expected++; | 414 expected++; |
| 420 | 415 |
| 421 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); | 416 ret = entry->WriteData(1, 20000, buffer3.get(), kSize1, cb4.callback(), |
| 422 | 417 false); |
| 423 memset(buffer2->data(), 0, kSize1); | |
| 424 ret = entry->ReadData( | |
| 425 0, 0, buffer2, kSize1, | |
| 426 base::Bind(&CallbackTest::Run, base::Unretained(&callback2))); | |
| 427 EXPECT_TRUE(17000 == ret || net::ERR_IO_PENDING == ret); | 418 EXPECT_TRUE(17000 == ret || net::ERR_IO_PENDING == ret); |
| 428 if (net::ERR_IO_PENDING == ret) | 419 if (net::ERR_IO_PENDING == ret) |
| 429 expected++; | 420 expected++; |
| 430 | |
| 431 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); | |
| 432 EXPECT_STREQ("the data", buffer2->data()); | |
| 433 | |
| 434 base::strlcpy(buffer2->data(), "The really big data goes here", kSize2); | |
| 435 ret = entry->WriteData( | |
| 436 1, 10000, buffer2, kSize2, | |
| 437 base::Bind(&CallbackTest::Run, base::Unretained(&callback3)), false); | |
| 438 EXPECT_TRUE(25000 == ret || net::ERR_IO_PENDING == ret); | |
| 439 if (net::ERR_IO_PENDING == ret) | |
| 440 expected++; | |
| 441 | |
| 442 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); | |
| 443 | |
| 444 memset(buffer3->data(), 0, kSize3); | |
| 445 ret = entry->ReadData( | |
| 446 1, 10011, buffer3, kSize3, | |
| 447 base::Bind(&CallbackTest::Run, base::Unretained(&callback4))); | |
| 448 EXPECT_TRUE(24989 == ret || net::ERR_IO_PENDING == ret); | |
| 449 if (net::ERR_IO_PENDING == ret) | |
| 450 expected++; | |
| 451 | |
| 452 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); | |
| 453 EXPECT_STREQ("big data goes here", buffer3->data()); | |
| 454 ret = entry->ReadData( | |
| 455 1, 0, buffer2, kSize2, | |
| 456 base::Bind(&CallbackTest::Run, base::Unretained(&callback5))); | |
| 457 EXPECT_TRUE(25000 == ret || net::ERR_IO_PENDING == ret); | |
| 458 if (net::ERR_IO_PENDING == ret) | |
| 459 expected++; | |
| 460 | |
| 461 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); | |
| 462 memset(buffer3->data(), 0, kSize3); | |
| 463 EXPECT_EQ(0, memcmp(buffer2->data(), buffer3->data(), 10000)); | |
| 464 ret = entry->ReadData( | |
| 465 1, 30000, buffer2, kSize2, | |
| 466 base::Bind(&CallbackTest::Run, base::Unretained(&callback6))); | |
| 467 EXPECT_TRUE(5000 == ret || net::ERR_IO_PENDING == ret); | |
| 468 if (net::ERR_IO_PENDING == ret) | |
| 469 expected++; | |
| 470 | |
| 471 EXPECT_EQ(0, entry->ReadData( | |
| 472 1, 35000, buffer2, kSize2, | |
| 473 base::Bind(&CallbackTest::Run, base::Unretained(&callback7)))); | |
| 474 ret = entry->ReadData( | |
| 475 1, 0, buffer1, kSize1, | |
| 476 base::Bind(&CallbackTest::Run, base::Unretained(&callback8))); | |
| 477 EXPECT_TRUE(17000 == ret || net::ERR_IO_PENDING == ret); | |
| 478 if (net::ERR_IO_PENDING == ret) | |
| 479 expected++; | |
| 480 ret = entry->WriteData( | |
| 481 1, 20000, buffer3, kSize1, | |
| 482 base::Bind(&CallbackTest::Run, base::Unretained(&callback9)), false); | |
| 483 EXPECT_TRUE(17000 == ret || net::ERR_IO_PENDING == ret); | |
| 484 if (net::ERR_IO_PENDING == ret) | |
| 485 expected++; | |
| 486 | 421 |
| 487 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); | 422 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); |
| 488 EXPECT_EQ(37000, entry->GetDataSize(1)); | 423 EXPECT_EQ(37000, entry->GetDataSize(1)); |
| 489 | 424 |
| 490 EXPECT_FALSE(helper.callback_reused_error()); | 425 EXPECT_FALSE(helper.callback_reused_error()); |
| 491 | 426 |
| 492 entry->Doom(); | 427 entry->Doom(); |
| 493 entry->Close(); | 428 entry->Close(); |
| 494 FlushQueueForTest(); | 429 FlushQueueForTest(); |
| 495 EXPECT_EQ(0, cache_->GetEntryCount()); | 430 EXPECT_EQ(0, cache_->GetEntryCount()); |
| 496 } | 431 } |
| 497 | 432 |
| 498 TEST_F(DiskCacheEntryTest, ExternalAsyncIO) { | 433 TEST_F(DiskCacheEntryTest, ExternalAsyncIO) { |
| 499 InitCache(); | 434 InitCache(); |
| 500 ExternalAsyncIO(); | 435 ExternalAsyncIO(); |
| 501 } | 436 } |
| 502 | 437 |
| 438 TEST_F(DiskCacheEntryTest, V3ExternalAsyncIO) { |
| 439 UseVersion3(); |
| 440 InitCache(); |
| 441 ExternalAsyncIO(); |
| 442 } |
| 443 |
| 503 TEST_F(DiskCacheEntryTest, ExternalAsyncIONoBuffer) { | 444 TEST_F(DiskCacheEntryTest, ExternalAsyncIONoBuffer) { |
| 504 InitCache(); | 445 InitCache(); |
| 505 cache_impl_->SetFlags(disk_cache::kNoBuffering); | 446 cache_impl_->SetFlags(disk_cache::kNoBuffering); |
| 506 ExternalAsyncIO(); | 447 ExternalAsyncIO(); |
| 507 } | 448 } |
| 508 | 449 |
| 450 TEST_F(DiskCacheEntryTest, V3ExternalAsyncIONoBuffer) { |
| 451 UseVersion3(); |
| 452 InitCache(); |
| 453 SetNoBuffering(); |
| 454 ExternalAsyncIO(); |
| 455 } |
| 456 |
| 509 TEST_F(DiskCacheEntryTest, MemoryOnlyExternalAsyncIO) { | 457 TEST_F(DiskCacheEntryTest, MemoryOnlyExternalAsyncIO) { |
| 510 SetMemoryOnlyMode(); | 458 SetMemoryOnlyMode(); |
| 511 InitCache(); | 459 InitCache(); |
| 512 ExternalAsyncIO(); | 460 ExternalAsyncIO(); |
| 513 } | 461 } |
| 514 | 462 |
| 515 // Tests that IOBuffers are not referenced after IO completes. | 463 // Tests that IOBuffers are not referenced after IO completes. |
| 516 void DiskCacheEntryTest::ReleaseBuffer() { | 464 void DiskCacheEntryTest::ReleaseBuffer() { |
| 517 disk_cache::Entry* entry = NULL; | 465 disk_cache::Entry* entry = NULL; |
| 518 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry)); | 466 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry)); |
| 519 ASSERT_TRUE(NULL != entry); | 467 ASSERT_TRUE(NULL != entry); |
| 520 | 468 |
| 521 const int kBufferSize = 1024; | 469 const int kBufferSize = 1024; |
| 522 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kBufferSize)); | 470 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kBufferSize)); |
| 523 CacheTestFillBuffer(buffer->data(), kBufferSize, false); | 471 CacheTestFillBuffer(buffer->data(), kBufferSize, false); |
| 524 | 472 |
| 525 net::ReleaseBufferCompletionCallback cb(buffer); | 473 net::ReleaseBufferCompletionCallback cb(buffer); |
| 526 int rv = entry->WriteData(0, 0, buffer, kBufferSize, cb.callback(), false); | 474 int rv = entry->WriteData(0, 0, buffer.get(), kBufferSize, cb.callback(), |
| 475 false); |
| 527 EXPECT_EQ(kBufferSize, cb.GetResult(rv)); | 476 EXPECT_EQ(kBufferSize, cb.GetResult(rv)); |
| 528 entry->Close(); | 477 entry->Close(); |
| 529 } | 478 } |
| 530 | 479 |
| 531 TEST_F(DiskCacheEntryTest, ReleaseBuffer) { | 480 TEST_F(DiskCacheEntryTest, ReleaseBuffer) { |
| 532 InitCache(); | 481 InitCache(); |
| 533 cache_impl_->SetFlags(disk_cache::kNoBuffering); | 482 SetNoBuffering(); |
| 483 ReleaseBuffer(); |
| 484 } |
| 485 |
| 486 TEST_F(DiskCacheEntryTest, V3ReleaseBuffer) { |
| 487 UseVersion3(); |
| 488 InitCache(); |
| 489 SetNoBuffering(); |
| 534 ReleaseBuffer(); | 490 ReleaseBuffer(); |
| 535 } | 491 } |
| 536 | 492 |
| 537 TEST_F(DiskCacheEntryTest, MemoryOnlyReleaseBuffer) { | 493 TEST_F(DiskCacheEntryTest, MemoryOnlyReleaseBuffer) { |
| 538 SetMemoryOnlyMode(); | 494 SetMemoryOnlyMode(); |
| 539 InitCache(); | 495 InitCache(); |
| 540 ReleaseBuffer(); | 496 ReleaseBuffer(); |
| 541 } | 497 } |
| 542 | 498 |
| 543 void DiskCacheEntryTest::StreamAccess() { | 499 void DiskCacheEntryTest::StreamAccess() { |
| 544 disk_cache::Entry* entry = NULL; | 500 disk_cache::Entry* entry = NULL; |
| 545 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry)); | 501 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry)); |
| 546 ASSERT_TRUE(NULL != entry); | 502 ASSERT_TRUE(NULL != entry); |
| 547 | 503 |
| 548 const int kBufferSize = 1024; | 504 const int kBufferSize = 1024; |
| 549 const int kNumStreams = 3; | 505 const int kNumStreams = 3; |
| 550 scoped_refptr<net::IOBuffer> reference_buffers[kNumStreams]; | 506 scoped_refptr<net::IOBuffer> reference_buffers[kNumStreams]; |
| 551 for (int i = 0; i < kNumStreams; i++) { | 507 for (int i = 0; i < kNumStreams; i++) { |
| 552 reference_buffers[i] = new net::IOBuffer(kBufferSize); | 508 reference_buffers[i] = new net::IOBuffer(kBufferSize); |
| 553 CacheTestFillBuffer(reference_buffers[i]->data(), kBufferSize, false); | 509 CacheTestFillBuffer(reference_buffers[i]->data(), kBufferSize, false); |
| 554 } | 510 } |
| 555 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kBufferSize)); | 511 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kBufferSize)); |
| 556 for (int i = 0; i < kNumStreams; i++) { | 512 for (int i = 0; i < kNumStreams; i++) { |
| 557 EXPECT_EQ(kBufferSize, WriteData(entry, i, 0, reference_buffers[i], | 513 EXPECT_EQ(kBufferSize, WriteData(entry, i, 0, reference_buffers[i].get(), |
| 558 kBufferSize, false)); | 514 kBufferSize, false)); |
| 559 memset(buffer1->data(), 0, kBufferSize); | 515 memset(buffer1->data(), 0, kBufferSize); |
| 560 EXPECT_EQ(kBufferSize, ReadData(entry, i, 0, buffer1, kBufferSize)); | 516 EXPECT_EQ(kBufferSize, ReadData(entry, i, 0, buffer1.get(), kBufferSize)); |
| 561 EXPECT_EQ(0, memcmp(reference_buffers[i]->data(), buffer1->data(), | 517 EXPECT_EQ(0, memcmp(reference_buffers[i]->data(), buffer1->data(), |
| 562 kBufferSize)); | 518 kBufferSize)); |
| 563 } | 519 } |
| 564 EXPECT_EQ(net::ERR_INVALID_ARGUMENT, | 520 EXPECT_EQ(net::ERR_INVALID_ARGUMENT, |
| 565 ReadData(entry, kNumStreams, 0, buffer1, kBufferSize)); | 521 ReadData(entry, kNumStreams, 0, buffer1.get(), kBufferSize)); |
| 566 entry->Close(); | 522 entry->Close(); |
| 567 | 523 |
| 568 // Open the entry and read it in chunks, including a read past the end. | 524 // Open the entry and read it in chunks, including a read past the end. |
| 569 ASSERT_EQ(net::OK, OpenEntry("the first key", &entry)); | 525 ASSERT_EQ(net::OK, OpenEntry("the first key", &entry)); |
| 570 ASSERT_TRUE(NULL != entry); | 526 ASSERT_TRUE(NULL != entry); |
| 571 const int kReadBufferSize = 600; | 527 const int kReadBufferSize = 600; |
| 572 const int kFinalReadSize = kBufferSize - kReadBufferSize; | 528 const int kFinalReadSize = kBufferSize - kReadBufferSize; |
| 573 COMPILE_ASSERT(kFinalReadSize < kReadBufferSize, should_be_exactly_two_reads); | 529 COMPILE_ASSERT(kFinalReadSize < kReadBufferSize, should_be_exactly_two_reads); |
| 574 scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kReadBufferSize)); | 530 scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kReadBufferSize)); |
| 575 for (int i = 0; i < kNumStreams; i++) { | 531 for (int i = 0; i < kNumStreams; i++) { |
| 576 memset(buffer2->data(), 0, kReadBufferSize); | 532 memset(buffer2->data(), 0, kReadBufferSize); |
| 577 EXPECT_EQ(kReadBufferSize, ReadData(entry, i, 0, buffer2, kReadBufferSize)); | 533 EXPECT_EQ(kReadBufferSize, |
| 534 ReadData(entry, i, 0, buffer2.get(), kReadBufferSize)); |
| 578 EXPECT_EQ(0, memcmp(reference_buffers[i]->data(), buffer2->data(), | 535 EXPECT_EQ(0, memcmp(reference_buffers[i]->data(), buffer2->data(), |
| 579 kReadBufferSize)); | 536 kReadBufferSize)); |
| 580 | 537 |
| 581 memset(buffer2->data(), 0, kReadBufferSize); | 538 memset(buffer2->data(), 0, kReadBufferSize); |
| 582 EXPECT_EQ(kFinalReadSize, ReadData(entry, i, kReadBufferSize, | 539 EXPECT_EQ(kFinalReadSize, ReadData(entry, i, kReadBufferSize, |
| 583 buffer2, kReadBufferSize)); | 540 buffer2.get(), kReadBufferSize)); |
| 584 EXPECT_EQ(0, memcmp(reference_buffers[i]->data() + kReadBufferSize, | 541 EXPECT_EQ(0, memcmp(reference_buffers[i]->data() + kReadBufferSize, |
| 585 buffer2->data(), kFinalReadSize)); | 542 buffer2->data(), kFinalReadSize)); |
| 586 } | 543 } |
| 587 | 544 |
| 588 entry->Close(); | 545 entry->Close(); |
| 589 } | 546 } |
| 590 | 547 |
| 591 TEST_F(DiskCacheEntryTest, StreamAccess) { | 548 TEST_F(DiskCacheEntryTest, StreamAccess) { |
| 592 InitCache(); | 549 InitCache(); |
| 593 StreamAccess(); | 550 StreamAccess(); |
| 594 } | 551 } |
| 595 | 552 |
| 553 TEST_F(DiskCacheEntryTest, V3StreamAccess) { |
| 554 UseVersion3(); |
| 555 InitCache(); |
| 556 StreamAccess(); |
| 557 } |
| 558 |
| 596 TEST_F(DiskCacheEntryTest, MemoryOnlyStreamAccess) { | 559 TEST_F(DiskCacheEntryTest, MemoryOnlyStreamAccess) { |
| 597 SetMemoryOnlyMode(); | 560 SetMemoryOnlyMode(); |
| 598 InitCache(); | 561 InitCache(); |
| 599 StreamAccess(); | 562 StreamAccess(); |
| 600 } | 563 } |
| 601 | 564 |
| 602 void DiskCacheEntryTest::GetKey() { | 565 void DiskCacheEntryTest::GetKey() { |
| 603 std::string key("the first key"); | 566 std::string key("the first key"); |
| 604 disk_cache::Entry* entry; | 567 disk_cache::Entry* entry; |
| 605 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 568 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 606 EXPECT_EQ(key, entry->GetKey()) << "short key"; | 569 EXPECT_EQ(key, entry->GetKey()) << "short key"; |
| 607 entry->Close(); | 570 entry->Close(); |
| 571 WaitForEntryToClose(key); |
| 608 | 572 |
| 609 int seed = static_cast<int>(Time::Now().ToInternalValue()); | 573 int seed = static_cast<int>(Time::Now().ToInternalValue()); |
| 610 srand(seed); | 574 srand(seed); |
| 611 char key_buffer[20000]; | 575 char key_buffer[20000]; |
| 612 | 576 |
| 613 CacheTestFillBuffer(key_buffer, 3000, true); | 577 CacheTestFillBuffer(key_buffer, 3000, true); |
| 614 key_buffer[1000] = '\0'; | 578 key_buffer[1000] = '\0'; |
| 615 | 579 |
| 616 key = key_buffer; | 580 key = key_buffer; |
| 617 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 581 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 618 EXPECT_TRUE(key == entry->GetKey()) << "1000 bytes key"; | 582 EXPECT_TRUE(key == entry->GetKey()) << "1000 bytes key"; |
| 619 entry->Close(); | 583 entry->Close(); |
| 584 WaitForEntryToClose(key); |
| 620 | 585 |
| 621 key_buffer[1000] = 'p'; | 586 key_buffer[1000] = 'p'; |
| 622 key_buffer[3000] = '\0'; | 587 key_buffer[3000] = '\0'; |
| 623 key = key_buffer; | 588 key = key_buffer; |
| 624 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 589 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 625 EXPECT_TRUE(key == entry->GetKey()) << "medium size key"; | 590 EXPECT_TRUE(key == entry->GetKey()) << "medium size key"; |
| 626 entry->Close(); | 591 entry->Close(); |
| 592 WaitForEntryToClose(key); |
| 627 | 593 |
| 628 CacheTestFillBuffer(key_buffer, sizeof(key_buffer), true); | 594 CacheTestFillBuffer(key_buffer, sizeof(key_buffer), true); |
| 629 key_buffer[19999] = '\0'; | 595 key_buffer[19999] = '\0'; |
| 630 | 596 |
| 631 key = key_buffer; | 597 key = key_buffer; |
| 632 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 598 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 633 EXPECT_TRUE(key == entry->GetKey()) << "long key"; | 599 EXPECT_TRUE(key == entry->GetKey()) << "long key"; |
| 634 entry->Close(); | 600 entry->Close(); |
| 601 WaitForEntryToClose(key); |
| 635 | 602 |
| 636 CacheTestFillBuffer(key_buffer, 0x4000, true); | 603 CacheTestFillBuffer(key_buffer, 0x4000, true); |
| 637 key_buffer[0x4000] = '\0'; | 604 key_buffer[0x4000] = '\0'; |
| 638 | 605 |
| 639 key = key_buffer; | 606 key = key_buffer; |
| 640 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 607 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 641 EXPECT_TRUE(key == entry->GetKey()) << "16KB key"; | 608 EXPECT_TRUE(key == entry->GetKey()) << "16KB key"; |
| 642 entry->Close(); | 609 entry->Close(); |
| 643 } | 610 } |
| 644 | 611 |
| 645 TEST_F(DiskCacheEntryTest, GetKey) { | 612 TEST_F(DiskCacheEntryTest, GetKey) { |
| 646 InitCache(); | 613 InitCache(); |
| 647 GetKey(); | 614 GetKey(); |
| 648 } | 615 } |
| 649 | 616 |
| 617 TEST_F(DiskCacheEntryTest, V3GetKey) { |
| 618 UseVersion3(); |
| 619 InitCache(); |
| 620 GetKey(); |
| 621 } |
| 622 |
| 650 TEST_F(DiskCacheEntryTest, MemoryOnlyGetKey) { | 623 TEST_F(DiskCacheEntryTest, MemoryOnlyGetKey) { |
| 651 SetMemoryOnlyMode(); | 624 SetMemoryOnlyMode(); |
| 652 InitCache(); | 625 InitCache(); |
| 653 GetKey(); | 626 GetKey(); |
| 654 } | 627 } |
| 655 | 628 |
| 656 void DiskCacheEntryTest::GetTimes() { | 629 void DiskCacheEntryTest::GetTimes() { |
| 657 std::string key("the first key"); | 630 std::string key("the first key"); |
| 658 disk_cache::Entry* entry; | 631 disk_cache::Entry* entry; |
| 659 | 632 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 671 } else { | 644 } else { |
| 672 EXPECT_TRUE(entry->GetLastModified() >= t2); | 645 EXPECT_TRUE(entry->GetLastModified() >= t2); |
| 673 } | 646 } |
| 674 EXPECT_TRUE(entry->GetLastModified() == entry->GetLastUsed()); | 647 EXPECT_TRUE(entry->GetLastModified() == entry->GetLastUsed()); |
| 675 | 648 |
| 676 AddDelay(); | 649 AddDelay(); |
| 677 Time t3 = Time::Now(); | 650 Time t3 = Time::Now(); |
| 678 EXPECT_TRUE(t3 > t2); | 651 EXPECT_TRUE(t3 > t2); |
| 679 const int kSize = 200; | 652 const int kSize = 200; |
| 680 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); | 653 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); |
| 681 EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer, kSize)); | 654 EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer.get(), kSize)); |
| 682 if (type_ == net::APP_CACHE) { | 655 if (type_ == net::APP_CACHE) { |
| 683 EXPECT_TRUE(entry->GetLastUsed() < t2); | 656 EXPECT_TRUE(entry->GetLastUsed() < t2); |
| 684 EXPECT_TRUE(entry->GetLastModified() < t2); | 657 EXPECT_TRUE(entry->GetLastModified() < t2); |
| 685 } else if (type_ == net::SHADER_CACHE) { | 658 } else if (type_ == net::SHADER_CACHE) { |
| 686 EXPECT_TRUE(entry->GetLastUsed() < t3); | 659 EXPECT_TRUE(entry->GetLastUsed() < t3); |
| 687 EXPECT_TRUE(entry->GetLastModified() < t3); | 660 EXPECT_TRUE(entry->GetLastModified() < t3); |
| 688 } else { | 661 } else { |
| 689 EXPECT_TRUE(entry->GetLastUsed() >= t3); | 662 EXPECT_TRUE(entry->GetLastUsed() >= t3); |
| 690 EXPECT_TRUE(entry->GetLastModified() < t3); | 663 EXPECT_TRUE(entry->GetLastModified() < t3); |
| 691 } | 664 } |
| 692 entry->Close(); | 665 entry->Close(); |
| 693 } | 666 } |
| 694 | 667 |
| 695 TEST_F(DiskCacheEntryTest, GetTimes) { | 668 TEST_F(DiskCacheEntryTest, GetTimes) { |
| 696 InitCache(); | 669 InitCache(); |
| 697 GetTimes(); | 670 GetTimes(); |
| 698 } | 671 } |
| 699 | 672 |
| 673 TEST_F(DiskCacheEntryTest, V3GetTimes) { |
| 674 UseVersion3(); |
| 675 InitCache(); |
| 676 GetTimes(); |
| 677 } |
| 678 |
| 700 TEST_F(DiskCacheEntryTest, MemoryOnlyGetTimes) { | 679 TEST_F(DiskCacheEntryTest, MemoryOnlyGetTimes) { |
| 701 SetMemoryOnlyMode(); | 680 SetMemoryOnlyMode(); |
| 702 InitCache(); | 681 InitCache(); |
| 703 GetTimes(); | 682 GetTimes(); |
| 704 } | 683 } |
| 705 | 684 |
| 706 TEST_F(DiskCacheEntryTest, AppCacheGetTimes) { | 685 TEST_F(DiskCacheEntryTest, AppCacheGetTimes) { |
| 707 SetCacheType(net::APP_CACHE); | 686 SetCacheType(net::APP_CACHE); |
| 708 InitCache(); | 687 InitCache(); |
| 709 GetTimes(); | 688 GetTimes(); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 720 disk_cache::Entry* entry; | 699 disk_cache::Entry* entry; |
| 721 ASSERT_EQ(net::OK, CreateEntry(key1, &entry)); | 700 ASSERT_EQ(net::OK, CreateEntry(key1, &entry)); |
| 722 | 701 |
| 723 const int kSize = 20000; | 702 const int kSize = 20000; |
| 724 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize)); | 703 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize)); |
| 725 scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize)); | 704 scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize)); |
| 726 CacheTestFillBuffer(buffer1->data(), kSize, false); | 705 CacheTestFillBuffer(buffer1->data(), kSize, false); |
| 727 memset(buffer2->data(), 0, kSize); | 706 memset(buffer2->data(), 0, kSize); |
| 728 | 707 |
| 729 base::strlcpy(buffer1->data(), "the data", kSize); | 708 base::strlcpy(buffer1->data(), "the data", kSize); |
| 730 EXPECT_EQ(10, WriteData(entry, 0, 0, buffer1, 10, false)); | 709 EXPECT_EQ(10, WriteData(entry, 0, 0, buffer1.get(), 10, false)); |
| 731 EXPECT_EQ(10, ReadData(entry, 0, 0, buffer2, 10)); | 710 EXPECT_EQ(10, ReadData(entry, 0, 0, buffer2.get(), 10)); |
| 732 EXPECT_STREQ("the data", buffer2->data()); | 711 EXPECT_STREQ("the data", buffer2->data()); |
| 733 EXPECT_EQ(10, entry->GetDataSize(0)); | 712 EXPECT_EQ(10, entry->GetDataSize(0)); |
| 734 | 713 |
| 735 EXPECT_EQ(2000, WriteData(entry, 0, 0, buffer1, 2000, false)); | 714 EXPECT_EQ(2000, WriteData(entry, 0, 0, buffer1.get(), 2000, false)); |
| 736 EXPECT_EQ(2000, entry->GetDataSize(0)); | 715 EXPECT_EQ(2000, entry->GetDataSize(0)); |
| 737 EXPECT_EQ(2000, ReadData(entry, 0, 0, buffer2, 2000)); | 716 EXPECT_EQ(2000, ReadData(entry, 0, 0, buffer2.get(), 2000)); |
| 738 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 2000)); | 717 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 2000)); |
| 739 | 718 |
| 740 EXPECT_EQ(20000, WriteData(entry, 0, 0, buffer1, kSize, false)); | 719 EXPECT_EQ(20000, WriteData(entry, 0, 0, buffer1.get(), kSize, false)); |
| 741 EXPECT_EQ(20000, entry->GetDataSize(0)); | 720 EXPECT_EQ(20000, entry->GetDataSize(0)); |
| 742 EXPECT_EQ(20000, ReadData(entry, 0, 0, buffer2, kSize)); | 721 EXPECT_EQ(20000, ReadData(entry, 0, 0, buffer2.get(), kSize)); |
| 743 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), kSize)); | 722 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), kSize)); |
| 744 entry->Close(); | 723 entry->Close(); |
| 745 | 724 |
| 746 memset(buffer2->data(), 0, kSize); | 725 memset(buffer2->data(), 0, kSize); |
| 747 std::string key2("Second key"); | 726 std::string key2("Second key"); |
| 748 ASSERT_EQ(net::OK, CreateEntry(key2, &entry)); | 727 ASSERT_EQ(net::OK, CreateEntry(key2, &entry)); |
| 749 EXPECT_EQ(10, WriteData(entry, 0, 0, buffer1, 10, false)); | 728 EXPECT_EQ(10, WriteData(entry, 0, 0, buffer1.get(), 10, false)); |
| 750 EXPECT_EQ(10, entry->GetDataSize(0)); | 729 EXPECT_EQ(10, entry->GetDataSize(0)); |
| 751 entry->Close(); | 730 entry->Close(); |
| 731 WaitForEntryToClose(key2); |
| 752 | 732 |
| 753 // Go from an internal address to a bigger block size. | 733 // Go from an internal address to a bigger block size. |
| 754 ASSERT_EQ(net::OK, OpenEntry(key2, &entry)); | 734 ASSERT_EQ(net::OK, OpenEntry(key2, &entry)); |
| 755 EXPECT_EQ(2000, WriteData(entry, 0, 0, buffer1, 2000, false)); | 735 EXPECT_EQ(2000, WriteData(entry, 0, 0, buffer1.get(), 2000, false)); |
| 756 EXPECT_EQ(2000, entry->GetDataSize(0)); | 736 EXPECT_EQ(2000, entry->GetDataSize(0)); |
| 757 EXPECT_EQ(2000, ReadData(entry, 0, 0, buffer2, 2000)); | 737 EXPECT_EQ(2000, ReadData(entry, 0, 0, buffer2.get(), 2000)); |
| 758 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 2000)); | 738 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 2000)); |
| 759 entry->Close(); | 739 entry->Close(); |
| 740 WaitForEntryToClose(key2); |
| 760 memset(buffer2->data(), 0, kSize); | 741 memset(buffer2->data(), 0, kSize); |
| 761 | 742 |
| 762 // Go from an internal address to an external one. | 743 // Go from an internal address to an external one. |
| 763 ASSERT_EQ(net::OK, OpenEntry(key2, &entry)); | 744 ASSERT_EQ(net::OK, OpenEntry(key2, &entry)); |
| 764 EXPECT_EQ(20000, WriteData(entry, 0, 0, buffer1, kSize, false)); | 745 EXPECT_EQ(20000, WriteData(entry, 0, 0, buffer1.get(), kSize, false)); |
| 765 EXPECT_EQ(20000, entry->GetDataSize(0)); | 746 EXPECT_EQ(20000, entry->GetDataSize(0)); |
| 766 EXPECT_EQ(20000, ReadData(entry, 0, 0, buffer2, kSize)); | 747 EXPECT_EQ(20000, ReadData(entry, 0, 0, buffer2.get(), kSize)); |
| 767 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), kSize)); | 748 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), kSize)); |
| 768 entry->Close(); | 749 entry->Close(); |
| 750 WaitForEntryToClose(key2); |
| 769 | 751 |
| 770 // Double check the size from disk. | 752 // Double check the size from disk. |
| 771 ASSERT_EQ(net::OK, OpenEntry(key2, &entry)); | 753 ASSERT_EQ(net::OK, OpenEntry(key2, &entry)); |
| 772 EXPECT_EQ(20000, entry->GetDataSize(0)); | 754 EXPECT_EQ(20000, entry->GetDataSize(0)); |
| 773 | 755 |
| 774 // Now extend the entry without actual data. | 756 // Now extend the entry without actual data. |
| 775 EXPECT_EQ(0, WriteData(entry, 0, 45500, buffer1, 0, false)); | 757 EXPECT_EQ(0, WriteData(entry, 0, 45500, buffer1.get(), 0, false)); |
| 776 entry->Close(); | 758 entry->Close(); |
| 759 WaitForEntryToClose(key2); |
| 777 | 760 |
| 778 // And check again from disk. | 761 // And check again from disk. |
| 779 ASSERT_EQ(net::OK, OpenEntry(key2, &entry)); | 762 ASSERT_EQ(net::OK, OpenEntry(key2, &entry)); |
| 780 EXPECT_EQ(45500, entry->GetDataSize(0)); | 763 EXPECT_EQ(45500, entry->GetDataSize(0)); |
| 781 entry->Close(); | 764 entry->Close(); |
| 782 } | 765 } |
| 783 | 766 |
| 784 TEST_F(DiskCacheEntryTest, GrowData) { | 767 TEST_F(DiskCacheEntryTest, GrowData) { |
| 785 InitCache(); | 768 InitCache(); |
| 786 GrowData(); | 769 GrowData(); |
| 787 } | 770 } |
| 788 | 771 |
| 772 TEST_F(DiskCacheEntryTest, V3GrowData) { |
| 773 UseVersion3(); |
| 774 InitCache(); |
| 775 GrowData(); |
| 776 } |
| 777 |
| 789 TEST_F(DiskCacheEntryTest, GrowDataNoBuffer) { | 778 TEST_F(DiskCacheEntryTest, GrowDataNoBuffer) { |
| 790 InitCache(); | 779 InitCache(); |
| 791 cache_impl_->SetFlags(disk_cache::kNoBuffering); | 780 cache_impl_->SetFlags(disk_cache::kNoBuffering); |
| 792 GrowData(); | 781 GrowData(); |
| 793 } | 782 } |
| 794 | 783 |
| 795 TEST_F(DiskCacheEntryTest, MemoryOnlyGrowData) { | 784 TEST_F(DiskCacheEntryTest, MemoryOnlyGrowData) { |
| 796 SetMemoryOnlyMode(); | 785 SetMemoryOnlyMode(); |
| 797 InitCache(); | 786 InitCache(); |
| 798 GrowData(); | 787 GrowData(); |
| 799 } | 788 } |
| 800 | 789 |
| 801 void DiskCacheEntryTest::TruncateData() { | 790 void DiskCacheEntryTest::TruncateData() { |
| 802 std::string key("the first key"); | 791 std::string key("the first key"); |
| 803 disk_cache::Entry* entry; | 792 disk_cache::Entry* entry; |
| 804 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 793 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 805 | 794 |
| 806 const int kSize1 = 20000; | 795 const int kSize1 = 20000; |
| 807 const int kSize2 = 20000; | 796 const int kSize2 = 20000; |
| 808 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize1)); | 797 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize1)); |
| 809 scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize2)); | 798 scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize2)); |
| 810 | 799 |
| 811 CacheTestFillBuffer(buffer1->data(), kSize1, false); | 800 CacheTestFillBuffer(buffer1->data(), kSize1, false); |
| 812 memset(buffer2->data(), 0, kSize2); | 801 memset(buffer2->data(), 0, kSize2); |
| 813 | 802 |
| 814 // Simple truncation: | 803 // Simple truncation: |
| 815 EXPECT_EQ(200, WriteData(entry, 0, 0, buffer1, 200, false)); | 804 EXPECT_EQ(200, WriteData(entry, 0, 0, buffer1.get(), 200, false)); |
| 816 EXPECT_EQ(200, entry->GetDataSize(0)); | 805 EXPECT_EQ(200, entry->GetDataSize(0)); |
| 817 EXPECT_EQ(100, WriteData(entry, 0, 0, buffer1, 100, false)); | 806 EXPECT_EQ(100, WriteData(entry, 0, 0, buffer1.get(), 100, false)); |
| 818 EXPECT_EQ(200, entry->GetDataSize(0)); | 807 EXPECT_EQ(200, entry->GetDataSize(0)); |
| 819 EXPECT_EQ(100, WriteData(entry, 0, 0, buffer1, 100, true)); | 808 EXPECT_EQ(100, WriteData(entry, 0, 0, buffer1.get(), 100, true)); |
| 820 EXPECT_EQ(100, entry->GetDataSize(0)); | 809 EXPECT_EQ(100, entry->GetDataSize(0)); |
| 821 EXPECT_EQ(0, WriteData(entry, 0, 50, buffer1, 0, true)); | 810 EXPECT_EQ(0, WriteData(entry, 0, 50, buffer1.get(), 0, true)); |
| 822 EXPECT_EQ(50, entry->GetDataSize(0)); | 811 EXPECT_EQ(50, entry->GetDataSize(0)); |
| 823 EXPECT_EQ(0, WriteData(entry, 0, 0, buffer1, 0, true)); | 812 EXPECT_EQ(0, WriteData(entry, 0, 0, buffer1.get(), 0, true)); |
| 824 EXPECT_EQ(0, entry->GetDataSize(0)); | 813 EXPECT_EQ(0, entry->GetDataSize(0)); |
| 825 entry->Close(); | 814 entry->Close(); |
| 815 WaitForEntryToClose(key); |
| 826 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); | 816 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 827 | 817 |
| 828 // Go to an external file. | 818 // Go to an external file. |
| 829 EXPECT_EQ(20000, WriteData(entry, 0, 0, buffer1, 20000, true)); | 819 EXPECT_EQ(20000, WriteData(entry, 0, 0, buffer1.get(), 20000, true)); |
| 830 EXPECT_EQ(20000, entry->GetDataSize(0)); | 820 EXPECT_EQ(20000, entry->GetDataSize(0)); |
| 831 EXPECT_EQ(20000, ReadData(entry, 0, 0, buffer2, 20000)); | 821 EXPECT_EQ(20000, ReadData(entry, 0, 0, buffer2.get(), 20000)); |
| 832 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 20000)); | 822 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 20000)); |
| 833 memset(buffer2->data(), 0, kSize2); | 823 memset(buffer2->data(), 0, kSize2); |
| 834 | 824 |
| 835 // External file truncation | 825 // External file truncation |
| 836 EXPECT_EQ(18000, WriteData(entry, 0, 0, buffer1, 18000, false)); | 826 EXPECT_EQ(18000, WriteData(entry, 0, 0, buffer1.get(), 18000, false)); |
| 837 EXPECT_EQ(20000, entry->GetDataSize(0)); | 827 EXPECT_EQ(20000, entry->GetDataSize(0)); |
| 838 EXPECT_EQ(18000, WriteData(entry, 0, 0, buffer1, 18000, true)); | 828 EXPECT_EQ(18000, WriteData(entry, 0, 0, buffer1.get(), 18000, true)); |
| 839 EXPECT_EQ(18000, entry->GetDataSize(0)); | 829 EXPECT_EQ(18000, entry->GetDataSize(0)); |
| 840 EXPECT_EQ(0, WriteData(entry, 0, 17500, buffer1, 0, true)); | 830 EXPECT_EQ(0, WriteData(entry, 0, 17500, buffer1.get(), 0, true)); |
| 841 EXPECT_EQ(17500, entry->GetDataSize(0)); | 831 EXPECT_EQ(17500, entry->GetDataSize(0)); |
| 842 | 832 |
| 843 // And back to an internal block. | 833 // And back to an internal block. |
| 844 EXPECT_EQ(600, WriteData(entry, 0, 1000, buffer1, 600, true)); | 834 EXPECT_EQ(600, WriteData(entry, 0, 1000, buffer1.get(), 600, true)); |
| 845 EXPECT_EQ(1600, entry->GetDataSize(0)); | 835 EXPECT_EQ(1600, entry->GetDataSize(0)); |
| 846 EXPECT_EQ(600, ReadData(entry, 0, 1000, buffer2, 600)); | 836 EXPECT_EQ(600, ReadData(entry, 0, 1000, buffer2.get(), 600)); |
| 847 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 600)); | 837 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 600)); |
| 848 EXPECT_EQ(1000, ReadData(entry, 0, 0, buffer2, 1000)); | 838 EXPECT_EQ(1000, ReadData(entry, 0, 0, buffer2.get(), 1000)); |
| 849 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 1000)) << | 839 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 1000)) << |
| 850 "Preserves previous data"; | 840 "Preserves previous data"; |
| 851 | 841 |
| 852 // Go from external file to zero length. | 842 // Go from external file to zero length. |
| 853 EXPECT_EQ(20000, WriteData(entry, 0, 0, buffer1, 20000, true)); | 843 EXPECT_EQ(20000, WriteData(entry, 0, 0, buffer1.get(), 20000, true)); |
| 854 EXPECT_EQ(20000, entry->GetDataSize(0)); | 844 EXPECT_EQ(20000, entry->GetDataSize(0)); |
| 855 EXPECT_EQ(0, WriteData(entry, 0, 0, buffer1, 0, true)); | 845 EXPECT_EQ(0, WriteData(entry, 0, 0, buffer1.get(), 0, true)); |
| 856 EXPECT_EQ(0, entry->GetDataSize(0)); | 846 EXPECT_EQ(0, entry->GetDataSize(0)); |
| 857 | 847 |
| 858 entry->Close(); | 848 entry->Close(); |
| 859 } | 849 } |
| 860 | 850 |
| 861 TEST_F(DiskCacheEntryTest, TruncateData) { | 851 TEST_F(DiskCacheEntryTest, TruncateData) { |
| 862 InitCache(); | 852 InitCache(); |
| 863 TruncateData(); | 853 TruncateData(); |
| 864 } | 854 } |
| 865 | 855 |
| 856 TEST_F(DiskCacheEntryTest, V3TruncateData) { |
| 857 UseVersion3(); |
| 858 InitCache(); |
| 859 TruncateData(); |
| 860 } |
| 861 |
| 866 TEST_F(DiskCacheEntryTest, TruncateDataNoBuffer) { | 862 TEST_F(DiskCacheEntryTest, TruncateDataNoBuffer) { |
| 867 InitCache(); | 863 InitCache(); |
| 868 cache_impl_->SetFlags(disk_cache::kNoBuffering); | 864 SetNoBuffering(); |
| 865 TruncateData(); |
| 866 } |
| 867 |
| 868 TEST_F(DiskCacheEntryTest, V3TruncateDataNoBuffer) { |
| 869 UseVersion3(); |
| 870 InitCache(); |
| 871 SetNoBuffering(); |
| 869 TruncateData(); | 872 TruncateData(); |
| 870 } | 873 } |
| 871 | 874 |
| 872 TEST_F(DiskCacheEntryTest, MemoryOnlyTruncateData) { | 875 TEST_F(DiskCacheEntryTest, MemoryOnlyTruncateData) { |
| 873 SetMemoryOnlyMode(); | 876 SetMemoryOnlyMode(); |
| 874 InitCache(); | 877 InitCache(); |
| 875 TruncateData(); | 878 TruncateData(); |
| 876 } | 879 } |
| 877 | 880 |
| 878 void DiskCacheEntryTest::ZeroLengthIO() { | 881 void DiskCacheEntryTest::ZeroLengthIO() { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 892 EXPECT_EQ(0, WriteData(entry, 0, 100000, NULL, 0, true)); | 895 EXPECT_EQ(0, WriteData(entry, 0, 100000, NULL, 0, true)); |
| 893 EXPECT_EQ(0, ReadData(entry, 0, 50000, NULL, 0)); | 896 EXPECT_EQ(0, ReadData(entry, 0, 50000, NULL, 0)); |
| 894 EXPECT_EQ(100000, entry->GetDataSize(0)); | 897 EXPECT_EQ(100000, entry->GetDataSize(0)); |
| 895 | 898 |
| 896 // Let's verify the actual content. | 899 // Let's verify the actual content. |
| 897 const int kSize = 20; | 900 const int kSize = 20; |
| 898 const char zeros[kSize] = {}; | 901 const char zeros[kSize] = {}; |
| 899 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); | 902 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); |
| 900 | 903 |
| 901 CacheTestFillBuffer(buffer->data(), kSize, false); | 904 CacheTestFillBuffer(buffer->data(), kSize, false); |
| 902 EXPECT_EQ(kSize, ReadData(entry, 0, 500, buffer, kSize)); | 905 EXPECT_EQ(kSize, ReadData(entry, 0, 500, buffer.get(), kSize)); |
| 903 EXPECT_TRUE(!memcmp(buffer->data(), zeros, kSize)); | 906 EXPECT_TRUE(!memcmp(buffer->data(), zeros, kSize)); |
| 904 | 907 |
| 905 CacheTestFillBuffer(buffer->data(), kSize, false); | 908 CacheTestFillBuffer(buffer->data(), kSize, false); |
| 906 EXPECT_EQ(kSize, ReadData(entry, 0, 5000, buffer, kSize)); | 909 EXPECT_EQ(kSize, ReadData(entry, 0, 5000, buffer.get(), kSize)); |
| 907 EXPECT_TRUE(!memcmp(buffer->data(), zeros, kSize)); | 910 EXPECT_TRUE(!memcmp(buffer->data(), zeros, kSize)); |
| 908 | 911 |
| 909 CacheTestFillBuffer(buffer->data(), kSize, false); | 912 CacheTestFillBuffer(buffer->data(), kSize, false); |
| 910 EXPECT_EQ(kSize, ReadData(entry, 0, 50000, buffer, kSize)); | 913 EXPECT_EQ(kSize, ReadData(entry, 0, 50000, buffer.get(), kSize)); |
| 911 EXPECT_TRUE(!memcmp(buffer->data(), zeros, kSize)); | 914 EXPECT_TRUE(!memcmp(buffer->data(), zeros, kSize)); |
| 912 | 915 |
| 913 entry->Close(); | 916 entry->Close(); |
| 914 } | 917 } |
| 915 | 918 |
| 916 TEST_F(DiskCacheEntryTest, ZeroLengthIO) { | 919 TEST_F(DiskCacheEntryTest, ZeroLengthIO) { |
| 917 InitCache(); | 920 InitCache(); |
| 918 ZeroLengthIO(); | 921 ZeroLengthIO(); |
| 919 } | 922 } |
| 920 | 923 |
| 924 TEST_F(DiskCacheEntryTest, V3ZeroLengthIO) { |
| 925 UseVersion3(); |
| 926 InitCache(); |
| 927 ZeroLengthIO(); |
| 928 } |
| 929 |
| 921 TEST_F(DiskCacheEntryTest, ZeroLengthIONoBuffer) { | 930 TEST_F(DiskCacheEntryTest, ZeroLengthIONoBuffer) { |
| 922 InitCache(); | 931 InitCache(); |
| 923 cache_impl_->SetFlags(disk_cache::kNoBuffering); | 932 SetNoBuffering(); |
| 933 ZeroLengthIO(); |
| 934 } |
| 935 |
| 936 TEST_F(DiskCacheEntryTest, V3ZeroLengthIONoBuffer) { |
| 937 UseVersion3(); |
| 938 InitCache(); |
| 939 SetNoBuffering(); |
| 924 ZeroLengthIO(); | 940 ZeroLengthIO(); |
| 925 } | 941 } |
| 926 | 942 |
| 927 TEST_F(DiskCacheEntryTest, MemoryOnlyZeroLengthIO) { | 943 TEST_F(DiskCacheEntryTest, MemoryOnlyZeroLengthIO) { |
| 928 SetMemoryOnlyMode(); | 944 SetMemoryOnlyMode(); |
| 929 InitCache(); | 945 InitCache(); |
| 930 ZeroLengthIO(); | 946 ZeroLengthIO(); |
| 931 } | 947 } |
| 932 | 948 |
| 933 // Tests that we handle the content correctly when buffering, a feature of the | 949 // Tests that we handle the content correctly when buffering, a feature of the |
| 934 // standard cache that permits fast responses to certain reads. | 950 // standard cache that permits fast responses to certain reads. |
| 935 void DiskCacheEntryTest::Buffering() { | 951 void DiskCacheEntryTest::Buffering() { |
| 936 std::string key("the first key"); | 952 std::string key("the first key"); |
| 937 disk_cache::Entry* entry; | 953 disk_cache::Entry* entry; |
| 938 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 954 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 939 | 955 |
| 940 const int kSize = 200; | 956 const int kSize = 200; |
| 941 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize)); | 957 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize)); |
| 942 scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize)); | 958 scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize)); |
| 943 CacheTestFillBuffer(buffer1->data(), kSize, true); | 959 CacheTestFillBuffer(buffer1->data(), kSize, true); |
| 944 CacheTestFillBuffer(buffer2->data(), kSize, true); | 960 CacheTestFillBuffer(buffer2->data(), kSize, true); |
| 945 | 961 |
| 946 EXPECT_EQ(kSize, WriteData(entry, 1, 0, buffer1, kSize, false)); | 962 EXPECT_EQ(kSize, WriteData(entry, 1, 0, buffer1.get(), kSize, false)); |
| 947 entry->Close(); | 963 entry->Close(); |
| 964 WaitForEntryToClose(key); |
| 948 | 965 |
| 949 // Write a little more and read what we wrote before. | 966 // Write a little more and read what we wrote before. |
| 950 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); | 967 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 951 EXPECT_EQ(kSize, WriteData(entry, 1, 5000, buffer1, kSize, false)); | 968 EXPECT_EQ(kSize, WriteData(entry, 1, 5000, buffer1.get(), kSize, false)); |
| 952 EXPECT_EQ(kSize, ReadData(entry, 1, 0, buffer2, kSize)); | 969 EXPECT_EQ(kSize, ReadData(entry, 1, 0, buffer2.get(), kSize)); |
| 953 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize)); | 970 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize)); |
| 954 | 971 |
| 955 // Now go to an external file. | 972 // Now go to an external file. |
| 956 EXPECT_EQ(kSize, WriteData(entry, 1, 18000, buffer1, kSize, false)); | 973 EXPECT_EQ(kSize, WriteData(entry, 1, 18000, buffer1.get(), kSize, false)); |
| 957 entry->Close(); | 974 entry->Close(); |
| 975 WaitForEntryToClose(key); |
| 958 | 976 |
| 959 // Write something else and verify old data. | 977 // Write something else and verify old data. |
| 960 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); | 978 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 961 EXPECT_EQ(kSize, WriteData(entry, 1, 10000, buffer1, kSize, false)); | 979 EXPECT_EQ(kSize, WriteData(entry, 1, 10000, buffer1.get(), kSize, false)); |
| 962 CacheTestFillBuffer(buffer2->data(), kSize, true); | 980 CacheTestFillBuffer(buffer2->data(), kSize, true); |
| 963 EXPECT_EQ(kSize, ReadData(entry, 1, 5000, buffer2, kSize)); | 981 EXPECT_EQ(kSize, ReadData(entry, 1, 5000, buffer2.get(), kSize)); |
| 964 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize)); | 982 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize)); |
| 965 CacheTestFillBuffer(buffer2->data(), kSize, true); | 983 CacheTestFillBuffer(buffer2->data(), kSize, true); |
| 966 EXPECT_EQ(kSize, ReadData(entry, 1, 0, buffer2, kSize)); | 984 EXPECT_EQ(kSize, ReadData(entry, 1, 0, buffer2.get(), kSize)); |
| 967 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize)); | 985 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize)); |
| 968 CacheTestFillBuffer(buffer2->data(), kSize, true); | 986 CacheTestFillBuffer(buffer2->data(), kSize, true); |
| 969 EXPECT_EQ(kSize, ReadData(entry, 1, 18000, buffer2, kSize)); | 987 EXPECT_EQ(kSize, ReadData(entry, 1, 18000, buffer2.get(), kSize)); |
| 970 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize)); | 988 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize)); |
| 971 | 989 |
| 972 // Extend the file some more. | 990 // Extend the file some more. |
| 973 EXPECT_EQ(kSize, WriteData(entry, 1, 23000, buffer1, kSize, false)); | 991 EXPECT_EQ(kSize, WriteData(entry, 1, 23000, buffer1.get(), kSize, false)); |
| 974 entry->Close(); | 992 entry->Close(); |
| 993 WaitForEntryToClose(key); |
| 975 | 994 |
| 976 // And now make sure that we can deal with data in both places (ram/disk). | 995 // And now make sure that we can deal with data in both places (ram/disk). |
| 977 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); | 996 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 978 EXPECT_EQ(kSize, WriteData(entry, 1, 17000, buffer1, kSize, false)); | 997 EXPECT_EQ(kSize, WriteData(entry, 1, 17000, buffer1.get(), kSize, false)); |
| 979 | 998 |
| 980 // We should not overwrite the data at 18000 with this. | 999 // We should not overwrite the data at 18000 with this. |
| 981 EXPECT_EQ(kSize, WriteData(entry, 1, 19000, buffer1, kSize, false)); | 1000 EXPECT_EQ(kSize, WriteData(entry, 1, 19000, buffer1.get(), kSize, false)); |
| 982 CacheTestFillBuffer(buffer2->data(), kSize, true); | 1001 CacheTestFillBuffer(buffer2->data(), kSize, true); |
| 983 EXPECT_EQ(kSize, ReadData(entry, 1, 18000, buffer2, kSize)); | 1002 EXPECT_EQ(kSize, ReadData(entry, 1, 18000, buffer2.get(), kSize)); |
| 984 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize)); | 1003 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize)); |
| 985 CacheTestFillBuffer(buffer2->data(), kSize, true); | 1004 CacheTestFillBuffer(buffer2->data(), kSize, true); |
| 986 EXPECT_EQ(kSize, ReadData(entry, 1, 17000, buffer2, kSize)); | 1005 EXPECT_EQ(kSize, ReadData(entry, 1, 17000, buffer2.get(), kSize)); |
| 987 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize)); | 1006 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize)); |
| 988 | 1007 |
| 989 EXPECT_EQ(kSize, WriteData(entry, 1, 22900, buffer1, kSize, false)); | 1008 EXPECT_EQ(kSize, WriteData(entry, 1, 22900, buffer1.get(), kSize, false)); |
| 990 CacheTestFillBuffer(buffer2->data(), kSize, true); | 1009 CacheTestFillBuffer(buffer2->data(), kSize, true); |
| 991 EXPECT_EQ(100, ReadData(entry, 1, 23000, buffer2, kSize)); | 1010 EXPECT_EQ(100, ReadData(entry, 1, 23000, buffer2.get(), kSize)); |
| 992 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data() + 100, 100)); | 1011 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data() + 100, 100)); |
| 993 | 1012 |
| 994 CacheTestFillBuffer(buffer2->data(), kSize, true); | 1013 CacheTestFillBuffer(buffer2->data(), kSize, true); |
| 995 EXPECT_EQ(100, ReadData(entry, 1, 23100, buffer2, kSize)); | 1014 EXPECT_EQ(100, ReadData(entry, 1, 23100, buffer2.get(), kSize)); |
| 996 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data() + 100, 100)); | 1015 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data() + 100, 100)); |
| 997 | 1016 |
| 998 // Extend the file again and read before without closing the entry. | 1017 // Extend the file again and read before without closing the entry. |
| 999 EXPECT_EQ(kSize, WriteData(entry, 1, 25000, buffer1, kSize, false)); | 1018 EXPECT_EQ(kSize, WriteData(entry, 1, 25000, buffer1.get(), kSize, false)); |
| 1000 EXPECT_EQ(kSize, WriteData(entry, 1, 45000, buffer1, kSize, false)); | 1019 EXPECT_EQ(kSize, WriteData(entry, 1, 45000, buffer1.get(), kSize, false)); |
| 1001 CacheTestFillBuffer(buffer2->data(), kSize, true); | 1020 CacheTestFillBuffer(buffer2->data(), kSize, true); |
| 1002 EXPECT_EQ(kSize, ReadData(entry, 1, 25000, buffer2, kSize)); | 1021 EXPECT_EQ(kSize, ReadData(entry, 1, 25000, buffer2.get(), kSize)); |
| 1003 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize)); | 1022 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize)); |
| 1004 CacheTestFillBuffer(buffer2->data(), kSize, true); | 1023 CacheTestFillBuffer(buffer2->data(), kSize, true); |
| 1005 EXPECT_EQ(kSize, ReadData(entry, 1, 45000, buffer2, kSize)); | 1024 EXPECT_EQ(kSize, ReadData(entry, 1, 45000, buffer2.get(), kSize)); |
| 1006 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize)); | 1025 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize)); |
| 1007 | 1026 |
| 1008 entry->Close(); | 1027 entry->Close(); |
| 1009 } | 1028 } |
| 1010 | 1029 |
| 1011 TEST_F(DiskCacheEntryTest, Buffering) { | 1030 TEST_F(DiskCacheEntryTest, Buffering) { |
| 1012 InitCache(); | 1031 InitCache(); |
| 1013 Buffering(); | 1032 Buffering(); |
| 1014 } | 1033 } |
| 1015 | 1034 |
| 1035 TEST_F(DiskCacheEntryTest, V3Buffering) { |
| 1036 UseVersion3(); |
| 1037 InitCache(); |
| 1038 Buffering(); |
| 1039 } |
| 1040 |
| 1016 TEST_F(DiskCacheEntryTest, BufferingNoBuffer) { | 1041 TEST_F(DiskCacheEntryTest, BufferingNoBuffer) { |
| 1017 InitCache(); | 1042 InitCache(); |
| 1018 cache_impl_->SetFlags(disk_cache::kNoBuffering); | 1043 SetNoBuffering(); |
| 1044 Buffering(); |
| 1045 } |
| 1046 |
| 1047 TEST_F(DiskCacheEntryTest, V3BufferingNoBuffer) { |
| 1048 UseVersion3(); |
| 1049 InitCache(); |
| 1050 SetNoBuffering(); |
| 1019 Buffering(); | 1051 Buffering(); |
| 1020 } | 1052 } |
| 1021 | 1053 |
| 1022 // Checks that entries are zero length when created. | 1054 // Checks that entries are zero length when created. |
| 1023 void DiskCacheEntryTest::SizeAtCreate() { | 1055 void DiskCacheEntryTest::SizeAtCreate() { |
| 1024 const char key[] = "the first key"; | 1056 const char key[] = "the first key"; |
| 1025 disk_cache::Entry* entry; | 1057 disk_cache::Entry* entry; |
| 1026 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 1058 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 1027 | 1059 |
| 1028 const int kNumStreams = 3; | 1060 const int kNumStreams = 3; |
| 1029 for (int i = 0; i < kNumStreams; ++i) | 1061 for (int i = 0; i < kNumStreams; ++i) |
| 1030 EXPECT_EQ(0, entry->GetDataSize(i)); | 1062 EXPECT_EQ(0, entry->GetDataSize(i)); |
| 1031 entry->Close(); | 1063 entry->Close(); |
| 1032 } | 1064 } |
| 1033 | 1065 |
| 1034 TEST_F(DiskCacheEntryTest, SizeAtCreate) { | 1066 TEST_F(DiskCacheEntryTest, SizeAtCreate) { |
| 1035 InitCache(); | 1067 InitCache(); |
| 1036 SizeAtCreate(); | 1068 SizeAtCreate(); |
| 1037 } | 1069 } |
| 1038 | 1070 |
| 1071 TEST_F(DiskCacheEntryTest, V3SizeAtCreate) { |
| 1072 UseVersion3(); |
| 1073 InitCache(); |
| 1074 SizeAtCreate(); |
| 1075 } |
| 1076 |
| 1039 TEST_F(DiskCacheEntryTest, MemoryOnlySizeAtCreate) { | 1077 TEST_F(DiskCacheEntryTest, MemoryOnlySizeAtCreate) { |
| 1040 SetMemoryOnlyMode(); | 1078 SetMemoryOnlyMode(); |
| 1041 InitCache(); | 1079 InitCache(); |
| 1042 SizeAtCreate(); | 1080 SizeAtCreate(); |
| 1043 } | 1081 } |
| 1044 | 1082 |
| 1045 // Some extra tests to make sure that buffering works properly when changing | 1083 // Some extra tests to make sure that buffering works properly when changing |
| 1046 // the entry size. | 1084 // the entry size. |
| 1047 void DiskCacheEntryTest::SizeChanges() { | 1085 void DiskCacheEntryTest::SizeChanges() { |
| 1048 std::string key("the first key"); | 1086 std::string key("the first key"); |
| 1049 disk_cache::Entry* entry; | 1087 disk_cache::Entry* entry; |
| 1050 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 1088 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 1051 | 1089 |
| 1052 const int kSize = 200; | 1090 const int kSize = 200; |
| 1053 const char zeros[kSize] = {}; | 1091 const char zeros[kSize] = {}; |
| 1054 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize)); | 1092 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize)); |
| 1055 scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize)); | 1093 scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize)); |
| 1056 CacheTestFillBuffer(buffer1->data(), kSize, true); | 1094 CacheTestFillBuffer(buffer1->data(), kSize, true); |
| 1057 CacheTestFillBuffer(buffer2->data(), kSize, true); | 1095 CacheTestFillBuffer(buffer2->data(), kSize, true); |
| 1058 | 1096 |
| 1059 EXPECT_EQ(kSize, WriteData(entry, 1, 0, buffer1, kSize, true)); | 1097 EXPECT_EQ(kSize, WriteData(entry, 1, 0, buffer1.get(), kSize, true)); |
| 1060 EXPECT_EQ(kSize, WriteData(entry, 1, 17000, buffer1, kSize, true)); | 1098 EXPECT_EQ(kSize, WriteData(entry, 1, 17000, buffer1.get(), kSize, true)); |
| 1061 EXPECT_EQ(kSize, WriteData(entry, 1, 23000, buffer1, kSize, true)); | 1099 EXPECT_EQ(kSize, WriteData(entry, 1, 23000, buffer1.get(), kSize, true)); |
| 1062 entry->Close(); | 1100 entry->Close(); |
| 1101 WaitForEntryToClose(key); |
| 1063 | 1102 |
| 1064 // Extend the file and read between the old size and the new write. | 1103 // Extend the file and read between the old size and the new write. |
| 1065 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); | 1104 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 1066 EXPECT_EQ(23000 + kSize, entry->GetDataSize(1)); | 1105 EXPECT_EQ(23000 + kSize, entry->GetDataSize(1)); |
| 1067 EXPECT_EQ(kSize, WriteData(entry, 1, 25000, buffer1, kSize, true)); | 1106 EXPECT_EQ(kSize, WriteData(entry, 1, 25000, buffer1.get(), kSize, true)); |
| 1068 EXPECT_EQ(25000 + kSize, entry->GetDataSize(1)); | 1107 EXPECT_EQ(25000 + kSize, entry->GetDataSize(1)); |
| 1069 EXPECT_EQ(kSize, ReadData(entry, 1, 24000, buffer2, kSize)); | 1108 EXPECT_EQ(kSize, ReadData(entry, 1, 24000, buffer2.get(), kSize)); |
| 1070 EXPECT_TRUE(!memcmp(buffer2->data(), zeros, kSize)); | 1109 EXPECT_TRUE(!memcmp(buffer2->data(), zeros, kSize)); |
| 1071 | 1110 |
| 1072 // Read at the end of the old file size. | 1111 // Read at the end of the old file size. |
| 1073 EXPECT_EQ(kSize, ReadData(entry, 1, 23000 + kSize - 35, buffer2, kSize)); | 1112 EXPECT_EQ(kSize, |
| 1113 ReadData(entry, 1, 23000 + kSize - 35, buffer2.get(), kSize)); |
| 1074 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data() + kSize - 35, 35)); | 1114 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data() + kSize - 35, 35)); |
| 1075 | 1115 |
| 1076 // Read slightly before the last write. | 1116 // Read slightly before the last write. |
| 1077 CacheTestFillBuffer(buffer2->data(), kSize, true); | 1117 CacheTestFillBuffer(buffer2->data(), kSize, true); |
| 1078 EXPECT_EQ(kSize, ReadData(entry, 1, 24900, buffer2, kSize)); | 1118 EXPECT_EQ(kSize, ReadData(entry, 1, 24900, buffer2.get(), kSize)); |
| 1079 EXPECT_TRUE(!memcmp(buffer2->data(), zeros, 100)); | 1119 EXPECT_TRUE(!memcmp(buffer2->data(), zeros, 100)); |
| 1080 EXPECT_TRUE(!memcmp(buffer2->data() + 100, buffer1->data(), kSize - 100)); | 1120 EXPECT_TRUE(!memcmp(buffer2->data() + 100, buffer1->data(), kSize - 100)); |
| 1081 | 1121 |
| 1082 // Extend the entry a little more. | 1122 // Extend the entry a little more. |
| 1083 EXPECT_EQ(kSize, WriteData(entry, 1, 26000, buffer1, kSize, true)); | 1123 EXPECT_EQ(kSize, WriteData(entry, 1, 26000, buffer1.get(), kSize, true)); |
| 1084 EXPECT_EQ(26000 + kSize, entry->GetDataSize(1)); | 1124 EXPECT_EQ(26000 + kSize, entry->GetDataSize(1)); |
| 1085 CacheTestFillBuffer(buffer2->data(), kSize, true); | 1125 CacheTestFillBuffer(buffer2->data(), kSize, true); |
| 1086 EXPECT_EQ(kSize, ReadData(entry, 1, 25900, buffer2, kSize)); | 1126 EXPECT_EQ(kSize, ReadData(entry, 1, 25900, buffer2.get(), kSize)); |
| 1087 EXPECT_TRUE(!memcmp(buffer2->data(), zeros, 100)); | 1127 EXPECT_TRUE(!memcmp(buffer2->data(), zeros, 100)); |
| 1088 EXPECT_TRUE(!memcmp(buffer2->data() + 100, buffer1->data(), kSize - 100)); | 1128 EXPECT_TRUE(!memcmp(buffer2->data() + 100, buffer1->data(), kSize - 100)); |
| 1089 | 1129 |
| 1090 // And now reduce the size. | 1130 // And now reduce the size. |
| 1091 EXPECT_EQ(kSize, WriteData(entry, 1, 25000, buffer1, kSize, true)); | 1131 EXPECT_EQ(kSize, WriteData(entry, 1, 25000, buffer1.get(), kSize, true)); |
| 1092 EXPECT_EQ(25000 + kSize, entry->GetDataSize(1)); | 1132 EXPECT_EQ(25000 + kSize, entry->GetDataSize(1)); |
| 1093 EXPECT_EQ(28, ReadData(entry, 1, 25000 + kSize - 28, buffer2, kSize)); | 1133 EXPECT_EQ(28, ReadData(entry, 1, 25000 + kSize - 28, buffer2.get(), kSize)); |
| 1094 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data() + kSize - 28, 28)); | 1134 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data() + kSize - 28, 28)); |
| 1095 | 1135 |
| 1096 // Reduce the size with a buffer that is not extending the size. | 1136 // Reduce the size with a buffer that is not extending the size. |
| 1097 EXPECT_EQ(kSize, WriteData(entry, 1, 24000, buffer1, kSize, false)); | 1137 EXPECT_EQ(kSize, WriteData(entry, 1, 24000, buffer1.get(), kSize, false)); |
| 1098 EXPECT_EQ(25000 + kSize, entry->GetDataSize(1)); | 1138 EXPECT_EQ(25000 + kSize, entry->GetDataSize(1)); |
| 1099 EXPECT_EQ(kSize, WriteData(entry, 1, 24500, buffer1, kSize, true)); | 1139 EXPECT_EQ(kSize, WriteData(entry, 1, 24500, buffer1.get(), kSize, true)); |
| 1100 EXPECT_EQ(24500 + kSize, entry->GetDataSize(1)); | 1140 EXPECT_EQ(24500 + kSize, entry->GetDataSize(1)); |
| 1101 EXPECT_EQ(kSize, ReadData(entry, 1, 23900, buffer2, kSize)); | 1141 EXPECT_EQ(kSize, ReadData(entry, 1, 23900, buffer2.get(), kSize)); |
| 1102 EXPECT_TRUE(!memcmp(buffer2->data(), zeros, 100)); | 1142 EXPECT_TRUE(!memcmp(buffer2->data(), zeros, 100)); |
| 1103 EXPECT_TRUE(!memcmp(buffer2->data() + 100, buffer1->data(), kSize - 100)); | 1143 EXPECT_TRUE(!memcmp(buffer2->data() + 100, buffer1->data(), kSize - 100)); |
| 1104 | 1144 |
| 1105 // And now reduce the size below the old size. | 1145 // And now reduce the size below the old size. |
| 1106 EXPECT_EQ(kSize, WriteData(entry, 1, 19000, buffer1, kSize, true)); | 1146 EXPECT_EQ(kSize, WriteData(entry, 1, 19000, buffer1.get(), kSize, true)); |
| 1107 EXPECT_EQ(19000 + kSize, entry->GetDataSize(1)); | 1147 EXPECT_EQ(19000 + kSize, entry->GetDataSize(1)); |
| 1108 EXPECT_EQ(kSize, ReadData(entry, 1, 18900, buffer2, kSize)); | 1148 |
| 1149 // Repeat the last write to make results consistent across backends. |
| 1150 EXPECT_EQ(kSize, WriteData(entry, 1, 19000, buffer1.get(), kSize, false)); |
| 1151 |
| 1152 EXPECT_EQ(100, ReadData(entry, 1, 18900, buffer2.get(), kSize)); |
| 1109 EXPECT_TRUE(!memcmp(buffer2->data(), zeros, 100)); | 1153 EXPECT_TRUE(!memcmp(buffer2->data(), zeros, 100)); |
| 1110 EXPECT_TRUE(!memcmp(buffer2->data() + 100, buffer1->data(), kSize - 100)); | |
| 1111 | 1154 |
| 1112 // Verify that the actual file is truncated. | 1155 // Verify that the actual file is truncated. |
| 1113 entry->Close(); | 1156 entry->Close(); |
| 1157 WaitForEntryToClose(key); |
| 1114 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); | 1158 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 1115 EXPECT_EQ(19000 + kSize, entry->GetDataSize(1)); | 1159 EXPECT_EQ(19000 + kSize, entry->GetDataSize(1)); |
| 1116 | 1160 |
| 1117 // Extend the newly opened file with a zero length write, expect zero fill. | 1161 // Extend the newly opened file with a zero length write, expect zero fill. |
| 1118 EXPECT_EQ(0, WriteData(entry, 1, 20000 + kSize, buffer1, 0, false)); | 1162 EXPECT_EQ(0, WriteData(entry, 1, 20000 + kSize, buffer1.get(), 0, false)); |
| 1119 EXPECT_EQ(kSize, ReadData(entry, 1, 19000 + kSize, buffer1, kSize)); | 1163 EXPECT_EQ(kSize, ReadData(entry, 1, 19000 + kSize, buffer1.get(), kSize)); |
| 1120 EXPECT_EQ(0, memcmp(buffer1->data(), zeros, kSize)); | 1164 EXPECT_EQ(0, memcmp(buffer1->data(), zeros, kSize)); |
| 1121 | 1165 |
| 1122 entry->Close(); | 1166 entry->Close(); |
| 1123 } | 1167 } |
| 1124 | 1168 |
| 1125 TEST_F(DiskCacheEntryTest, SizeChanges) { | 1169 TEST_F(DiskCacheEntryTest, SizeChanges) { |
| 1126 InitCache(); | 1170 InitCache(); |
| 1127 SizeChanges(); | 1171 SizeChanges(); |
| 1128 } | 1172 } |
| 1129 | 1173 |
| 1174 TEST_F(DiskCacheEntryTest, V3SizeChanges) { |
| 1175 UseVersion3(); |
| 1176 InitCache(); |
| 1177 SizeChanges(); |
| 1178 } |
| 1179 |
| 1130 TEST_F(DiskCacheEntryTest, SizeChangesNoBuffer) { | 1180 TEST_F(DiskCacheEntryTest, SizeChangesNoBuffer) { |
| 1131 InitCache(); | 1181 InitCache(); |
| 1132 cache_impl_->SetFlags(disk_cache::kNoBuffering); | 1182 SetNoBuffering(); |
| 1183 SizeChanges(); |
| 1184 } |
| 1185 |
| 1186 TEST_F(DiskCacheEntryTest, V3SizeChangesNoBuffer) { |
| 1187 UseVersion3(); |
| 1188 InitCache(); |
| 1189 SetNoBuffering(); |
| 1133 SizeChanges(); | 1190 SizeChanges(); |
| 1134 } | 1191 } |
| 1135 | 1192 |
| 1136 // Write more than the total cache capacity but to a single entry. |size| is the | 1193 // Write more than the total cache capacity but to a single entry. |size| is the |
| 1137 // amount of bytes to write each time. | 1194 // amount of bytes to write each time. |
| 1138 void DiskCacheEntryTest::ReuseEntry(int size) { | 1195 void DiskCacheEntryTest::ReuseEntry(int size) { |
| 1139 std::string key1("the first key"); | 1196 std::string key1("the first key"); |
| 1140 disk_cache::Entry* entry; | 1197 disk_cache::Entry* entry; |
| 1141 ASSERT_EQ(net::OK, CreateEntry(key1, &entry)); | 1198 ASSERT_EQ(net::OK, CreateEntry(key1, &entry)); |
| 1142 | 1199 |
| 1143 entry->Close(); | 1200 entry->Close(); |
| 1144 std::string key2("the second key"); | 1201 std::string key2("the second key"); |
| 1145 ASSERT_EQ(net::OK, CreateEntry(key2, &entry)); | 1202 ASSERT_EQ(net::OK, CreateEntry(key2, &entry)); |
| 1146 | 1203 |
| 1147 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(size)); | 1204 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(size)); |
| 1148 CacheTestFillBuffer(buffer->data(), size, false); | 1205 CacheTestFillBuffer(buffer->data(), size, false); |
| 1149 | 1206 |
| 1150 for (int i = 0; i < 15; i++) { | 1207 for (int i = 0; i < 15; i++) { |
| 1151 EXPECT_EQ(0, WriteData(entry, 0, 0, buffer, 0, true)); | 1208 EXPECT_EQ(0, WriteData(entry, 0, 0, buffer.get(), 0, true)); |
| 1152 EXPECT_EQ(size, WriteData(entry, 0, 0, buffer, size, false)); | 1209 EXPECT_EQ(size, WriteData(entry, 0, 0, buffer.get(), size, false)); |
| 1153 entry->Close(); | 1210 entry->Close(); |
| 1211 WaitForEntryToClose(key2); |
| 1154 ASSERT_EQ(net::OK, OpenEntry(key2, &entry)); | 1212 ASSERT_EQ(net::OK, OpenEntry(key2, &entry)); |
| 1155 } | 1213 } |
| 1156 | 1214 |
| 1157 entry->Close(); | 1215 entry->Close(); |
| 1158 ASSERT_EQ(net::OK, OpenEntry(key1, &entry)) << "have not evicted this entry"; | 1216 ASSERT_EQ(net::OK, OpenEntry(key1, &entry)) << "have not evicted this entry"; |
| 1159 entry->Close(); | 1217 entry->Close(); |
| 1160 } | 1218 } |
| 1161 | 1219 |
| 1162 TEST_F(DiskCacheEntryTest, ReuseExternalEntry) { | 1220 TEST_F(DiskCacheEntryTest, ReuseExternalEntry) { |
| 1163 SetMaxSize(200 * 1024); | 1221 SetMaxSize(200 * 1024); |
| 1164 InitCache(); | 1222 InitCache(); |
| 1165 ReuseEntry(20 * 1024); | 1223 ReuseEntry(20 * 1024); |
| 1166 } | 1224 } |
| 1167 | 1225 |
| 1226 TEST_F(DiskCacheEntryTest, V3ReuseExternalEntry) { |
| 1227 UseVersion3(); |
| 1228 SetMaxSize(200 * 1024); |
| 1229 InitCache(); |
| 1230 ReuseEntry(20 * 1024); |
| 1231 } |
| 1232 |
| 1168 TEST_F(DiskCacheEntryTest, MemoryOnlyReuseExternalEntry) { | 1233 TEST_F(DiskCacheEntryTest, MemoryOnlyReuseExternalEntry) { |
| 1169 SetMemoryOnlyMode(); | 1234 SetMemoryOnlyMode(); |
| 1170 SetMaxSize(200 * 1024); | 1235 SetMaxSize(200 * 1024); |
| 1171 InitCache(); | 1236 InitCache(); |
| 1172 ReuseEntry(20 * 1024); | 1237 ReuseEntry(20 * 1024); |
| 1173 } | 1238 } |
| 1174 | 1239 |
| 1175 TEST_F(DiskCacheEntryTest, ReuseInternalEntry) { | 1240 TEST_F(DiskCacheEntryTest, ReuseInternalEntry) { |
| 1176 SetMaxSize(100 * 1024); | 1241 SetMaxSize(100 * 1024); |
| 1177 InitCache(); | 1242 InitCache(); |
| 1178 ReuseEntry(10 * 1024); | 1243 ReuseEntry(10 * 1024); |
| 1179 } | 1244 } |
| 1180 | 1245 |
| 1246 TEST_F(DiskCacheEntryTest, V3ReuseInternalEntry) { |
| 1247 UseVersion3(); |
| 1248 SetMaxSize(100 * 1024); |
| 1249 InitCache(); |
| 1250 ReuseEntry(10 * 1024); |
| 1251 } |
| 1252 |
| 1181 TEST_F(DiskCacheEntryTest, MemoryOnlyReuseInternalEntry) { | 1253 TEST_F(DiskCacheEntryTest, MemoryOnlyReuseInternalEntry) { |
| 1182 SetMemoryOnlyMode(); | 1254 SetMemoryOnlyMode(); |
| 1183 SetMaxSize(100 * 1024); | 1255 SetMaxSize(100 * 1024); |
| 1184 InitCache(); | 1256 InitCache(); |
| 1185 ReuseEntry(10 * 1024); | 1257 ReuseEntry(10 * 1024); |
| 1186 } | 1258 } |
| 1187 | 1259 |
| 1188 // Reading somewhere that was not written should return zeros. | 1260 // Reading somewhere that was not written should return zeros. |
| 1189 void DiskCacheEntryTest::InvalidData() { | 1261 void DiskCacheEntryTest::InvalidData() { |
| 1190 std::string key("the first key"); | 1262 std::string key("the first key"); |
| 1191 disk_cache::Entry* entry; | 1263 disk_cache::Entry* entry; |
| 1192 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 1264 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 1193 | 1265 |
| 1194 const int kSize1 = 20000; | 1266 const int kSize1 = 20000; |
| 1195 const int kSize2 = 20000; | 1267 const int kSize2 = 20000; |
| 1196 const int kSize3 = 20000; | 1268 const int kSize3 = 20000; |
| 1197 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize1)); | 1269 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize1)); |
| 1198 scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize2)); | 1270 scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize2)); |
| 1199 scoped_refptr<net::IOBuffer> buffer3(new net::IOBuffer(kSize3)); | 1271 scoped_refptr<net::IOBuffer> buffer3(new net::IOBuffer(kSize3)); |
| 1200 | 1272 |
| 1201 CacheTestFillBuffer(buffer1->data(), kSize1, false); | 1273 CacheTestFillBuffer(buffer1->data(), kSize1, false); |
| 1202 memset(buffer2->data(), 0, kSize2); | 1274 memset(buffer2->data(), 0, kSize2); |
| 1203 | 1275 |
| 1204 // Simple data grow: | 1276 // Simple data grow: |
| 1205 EXPECT_EQ(200, WriteData(entry, 0, 400, buffer1, 200, false)); | 1277 EXPECT_EQ(200, WriteData(entry, 0, 400, buffer1.get(), 200, false)); |
| 1206 EXPECT_EQ(600, entry->GetDataSize(0)); | 1278 EXPECT_EQ(600, entry->GetDataSize(0)); |
| 1207 EXPECT_EQ(100, ReadData(entry, 0, 300, buffer3, 100)); | 1279 EXPECT_EQ(100, ReadData(entry, 0, 300, buffer3.get(), 100)); |
| 1208 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 100)); | 1280 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 100)); |
| 1209 entry->Close(); | 1281 entry->Close(); |
| 1282 WaitForEntryToClose(key); |
| 1210 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); | 1283 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 1211 | 1284 |
| 1212 // The entry is now on disk. Load it and extend it. | 1285 // The entry is now on disk. Load it and extend it. |
| 1213 EXPECT_EQ(200, WriteData(entry, 0, 800, buffer1, 200, false)); | 1286 EXPECT_EQ(200, WriteData(entry, 0, 800, buffer1.get(), 200, false)); |
| 1214 EXPECT_EQ(1000, entry->GetDataSize(0)); | 1287 EXPECT_EQ(1000, entry->GetDataSize(0)); |
| 1215 EXPECT_EQ(100, ReadData(entry, 0, 700, buffer3, 100)); | 1288 EXPECT_EQ(100, ReadData(entry, 0, 700, buffer3.get(), 100)); |
| 1216 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 100)); | 1289 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 100)); |
| 1217 entry->Close(); | 1290 entry->Close(); |
| 1291 WaitForEntryToClose(key); |
| 1218 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); | 1292 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 1219 | 1293 |
| 1220 // This time using truncate. | 1294 // This time using truncate. |
| 1221 EXPECT_EQ(200, WriteData(entry, 0, 1800, buffer1, 200, true)); | 1295 EXPECT_EQ(200, WriteData(entry, 0, 1800, buffer1.get(), 200, true)); |
| 1222 EXPECT_EQ(2000, entry->GetDataSize(0)); | 1296 EXPECT_EQ(2000, entry->GetDataSize(0)); |
| 1223 EXPECT_EQ(100, ReadData(entry, 0, 1500, buffer3, 100)); | 1297 EXPECT_EQ(100, ReadData(entry, 0, 1500, buffer3.get(), 100)); |
| 1224 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 100)); | 1298 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 100)); |
| 1225 | 1299 |
| 1226 // Go to an external file. | 1300 // Go to an external file. |
| 1227 EXPECT_EQ(200, WriteData(entry, 0, 19800, buffer1, 200, false)); | 1301 EXPECT_EQ(200, WriteData(entry, 0, 19800, buffer1.get(), 200, false)); |
| 1228 EXPECT_EQ(20000, entry->GetDataSize(0)); | 1302 EXPECT_EQ(20000, entry->GetDataSize(0)); |
| 1229 EXPECT_EQ(4000, ReadData(entry, 0, 14000, buffer3, 4000)); | 1303 EXPECT_EQ(4000, ReadData(entry, 0, 14000, buffer3.get(), 4000)); |
| 1230 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 4000)); | 1304 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 4000)); |
| 1231 | 1305 |
| 1232 // And back to an internal block. | 1306 // And back to an internal block. |
| 1233 EXPECT_EQ(600, WriteData(entry, 0, 1000, buffer1, 600, true)); | 1307 EXPECT_EQ(600, WriteData(entry, 0, 1000, buffer1.get(), 600, true)); |
| 1234 EXPECT_EQ(1600, entry->GetDataSize(0)); | 1308 EXPECT_EQ(1600, entry->GetDataSize(0)); |
| 1235 EXPECT_EQ(600, ReadData(entry, 0, 1000, buffer3, 600)); | 1309 EXPECT_EQ(600, ReadData(entry, 0, 1000, buffer3.get(), 600)); |
| 1236 EXPECT_TRUE(!memcmp(buffer3->data(), buffer1->data(), 600)); | 1310 EXPECT_TRUE(!memcmp(buffer3->data(), buffer1->data(), 600)); |
| 1237 | 1311 |
| 1238 // Extend it again. | 1312 // Extend it again. |
| 1239 EXPECT_EQ(600, WriteData(entry, 0, 2000, buffer1, 600, false)); | 1313 EXPECT_EQ(600, WriteData(entry, 0, 2000, buffer1.get(), 600, false)); |
| 1240 EXPECT_EQ(2600, entry->GetDataSize(0)); | 1314 EXPECT_EQ(2600, entry->GetDataSize(0)); |
| 1241 EXPECT_EQ(200, ReadData(entry, 0, 1800, buffer3, 200)); | 1315 EXPECT_EQ(200, ReadData(entry, 0, 1800, buffer3.get(), 200)); |
| 1242 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 200)); | 1316 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 200)); |
| 1243 | 1317 |
| 1244 // And again (with truncation flag). | 1318 // And again (with truncation flag). |
| 1245 EXPECT_EQ(600, WriteData(entry, 0, 3000, buffer1, 600, true)); | 1319 EXPECT_EQ(600, WriteData(entry, 0, 3000, buffer1.get(), 600, true)); |
| 1246 EXPECT_EQ(3600, entry->GetDataSize(0)); | 1320 EXPECT_EQ(3600, entry->GetDataSize(0)); |
| 1247 EXPECT_EQ(200, ReadData(entry, 0, 2800, buffer3, 200)); | 1321 EXPECT_EQ(200, ReadData(entry, 0, 2800, buffer3.get(), 200)); |
| 1248 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 200)); | 1322 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 200)); |
| 1249 | 1323 |
| 1250 entry->Close(); | 1324 entry->Close(); |
| 1251 } | 1325 } |
| 1252 | 1326 |
| 1253 TEST_F(DiskCacheEntryTest, InvalidData) { | 1327 TEST_F(DiskCacheEntryTest, InvalidData) { |
| 1254 InitCache(); | 1328 InitCache(); |
| 1255 InvalidData(); | 1329 InvalidData(); |
| 1256 } | 1330 } |
| 1257 | 1331 |
| 1332 TEST_F(DiskCacheEntryTest, V3InvalidData) { |
| 1333 UseVersion3(); |
| 1334 InitCache(); |
| 1335 InvalidData(); |
| 1336 } |
| 1337 |
| 1258 TEST_F(DiskCacheEntryTest, InvalidDataNoBuffer) { | 1338 TEST_F(DiskCacheEntryTest, InvalidDataNoBuffer) { |
| 1259 InitCache(); | 1339 InitCache(); |
| 1260 cache_impl_->SetFlags(disk_cache::kNoBuffering); | 1340 SetNoBuffering(); |
| 1341 InvalidData(); |
| 1342 } |
| 1343 |
| 1344 TEST_F(DiskCacheEntryTest, V3InvalidDataNoBuffer) { |
| 1345 UseVersion3(); |
| 1346 InitCache(); |
| 1347 SetNoBuffering(); |
| 1261 InvalidData(); | 1348 InvalidData(); |
| 1262 } | 1349 } |
| 1263 | 1350 |
| 1264 TEST_F(DiskCacheEntryTest, MemoryOnlyInvalidData) { | 1351 TEST_F(DiskCacheEntryTest, MemoryOnlyInvalidData) { |
| 1265 SetMemoryOnlyMode(); | 1352 SetMemoryOnlyMode(); |
| 1266 InitCache(); | 1353 InitCache(); |
| 1267 InvalidData(); | 1354 InvalidData(); |
| 1268 } | 1355 } |
| 1269 | 1356 |
| 1270 // Tests that the cache preserves the buffer of an IO operation. | 1357 // Tests that the cache preserves the buffer of an IO operation. |
| 1271 void DiskCacheEntryTest::ReadWriteDestroyBuffer() { | 1358 void DiskCacheEntryTest::ReadWriteDestroyBuffer() { |
| 1272 std::string key("the first key"); | 1359 std::string key("the first key"); |
| 1273 disk_cache::Entry* entry; | 1360 disk_cache::Entry* entry; |
| 1274 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 1361 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 1275 | 1362 |
| 1276 const int kSize = 200; | 1363 const int kSize = 20000; |
| 1277 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); | 1364 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); |
| 1278 CacheTestFillBuffer(buffer->data(), kSize, false); | 1365 CacheTestFillBuffer(buffer->data(), kSize, false); |
| 1279 | 1366 |
| 1280 net::TestCompletionCallback cb; | 1367 net::TestCompletionCallback cb; |
| 1281 EXPECT_EQ(net::ERR_IO_PENDING, | 1368 EXPECT_EQ(net::ERR_IO_PENDING, |
| 1282 entry->WriteData(0, 0, buffer, kSize, cb.callback(), false)); | 1369 entry->WriteData(0, 0, buffer.get(), kSize, cb.callback(), false)); |
| 1283 | 1370 |
| 1284 // Release our reference to the buffer. | 1371 // Release our reference to the buffer. |
| 1285 buffer = NULL; | 1372 buffer = NULL; |
| 1286 EXPECT_EQ(kSize, cb.WaitForResult()); | 1373 EXPECT_EQ(kSize, cb.WaitForResult()); |
| 1287 | 1374 |
| 1288 // And now test with a Read(). | 1375 // And now test with a Read(). |
| 1289 buffer = new net::IOBuffer(kSize); | 1376 buffer = new net::IOBuffer(kSize); |
| 1290 CacheTestFillBuffer(buffer->data(), kSize, false); | 1377 CacheTestFillBuffer(buffer->data(), kSize, false); |
| 1291 | 1378 |
| 1292 EXPECT_EQ(net::ERR_IO_PENDING, | 1379 EXPECT_EQ(net::ERR_IO_PENDING, |
| 1293 entry->ReadData(0, 0, buffer, kSize, cb.callback())); | 1380 entry->ReadData(0, 0, buffer.get(), kSize, cb.callback())); |
| 1294 buffer = NULL; | 1381 buffer = NULL; |
| 1295 EXPECT_EQ(kSize, cb.WaitForResult()); | 1382 EXPECT_EQ(kSize, cb.WaitForResult()); |
| 1296 | 1383 |
| 1297 entry->Close(); | 1384 entry->Close(); |
| 1298 } | 1385 } |
| 1299 | 1386 |
| 1300 TEST_F(DiskCacheEntryTest, ReadWriteDestroyBuffer) { | 1387 TEST_F(DiskCacheEntryTest, ReadWriteDestroyBuffer) { |
| 1301 InitCache(); | 1388 InitCache(); |
| 1302 ReadWriteDestroyBuffer(); | 1389 ReadWriteDestroyBuffer(); |
| 1303 } | 1390 } |
| 1304 | 1391 |
| 1392 TEST_F(DiskCacheEntryTest, V3ReadWriteDestroyBuffer) { |
| 1393 UseVersion3(); |
| 1394 InitCache(); |
| 1395 SetNoBuffering(); |
| 1396 ReadWriteDestroyBuffer(); |
| 1397 } |
| 1398 |
| 1305 void DiskCacheEntryTest::DoomNormalEntry() { | 1399 void DiskCacheEntryTest::DoomNormalEntry() { |
| 1306 std::string key("the first key"); | 1400 std::string key("the first key"); |
| 1307 disk_cache::Entry* entry; | 1401 disk_cache::Entry* entry; |
| 1308 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 1402 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 1309 entry->Doom(); | 1403 entry->Doom(); |
| 1310 entry->Close(); | 1404 entry->Close(); |
| 1311 | 1405 |
| 1312 const int kSize = 20000; | 1406 const int kSize = 20000; |
| 1313 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); | 1407 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); |
| 1314 CacheTestFillBuffer(buffer->data(), kSize, true); | 1408 CacheTestFillBuffer(buffer->data(), kSize, true); |
| 1315 buffer->data()[19999] = '\0'; | 1409 buffer->data()[19999] = '\0'; |
| 1316 | 1410 |
| 1317 key = buffer->data(); | 1411 key = buffer->data(); |
| 1318 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 1412 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 1319 EXPECT_EQ(20000, WriteData(entry, 0, 0, buffer, kSize, false)); | 1413 EXPECT_EQ(20000, WriteData(entry, 0, 0, buffer.get(), kSize, false)); |
| 1320 EXPECT_EQ(20000, WriteData(entry, 1, 0, buffer, kSize, false)); | 1414 EXPECT_EQ(20000, WriteData(entry, 1, 0, buffer.get(), kSize, false)); |
| 1321 entry->Doom(); | 1415 entry->Doom(); |
| 1322 entry->Close(); | 1416 entry->Close(); |
| 1323 | 1417 |
| 1324 FlushQueueForTest(); | 1418 FlushQueueForTest(); |
| 1325 EXPECT_EQ(0, cache_->GetEntryCount()); | 1419 EXPECT_EQ(0, cache_->GetEntryCount()); |
| 1326 } | 1420 } |
| 1327 | 1421 |
| 1328 TEST_F(DiskCacheEntryTest, DoomEntry) { | 1422 TEST_F(DiskCacheEntryTest, DoomEntry) { |
| 1329 InitCache(); | 1423 InitCache(); |
| 1330 DoomNormalEntry(); | 1424 DoomNormalEntry(); |
| 1331 } | 1425 } |
| 1332 | 1426 |
| 1427 TEST_F(DiskCacheEntryTest, V3DoomEntry) { |
| 1428 UseVersion3(); |
| 1429 InitCache(); |
| 1430 DoomNormalEntry(); |
| 1431 } |
| 1432 |
| 1333 TEST_F(DiskCacheEntryTest, MemoryOnlyDoomEntry) { | 1433 TEST_F(DiskCacheEntryTest, MemoryOnlyDoomEntry) { |
| 1334 SetMemoryOnlyMode(); | 1434 SetMemoryOnlyMode(); |
| 1335 InitCache(); | 1435 InitCache(); |
| 1336 DoomNormalEntry(); | 1436 DoomNormalEntry(); |
| 1337 } | 1437 } |
| 1338 | 1438 |
| 1339 // Tests dooming an entry that's linked to an open entry. | 1439 // Tests dooming an entry that's linked to an open entry. |
| 1340 void DiskCacheEntryTest::DoomEntryNextToOpenEntry() { | 1440 void DiskCacheEntryTest::DoomEntryNextToOpenEntry() { |
| 1341 disk_cache::Entry* entry1; | 1441 disk_cache::Entry* entry1; |
| 1342 disk_cache::Entry* entry2; | 1442 disk_cache::Entry* entry2; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1359 | 1459 |
| 1360 ASSERT_EQ(net::OK, OpenEntry("fixed", &entry1)); | 1460 ASSERT_EQ(net::OK, OpenEntry("fixed", &entry1)); |
| 1361 entry1->Close(); | 1461 entry1->Close(); |
| 1362 } | 1462 } |
| 1363 | 1463 |
| 1364 TEST_F(DiskCacheEntryTest, DoomEntryNextToOpenEntry) { | 1464 TEST_F(DiskCacheEntryTest, DoomEntryNextToOpenEntry) { |
| 1365 InitCache(); | 1465 InitCache(); |
| 1366 DoomEntryNextToOpenEntry(); | 1466 DoomEntryNextToOpenEntry(); |
| 1367 } | 1467 } |
| 1368 | 1468 |
| 1469 TEST_F(DiskCacheEntryTest, V3DoomEntryNextToOpenEntry) { |
| 1470 UseVersion3(); |
| 1471 InitCache(); |
| 1472 DoomEntryNextToOpenEntry(); |
| 1473 } |
| 1474 |
| 1369 TEST_F(DiskCacheEntryTest, NewEvictionDoomEntryNextToOpenEntry) { | 1475 TEST_F(DiskCacheEntryTest, NewEvictionDoomEntryNextToOpenEntry) { |
| 1370 SetNewEviction(); | 1476 SetNewEviction(); |
| 1371 InitCache(); | 1477 InitCache(); |
| 1372 DoomEntryNextToOpenEntry(); | 1478 DoomEntryNextToOpenEntry(); |
| 1373 } | 1479 } |
| 1374 | 1480 |
| 1375 TEST_F(DiskCacheEntryTest, AppCacheDoomEntryNextToOpenEntry) { | 1481 TEST_F(DiskCacheEntryTest, AppCacheDoomEntryNextToOpenEntry) { |
| 1376 SetCacheType(net::APP_CACHE); | 1482 SetCacheType(net::APP_CACHE); |
| 1377 InitCache(); | 1483 InitCache(); |
| 1378 DoomEntryNextToOpenEntry(); | 1484 DoomEntryNextToOpenEntry(); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1390 Time initial = Time::Now(); | 1496 Time initial = Time::Now(); |
| 1391 AddDelay(); | 1497 AddDelay(); |
| 1392 | 1498 |
| 1393 const int kSize1 = 2000; | 1499 const int kSize1 = 2000; |
| 1394 const int kSize2 = 2000; | 1500 const int kSize2 = 2000; |
| 1395 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize1)); | 1501 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize1)); |
| 1396 scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize2)); | 1502 scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize2)); |
| 1397 CacheTestFillBuffer(buffer1->data(), kSize1, false); | 1503 CacheTestFillBuffer(buffer1->data(), kSize1, false); |
| 1398 memset(buffer2->data(), 0, kSize2); | 1504 memset(buffer2->data(), 0, kSize2); |
| 1399 | 1505 |
| 1400 EXPECT_EQ(2000, WriteData(entry, 0, 0, buffer1, 2000, false)); | 1506 EXPECT_EQ(2000, WriteData(entry, 0, 0, buffer1.get(), 2000, false)); |
| 1401 EXPECT_EQ(2000, ReadData(entry, 0, 0, buffer2, 2000)); | 1507 EXPECT_EQ(2000, ReadData(entry, 0, 0, buffer2.get(), 2000)); |
| 1402 EXPECT_EQ(0, memcmp(buffer1->data(), buffer2->data(), kSize1)); | 1508 EXPECT_EQ(0, memcmp(buffer1->data(), buffer2->data(), kSize1)); |
| 1403 EXPECT_EQ(key, entry->GetKey()); | 1509 EXPECT_EQ(key, entry->GetKey()); |
| 1404 EXPECT_TRUE(initial < entry->GetLastModified()); | 1510 EXPECT_TRUE(initial < entry->GetLastModified()); |
| 1405 EXPECT_TRUE(initial < entry->GetLastUsed()); | 1511 EXPECT_TRUE(initial < entry->GetLastUsed()); |
| 1406 | 1512 |
| 1407 entry->Close(); | 1513 entry->Close(); |
| 1408 } | 1514 } |
| 1409 | 1515 |
| 1410 TEST_F(DiskCacheEntryTest, DoomedEntry) { | 1516 TEST_F(DiskCacheEntryTest, DoomedEntry) { |
| 1411 InitCache(); | 1517 InitCache(); |
| 1412 DoomedEntry(); | 1518 DoomedEntry(); |
| 1413 } | 1519 } |
| 1414 | 1520 |
| 1521 TEST_F(DiskCacheEntryTest, V3DoomedEntry) { |
| 1522 UseVersion3(); |
| 1523 InitCache(); |
| 1524 DoomedEntry(); |
| 1525 } |
| 1526 |
| 1415 TEST_F(DiskCacheEntryTest, MemoryOnlyDoomedEntry) { | 1527 TEST_F(DiskCacheEntryTest, MemoryOnlyDoomedEntry) { |
| 1416 SetMemoryOnlyMode(); | 1528 SetMemoryOnlyMode(); |
| 1417 InitCache(); | 1529 InitCache(); |
| 1418 DoomedEntry(); | 1530 DoomedEntry(); |
| 1419 } | 1531 } |
| 1420 | 1532 |
| 1421 // Tests that we discard entries if the data is missing. | 1533 void DiskCacheEntryTest::MissingData() { |
| 1422 TEST_F(DiskCacheEntryTest, MissingData) { | |
| 1423 InitCache(); | 1534 InitCache(); |
| 1424 | 1535 |
| 1425 std::string key("the first key"); | 1536 std::string key("the first key"); |
| 1426 disk_cache::Entry* entry; | 1537 disk_cache::Entry* entry; |
| 1427 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 1538 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 1428 | 1539 |
| 1429 // Write to an external file. | 1540 // Write to an external file. |
| 1430 const int kSize = 20000; | 1541 const int kSize = 20000; |
| 1431 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); | 1542 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); |
| 1432 CacheTestFillBuffer(buffer->data(), kSize, false); | 1543 CacheTestFillBuffer(buffer->data(), kSize, false); |
| 1433 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, false)); | 1544 EXPECT_EQ(kSize, WriteData(entry, 1, 0, buffer.get(), kSize, false)); |
| 1434 entry->Close(); | 1545 entry->Close(); |
| 1435 FlushQueueForTest(); | 1546 FlushQueueForTest(); |
| 1436 | 1547 |
| 1437 disk_cache::Addr address(0x80000001); | 1548 disk_cache::Addr address(0x80000001); |
| 1438 base::FilePath name = cache_impl_->GetFileName(address); | 1549 if (cache_impl_v3_) |
| 1550 address.set_value(0x80040000); |
| 1551 |
| 1552 std::string tmp = base::StringPrintf("f_%06x", address.FileNumber()); |
| 1553 base::FilePath name = cache_path_.AppendASCII(tmp); |
| 1439 EXPECT_TRUE(file_util::Delete(name, false)); | 1554 EXPECT_TRUE(file_util::Delete(name, false)); |
| 1440 | 1555 |
| 1441 // Attempt to read the data. | 1556 // Attempt to read the data. |
| 1442 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); | 1557 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 1443 EXPECT_EQ(net::ERR_FILE_NOT_FOUND, ReadData(entry, 0, 0, buffer, kSize)); | 1558 EXPECT_EQ(net::ERR_FILE_NOT_FOUND, |
| 1559 ReadData(entry, 1, 0, buffer.get(), kSize)); |
| 1444 entry->Close(); | 1560 entry->Close(); |
| 1445 | 1561 |
| 1446 // The entry should be gone. | 1562 // The entry should be gone. |
| 1447 ASSERT_NE(net::OK, OpenEntry(key, &entry)); | 1563 ASSERT_NE(net::OK, OpenEntry(key, &entry)); |
| 1448 } | 1564 } |
| 1449 | 1565 |
| 1566 TEST_F(DiskCacheEntryTest, MissingData) { |
| 1567 MissingData(); |
| 1568 } |
| 1569 |
| 1570 TEST_F(DiskCacheEntryTest, V3MissingData) { |
| 1571 UseVersion3(); |
| 1572 MissingData(); |
| 1573 } |
| 1574 |
| 1450 // Test that child entries in a memory cache backend are not visible from | 1575 // Test that child entries in a memory cache backend are not visible from |
| 1451 // enumerations. | 1576 // enumerations. |
| 1452 TEST_F(DiskCacheEntryTest, MemoryOnlyEnumerationWithSparseEntries) { | 1577 TEST_F(DiskCacheEntryTest, MemoryOnlyEnumerationWithSparseEntries) { |
| 1453 SetMemoryOnlyMode(); | 1578 SetMemoryOnlyMode(); |
| 1454 InitCache(); | 1579 InitCache(); |
| 1455 | 1580 |
| 1456 const int kSize = 4096; | 1581 const int kSize = 4096; |
| 1457 scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kSize)); | 1582 scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kSize)); |
| 1458 CacheTestFillBuffer(buf->data(), kSize, false); | 1583 CacheTestFillBuffer(buf->data(), kSize, false); |
| 1459 | 1584 |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1530 // Write at offset 0. | 1655 // Write at offset 0. |
| 1531 VerifySparseIO(entry, 0, buf_1, kSize, buf_2); | 1656 VerifySparseIO(entry, 0, buf_1, kSize, buf_2); |
| 1532 | 1657 |
| 1533 // Write at offset 0x400000 (4 MB). | 1658 // Write at offset 0x400000 (4 MB). |
| 1534 VerifySparseIO(entry, 0x400000, buf_1, kSize, buf_2); | 1659 VerifySparseIO(entry, 0x400000, buf_1, kSize, buf_2); |
| 1535 | 1660 |
| 1536 // Write at offset 0x800000000 (32 GB). | 1661 // Write at offset 0x800000000 (32 GB). |
| 1537 VerifySparseIO(entry, 0x800000000LL, buf_1, kSize, buf_2); | 1662 VerifySparseIO(entry, 0x800000000LL, buf_1, kSize, buf_2); |
| 1538 | 1663 |
| 1539 entry->Close(); | 1664 entry->Close(); |
| 1665 AddDelayForTest(40); // We need to close multiple entries. |
| 1666 WaitForEntryToClose(key); |
| 1540 | 1667 |
| 1541 // Check everything again. | 1668 // Check everything again. |
| 1542 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); | 1669 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 1543 VerifyContentSparseIO(entry, 0, buf_1->data(), kSize); | 1670 VerifyContentSparseIO(entry, 0, buf_1->data(), kSize); |
| 1544 VerifyContentSparseIO(entry, 0x400000, buf_1->data(), kSize); | 1671 VerifyContentSparseIO(entry, 0x400000, buf_1->data(), kSize); |
| 1545 VerifyContentSparseIO(entry, 0x800000000LL, buf_1->data(), kSize); | 1672 VerifyContentSparseIO(entry, 0x800000000LL, buf_1->data(), kSize); |
| 1546 entry->Close(); | 1673 entry->Close(); |
| 1547 } | 1674 } |
| 1548 | 1675 |
| 1549 TEST_F(DiskCacheEntryTest, BasicSparseIO) { | 1676 TEST_F(DiskCacheEntryTest, BasicSparseIO) { |
| 1550 InitCache(); | 1677 InitCache(); |
| 1551 BasicSparseIO(); | 1678 BasicSparseIO(); |
| 1552 } | 1679 } |
| 1553 | 1680 |
| 1681 TEST_F(DiskCacheEntryTest, V3BasicSparseIO) { |
| 1682 UseVersion3(); |
| 1683 InitCache(); |
| 1684 BasicSparseIO(); |
| 1685 } |
| 1686 |
| 1554 TEST_F(DiskCacheEntryTest, MemoryOnlyBasicSparseIO) { | 1687 TEST_F(DiskCacheEntryTest, MemoryOnlyBasicSparseIO) { |
| 1555 SetMemoryOnlyMode(); | 1688 SetMemoryOnlyMode(); |
| 1556 InitCache(); | 1689 InitCache(); |
| 1557 BasicSparseIO(); | 1690 BasicSparseIO(); |
| 1558 } | 1691 } |
| 1559 | 1692 |
| 1560 void DiskCacheEntryTest::HugeSparseIO() { | 1693 void DiskCacheEntryTest::HugeSparseIO() { |
| 1561 std::string key("the first key"); | 1694 std::string key("the first key"); |
| 1562 disk_cache::Entry* entry; | 1695 disk_cache::Entry* entry; |
| 1563 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 1696 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 1564 | 1697 |
| 1565 // Write 1.2 MB so that we cover multiple entries. | 1698 // Write 1.2 MB so that we cover multiple entries. |
| 1566 const int kSize = 1200 * 1024; | 1699 const int kSize = 1200 * 1024; |
| 1567 scoped_refptr<net::IOBuffer> buf_1(new net::IOBuffer(kSize)); | 1700 scoped_refptr<net::IOBuffer> buf_1(new net::IOBuffer(kSize)); |
| 1568 scoped_refptr<net::IOBuffer> buf_2(new net::IOBuffer(kSize)); | 1701 scoped_refptr<net::IOBuffer> buf_2(new net::IOBuffer(kSize)); |
| 1569 CacheTestFillBuffer(buf_1->data(), kSize, false); | 1702 CacheTestFillBuffer(buf_1->data(), kSize, false); |
| 1570 | 1703 |
| 1571 // Write at offset 0x20F0000 (33 MB - 64 KB). | 1704 // Write at offset 0x20F0000 (33 MB - 64 KB). |
| 1572 VerifySparseIO(entry, 0x20F0000, buf_1, kSize, buf_2); | 1705 VerifySparseIO(entry, 0x20F0000, buf_1, kSize, buf_2); |
| 1573 entry->Close(); | 1706 entry->Close(); |
| 1707 WaitForEntryToClose(key); |
| 1574 | 1708 |
| 1575 // Check it again. | 1709 // Check it again. |
| 1576 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); | 1710 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 1577 VerifyContentSparseIO(entry, 0x20F0000, buf_1->data(), kSize); | 1711 VerifyContentSparseIO(entry, 0x20F0000, buf_1->data(), kSize); |
| 1578 entry->Close(); | 1712 entry->Close(); |
| 1579 } | 1713 } |
| 1580 | 1714 |
| 1581 TEST_F(DiskCacheEntryTest, HugeSparseIO) { | 1715 TEST_F(DiskCacheEntryTest, HugeSparseIO) { |
| 1582 InitCache(); | 1716 InitCache(); |
| 1583 HugeSparseIO(); | 1717 HugeSparseIO(); |
| 1584 } | 1718 } |
| 1585 | 1719 |
| 1720 TEST_F(DiskCacheEntryTest, V3HugeSparseIO) { |
| 1721 UseVersion3(); |
| 1722 InitCache(); |
| 1723 HugeSparseIO(); |
| 1724 } |
| 1725 |
| 1586 TEST_F(DiskCacheEntryTest, MemoryOnlyHugeSparseIO) { | 1726 TEST_F(DiskCacheEntryTest, MemoryOnlyHugeSparseIO) { |
| 1587 SetMemoryOnlyMode(); | 1727 SetMemoryOnlyMode(); |
| 1588 InitCache(); | 1728 InitCache(); |
| 1589 HugeSparseIO(); | 1729 HugeSparseIO(); |
| 1590 } | 1730 } |
| 1591 | 1731 |
| 1592 void DiskCacheEntryTest::GetAvailableRange() { | 1732 void DiskCacheEntryTest::SparseGetAvailableRange() { |
| 1593 std::string key("the first key"); | 1733 std::string key("the first key"); |
| 1594 disk_cache::Entry* entry; | 1734 disk_cache::Entry* entry; |
| 1595 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 1735 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 1596 | 1736 |
| 1597 const int kSize = 16 * 1024; | 1737 const int kSize = 16 * 1024; |
| 1598 scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kSize)); | 1738 scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kSize)); |
| 1599 CacheTestFillBuffer(buf->data(), kSize, false); | 1739 CacheTestFillBuffer(buf->data(), kSize, false); |
| 1600 | 1740 |
| 1601 // Write at offset 0x20F0000 (33 MB - 64 KB), and 0x20F4400 (33 MB - 47 KB). | 1741 // Write at offset 0x20F0000 (33 MB - 64 KB), and 0x20F4400 (33 MB - 47 KB). |
| 1602 EXPECT_EQ(kSize, WriteSparseData(entry, 0x20F0000, buf, kSize)); | 1742 EXPECT_EQ(kSize, WriteSparseData(entry, 0x20F0000, buf, kSize)); |
| 1603 EXPECT_EQ(kSize, WriteSparseData(entry, 0x20F4400, buf, kSize)); | 1743 EXPECT_EQ(kSize, WriteSparseData(entry, 0x20F4400, buf, kSize)); |
| 1604 | 1744 |
| 1605 // We stop at the first empty block. | 1745 // We stop at the first empty block. |
| 1606 int64 start; | 1746 int64 start; |
| 1607 net::TestCompletionCallback cb; | 1747 net::TestCompletionCallback cb; |
| 1608 int rv = entry->GetAvailableRange( | 1748 int rv = entry->GetAvailableRange(0x20F0000, kSize * 2, &start, |
| 1609 0x20F0000, kSize * 2, &start, cb.callback()); | 1749 cb.callback()); |
| 1610 EXPECT_EQ(kSize, cb.GetResult(rv)); | 1750 EXPECT_EQ(kSize, cb.GetResult(rv)); |
| 1611 EXPECT_EQ(0x20F0000, start); | 1751 EXPECT_EQ(0x20F0000, start); |
| 1612 | 1752 |
| 1613 start = 0; | 1753 start = 0; |
| 1614 rv = entry->GetAvailableRange(0, kSize, &start, cb.callback()); | 1754 EXPECT_EQ(0, GetAvailableRange(entry, 0, kSize, &start)); |
| 1615 EXPECT_EQ(0, cb.GetResult(rv)); | 1755 EXPECT_EQ(0, GetAvailableRange(entry, 0x20F0000 - kSize, kSize, &start)); |
| 1616 rv = entry->GetAvailableRange( | 1756 //rv = entry->GetAvailableRange(0x20F0000 - kSize, kSize, &start, |
| 1617 0x20F0000 - kSize, kSize, &start, cb.callback()); | 1757 // cb.callback()); |
| 1618 EXPECT_EQ(0, cb.GetResult(rv)); | 1758 //EXPECT_EQ(0, cb.GetResult(rv)); |
| 1619 rv = entry->GetAvailableRange(0, 0x2100000, &start, cb.callback()); | 1759 //rv = entry->GetAvailableRange(0, 0x2100000, &start, cb.callback()); |
| 1620 EXPECT_EQ(kSize, cb.GetResult(rv)); | 1760 //EXPECT_EQ(kSize, cb.GetResult(rv)); |
| 1761 EXPECT_EQ(kSize, GetAvailableRange(entry, 0, 0x2100000, &start)); |
| 1621 EXPECT_EQ(0x20F0000, start); | 1762 EXPECT_EQ(0x20F0000, start); |
| 1622 | 1763 |
| 1623 // We should be able to Read based on the results of GetAvailableRange. | 1764 // We should be able to Read based on the results of GetAvailableRange. |
| 1624 start = -1; | 1765 start = -1; |
| 1625 rv = entry->GetAvailableRange(0x2100000, kSize, &start, cb.callback()); | 1766 EXPECT_EQ(0, GetAvailableRange(entry, 0x2100000, kSize, &start)); |
| 1626 EXPECT_EQ(0, cb.GetResult(rv)); | 1767 //rv = entry->GetAvailableRange(0x2100000, kSize, &start, cb.callback()); |
| 1627 rv = entry->ReadSparseData(start, buf, kSize, cb.callback()); | 1768 //EXPECT_EQ(0, cb.GetResult(rv)); |
| 1628 EXPECT_EQ(0, cb.GetResult(rv)); | 1769 EXPECT_EQ(0, ReadSparseData(entry, start, buf, kSize)); |
| 1770 //rv = entry->ReadSparseData(start, buf, kSize, cb.callback()); |
| 1771 //EXPECT_EQ(0, cb.GetResult(rv)); |
| 1629 | 1772 |
| 1630 start = 0; | 1773 start = 0; |
| 1631 rv = entry->GetAvailableRange(0x20F2000, kSize, &start, cb.callback()); | 1774 EXPECT_EQ(0x2000, GetAvailableRange(entry, 0x20F2000, kSize, &start)); |
| 1632 EXPECT_EQ(0x2000, cb.GetResult(rv)); | 1775 //rv = entry->GetAvailableRange(0x20F2000, kSize, &start, cb.callback()); |
| 1776 //EXPECT_EQ(0x2000, cb.GetResult(rv)); |
| 1633 EXPECT_EQ(0x20F2000, start); | 1777 EXPECT_EQ(0x20F2000, start); |
| 1634 EXPECT_EQ(0x2000, ReadSparseData(entry, start, buf, kSize)); | 1778 EXPECT_EQ(0x2000, ReadSparseData(entry, start, buf, kSize)); |
| 1635 | 1779 |
| 1636 // Make sure that we respect the |len| argument. | 1780 // Make sure that we respect the |len| argument. |
| 1637 start = 0; | 1781 start = 0; |
| 1638 rv = entry->GetAvailableRange( | 1782 EXPECT_EQ(1, GetAvailableRange(entry, 0x20F0001 - kSize, kSize, &start)); |
| 1639 0x20F0001 - kSize, kSize, &start, cb.callback()); | 1783 //rv = entry->GetAvailableRange(0x20F0001 - kSize, kSize, &start, |
| 1640 EXPECT_EQ(1, cb.GetResult(rv)); | 1784 // cb.callback()); |
| 1785 //EXPECT_EQ(1, cb.GetResult(rv)); |
| 1641 EXPECT_EQ(0x20F0000, start); | 1786 EXPECT_EQ(0x20F0000, start); |
| 1642 | 1787 |
| 1643 entry->Close(); | 1788 entry->Close(); |
| 1644 } | 1789 } |
| 1645 | 1790 |
| 1646 TEST_F(DiskCacheEntryTest, GetAvailableRange) { | 1791 TEST_F(DiskCacheEntryTest, GetAvailableRange) { |
| 1647 InitCache(); | 1792 InitCache(); |
| 1648 GetAvailableRange(); | 1793 SparseGetAvailableRange(); |
| 1794 } |
| 1795 |
| 1796 TEST_F(DiskCacheEntryTest, V3GetAvailableRange) { |
| 1797 UseVersion3(); |
| 1798 InitCache(); |
| 1799 SparseGetAvailableRange(); |
| 1649 } | 1800 } |
| 1650 | 1801 |
| 1651 TEST_F(DiskCacheEntryTest, MemoryOnlyGetAvailableRange) { | 1802 TEST_F(DiskCacheEntryTest, MemoryOnlyGetAvailableRange) { |
| 1652 SetMemoryOnlyMode(); | 1803 SetMemoryOnlyMode(); |
| 1653 InitCache(); | 1804 InitCache(); |
| 1654 GetAvailableRange(); | 1805 SparseGetAvailableRange(); |
| 1655 } | 1806 } |
| 1656 | 1807 |
| 1657 void DiskCacheEntryTest::CouldBeSparse() { | 1808 void DiskCacheEntryTest::CouldBeSparse() { |
| 1658 std::string key("the first key"); | 1809 std::string key("the first key"); |
| 1659 disk_cache::Entry* entry; | 1810 disk_cache::Entry* entry; |
| 1660 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 1811 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 1661 | 1812 |
| 1662 const int kSize = 16 * 1024; | 1813 const int kSize = 16 * 1024; |
| 1663 scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kSize)); | 1814 scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kSize)); |
| 1664 CacheTestFillBuffer(buf->data(), kSize, false); | 1815 CacheTestFillBuffer(buf->data(), kSize, false); |
| 1665 | 1816 |
| 1666 // Write at offset 0x20F0000 (33 MB - 64 KB). | 1817 // Write at offset 0x20F0000 (33 MB - 64 KB). |
| 1667 EXPECT_EQ(kSize, WriteSparseData(entry, 0x20F0000, buf, kSize)); | 1818 EXPECT_EQ(kSize, WriteSparseData(entry, 0x20F0000, buf, kSize)); |
| 1668 | 1819 |
| 1669 EXPECT_TRUE(entry->CouldBeSparse()); | 1820 EXPECT_TRUE(entry->CouldBeSparse()); |
| 1670 entry->Close(); | 1821 entry->Close(); |
| 1822 WaitForEntryToClose(key); |
| 1671 | 1823 |
| 1672 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); | 1824 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 1673 EXPECT_TRUE(entry->CouldBeSparse()); | 1825 EXPECT_TRUE(entry->CouldBeSparse()); |
| 1674 entry->Close(); | 1826 entry->Close(); |
| 1827 WaitForEntryToClose(key); |
| 1675 | 1828 |
| 1676 // Now verify a regular entry. | 1829 // Now verify a regular entry. |
| 1677 key.assign("another key"); | 1830 key.assign("another key"); |
| 1678 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 1831 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 1679 EXPECT_FALSE(entry->CouldBeSparse()); | 1832 EXPECT_FALSE(entry->CouldBeSparse()); |
| 1680 | 1833 |
| 1681 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buf, kSize, false)); | 1834 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buf.get(), kSize, false)); |
| 1682 EXPECT_EQ(kSize, WriteData(entry, 1, 0, buf, kSize, false)); | 1835 EXPECT_EQ(kSize, WriteData(entry, 1, 0, buf.get(), kSize, false)); |
| 1683 EXPECT_EQ(kSize, WriteData(entry, 2, 0, buf, kSize, false)); | 1836 EXPECT_EQ(kSize, WriteData(entry, 2, 0, buf.get(), kSize, false)); |
| 1684 | 1837 |
| 1685 EXPECT_FALSE(entry->CouldBeSparse()); | 1838 EXPECT_FALSE(entry->CouldBeSparse()); |
| 1686 entry->Close(); | 1839 entry->Close(); |
| 1840 WaitForEntryToClose(key); |
| 1687 | 1841 |
| 1688 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); | 1842 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 1689 EXPECT_FALSE(entry->CouldBeSparse()); | 1843 EXPECT_FALSE(entry->CouldBeSparse()); |
| 1690 entry->Close(); | 1844 entry->Close(); |
| 1691 } | 1845 } |
| 1692 | 1846 |
| 1693 TEST_F(DiskCacheEntryTest, CouldBeSparse) { | 1847 TEST_F(DiskCacheEntryTest, CouldBeSparse) { |
| 1694 InitCache(); | 1848 InitCache(); |
| 1695 CouldBeSparse(); | 1849 CouldBeSparse(); |
| 1696 } | 1850 } |
| 1697 | 1851 |
| 1852 TEST_F(DiskCacheEntryTest, V3CouldBeSparse) { |
| 1853 UseVersion3(); |
| 1854 InitCache(); |
| 1855 CouldBeSparse(); |
| 1856 } |
| 1857 |
| 1698 TEST_F(DiskCacheEntryTest, MemoryCouldBeSparse) { | 1858 TEST_F(DiskCacheEntryTest, MemoryCouldBeSparse) { |
| 1699 SetMemoryOnlyMode(); | 1859 SetMemoryOnlyMode(); |
| 1700 InitCache(); | 1860 InitCache(); |
| 1701 CouldBeSparse(); | 1861 CouldBeSparse(); |
| 1702 } | 1862 } |
| 1703 | 1863 |
| 1704 TEST_F(DiskCacheEntryTest, MemoryOnlyMisalignedSparseIO) { | 1864 TEST_F(DiskCacheEntryTest, MemoryOnlyMisalignedSparseIO) { |
| 1705 SetMemoryOnlyMode(); | 1865 SetMemoryOnlyMode(); |
| 1706 InitCache(); | 1866 InitCache(); |
| 1707 | 1867 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1738 | 1898 |
| 1739 const int kSize = 8192; | 1899 const int kSize = 8192; |
| 1740 scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kSize)); | 1900 scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kSize)); |
| 1741 CacheTestFillBuffer(buf->data(), kSize, false); | 1901 CacheTestFillBuffer(buf->data(), kSize, false); |
| 1742 | 1902 |
| 1743 disk_cache::Entry* entry; | 1903 disk_cache::Entry* entry; |
| 1744 std::string key("the first key"); | 1904 std::string key("the first key"); |
| 1745 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 1905 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 1746 | 1906 |
| 1747 // Writes in the middle of an entry. | 1907 // Writes in the middle of an entry. |
| 1748 EXPECT_EQ(1024, entry->WriteSparseData( | 1908 EXPECT_EQ(1024, entry->WriteSparseData(0, buf, 1024, |
| 1749 0, buf, 1024, net::CompletionCallback())); | 1909 net::CompletionCallback())); |
| 1750 EXPECT_EQ(1024, entry->WriteSparseData( | 1910 EXPECT_EQ(1024, entry->WriteSparseData(5120, buf, 1024, |
| 1751 5120, buf, 1024, net::CompletionCallback())); | 1911 net::CompletionCallback())); |
| 1752 EXPECT_EQ(1024, entry->WriteSparseData( | 1912 EXPECT_EQ(1024, entry->WriteSparseData(10000, buf, 1024, |
| 1753 10000, buf, 1024, net::CompletionCallback())); | 1913 net::CompletionCallback())); |
| 1754 | 1914 |
| 1755 // Writes in the middle of an entry and spans 2 child entries. | 1915 // Writes in the middle of an entry and spans 2 child entries. |
| 1756 EXPECT_EQ(8192, entry->WriteSparseData( | 1916 EXPECT_EQ(8192, entry->WriteSparseData(50000, buf, 8192, |
| 1757 50000, buf, 8192, net::CompletionCallback())); | 1917 net::CompletionCallback())); |
| 1758 | 1918 |
| 1759 int64 start; | 1919 int64 start; |
| 1760 net::TestCompletionCallback cb; | 1920 net::TestCompletionCallback cb; |
| 1761 // Test that we stop at a discontinuous child at the second block. | 1921 // Test that we stop at a discontinuous child at the second block. |
| 1762 int rv = entry->GetAvailableRange(0, 10000, &start, cb.callback()); | 1922 int rv = entry->GetAvailableRange(0, 10000, &start, cb.callback()); |
| 1763 EXPECT_EQ(1024, cb.GetResult(rv)); | 1923 EXPECT_EQ(1024, cb.GetResult(rv)); |
| 1764 EXPECT_EQ(0, start); | 1924 EXPECT_EQ(0, start); |
| 1765 | 1925 |
| 1766 // Test that number of bytes is reported correctly when we start from the | 1926 // Test that number of bytes is reported correctly when we start from the |
| 1767 // middle of a filled region. | 1927 // middle of a filled region. |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1823 else | 1983 else |
| 1824 EXPECT_EQ(3, cache_->GetEntryCount()); | 1984 EXPECT_EQ(3, cache_->GetEntryCount()); |
| 1825 } | 1985 } |
| 1826 | 1986 |
| 1827 TEST_F(DiskCacheEntryTest, UpdateSparseEntry) { | 1987 TEST_F(DiskCacheEntryTest, UpdateSparseEntry) { |
| 1828 SetCacheType(net::MEDIA_CACHE); | 1988 SetCacheType(net::MEDIA_CACHE); |
| 1829 InitCache(); | 1989 InitCache(); |
| 1830 UpdateSparseEntry(); | 1990 UpdateSparseEntry(); |
| 1831 } | 1991 } |
| 1832 | 1992 |
| 1993 TEST_F(DiskCacheEntryTest, V3UpdateSparseEntry) { |
| 1994 UseVersion3(); |
| 1995 SetCacheType(net::MEDIA_CACHE); |
| 1996 InitCache(); |
| 1997 UpdateSparseEntry(); |
| 1998 } |
| 1999 |
| 1833 TEST_F(DiskCacheEntryTest, MemoryOnlyUpdateSparseEntry) { | 2000 TEST_F(DiskCacheEntryTest, MemoryOnlyUpdateSparseEntry) { |
| 1834 SetMemoryOnlyMode(); | 2001 SetMemoryOnlyMode(); |
| 1835 SetCacheType(net::MEDIA_CACHE); | 2002 SetCacheType(net::MEDIA_CACHE); |
| 1836 InitCache(); | 2003 InitCache(); |
| 1837 UpdateSparseEntry(); | 2004 UpdateSparseEntry(); |
| 1838 } | 2005 } |
| 1839 | 2006 |
| 1840 void DiskCacheEntryTest::DoomSparseEntry() { | 2007 void DiskCacheEntryTest::DoomSparseEntry() { |
| 1841 std::string key1("the first key"); | 2008 std::string key1("the first key"); |
| 1842 std::string key2("the second key"); | 2009 std::string key2("the second key"); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1864 | 2031 |
| 1865 if (memory_only_) | 2032 if (memory_only_) |
| 1866 EXPECT_EQ(2, cache_->GetEntryCount()); | 2033 EXPECT_EQ(2, cache_->GetEntryCount()); |
| 1867 else | 2034 else |
| 1868 EXPECT_EQ(15, cache_->GetEntryCount()); | 2035 EXPECT_EQ(15, cache_->GetEntryCount()); |
| 1869 | 2036 |
| 1870 // Doom the first entry while it's still open. | 2037 // Doom the first entry while it's still open. |
| 1871 entry1->Doom(); | 2038 entry1->Doom(); |
| 1872 entry1->Close(); | 2039 entry1->Close(); |
| 1873 entry2->Close(); | 2040 entry2->Close(); |
| 2041 WaitForEntryToClose(key1); |
| 2042 WaitForEntryToClose(key2); |
| 1874 | 2043 |
| 1875 // Doom the second entry after it's fully saved. | 2044 // Doom the second entry after it's fully saved. |
| 1876 EXPECT_EQ(net::OK, DoomEntry(key2)); | 2045 EXPECT_EQ(net::OK, DoomEntry(key2)); |
| 1877 | 2046 |
| 1878 // Make sure we do all needed work. This may fail for entry2 if between Close | 2047 // Make sure we do all needed work. This may fail for entry2 if between Close |
| 1879 // and DoomEntry the system decides to remove all traces of the file from the | 2048 // and DoomEntry the system decides to remove all traces of the file from the |
| 1880 // system cache so we don't see that there is pending IO. | 2049 // system cache so we don't see that there is pending IO. |
| 1881 MessageLoop::current()->RunUntilIdle(); | 2050 WaitForEntryToClose(key2); |
| 1882 | 2051 |
| 1883 if (memory_only_) { | 2052 if (memory_only_) { |
| 1884 EXPECT_EQ(0, cache_->GetEntryCount()); | 2053 EXPECT_EQ(0, cache_->GetEntryCount()); |
| 1885 } else { | 2054 } else { |
| 1886 if (5 == cache_->GetEntryCount()) { | 2055 if (5 == cache_->GetEntryCount()) { |
| 1887 // Most likely we are waiting for the result of reading the sparse info | 2056 // Most likely we are waiting for the result of reading the sparse info |
| 1888 // (it's always async on Posix so it is easy to miss). Unfortunately we | 2057 // (it's always async on Posix so it is easy to miss). Unfortunately we |
| 1889 // don't have any signal to watch for so we can only wait. | 2058 // don't have any signal to watch for so we can only wait. |
| 1890 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(500)); | 2059 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(500)); |
| 1891 MessageLoop::current()->RunUntilIdle(); | 2060 FlushQueueForTest(); |
| 1892 } | 2061 } |
| 1893 EXPECT_EQ(0, cache_->GetEntryCount()); | 2062 EXPECT_EQ(0, cache_->GetEntryCount()); |
| 1894 } | 2063 } |
| 1895 } | 2064 } |
| 1896 | 2065 |
| 1897 TEST_F(DiskCacheEntryTest, DoomSparseEntry) { | 2066 TEST_F(DiskCacheEntryTest, DoomSparseEntry) { |
| 1898 UseCurrentThread(); | 2067 UseCurrentThread(); |
| 1899 InitCache(); | 2068 InitCache(); |
| 1900 DoomSparseEntry(); | 2069 DoomSparseEntry(); |
| 1901 } | 2070 } |
| 1902 | 2071 |
| 2072 TEST_F(DiskCacheEntryTest, V3DoomSparseEntry) { |
| 2073 UseVersion3(); |
| 2074 UseCurrentThread(); |
| 2075 InitCache(); |
| 2076 DoomSparseEntry(); |
| 2077 } |
| 2078 |
| 1903 TEST_F(DiskCacheEntryTest, MemoryOnlyDoomSparseEntry) { | 2079 TEST_F(DiskCacheEntryTest, MemoryOnlyDoomSparseEntry) { |
| 1904 SetMemoryOnlyMode(); | 2080 SetMemoryOnlyMode(); |
| 1905 InitCache(); | 2081 InitCache(); |
| 1906 DoomSparseEntry(); | 2082 DoomSparseEntry(); |
| 1907 } | 2083 } |
| 1908 | 2084 |
| 1909 // A CompletionCallback wrapper that deletes the cache from within the callback. | 2085 // A CompletionCallback wrapper that deletes the cache from within the callback. |
| 1910 // The way a CompletionCallback works means that all tasks (even new ones) | 2086 // The way a CompletionCallback works means that all tasks (even new ones) |
| 1911 // are executed by the message loop before returning to the caller so the only | 2087 // are executed by the message loop before returning to the caller so the only |
| 1912 // way to simulate a race is to execute what we want on the callback. | 2088 // way to simulate a race is to execute what we want on the callback. |
| 1913 class SparseTestCompletionCallback: public net::TestCompletionCallback { | 2089 class SparseTestCompletionCallback: public net::TestCompletionCallback { |
| 1914 public: | 2090 public: |
| 1915 explicit SparseTestCompletionCallback(disk_cache::Backend* cache) | 2091 explicit SparseTestCompletionCallback(disk_cache::Backend* cache) |
| 1916 : cache_(cache) { | 2092 : cache_(cache) { |
| 1917 } | 2093 } |
| 1918 | 2094 |
| 1919 private: | 2095 private: |
| 1920 virtual void SetResult(int result) OVERRIDE { | 2096 virtual void SetResult(int result) OVERRIDE { |
| 1921 delete cache_; | 2097 delete cache_; |
| 1922 TestCompletionCallback::SetResult(result); | 2098 TestCompletionCallback::SetResult(result); |
| 1923 } | 2099 } |
| 1924 | 2100 |
| 1925 disk_cache::Backend* cache_; | 2101 disk_cache::Backend* cache_; |
| 1926 DISALLOW_COPY_AND_ASSIGN(SparseTestCompletionCallback); | 2102 DISALLOW_COPY_AND_ASSIGN(SparseTestCompletionCallback); |
| 1927 }; | 2103 }; |
| 1928 | 2104 |
| 1929 // Tests that we don't crash when the backend is deleted while we are working | 2105 // Tests that we don't crash when the backend is deleted while we are working |
| 1930 // deleting the sub-entries of a sparse entry. | 2106 // deleting the sub-entries of a sparse entry. |
| 1931 TEST_F(DiskCacheEntryTest, DoomSparseEntry2) { | 2107 void DiskCacheEntryTest::DoomSparseEntry2() { |
| 1932 UseCurrentThread(); | 2108 UseCurrentThread(); |
| 2109 ForceRandomCacheDir(); |
| 1933 InitCache(); | 2110 InitCache(); |
| 1934 std::string key("the key"); | 2111 std::string key("the key"); |
| 1935 disk_cache::Entry* entry; | 2112 disk_cache::Entry* entry; |
| 1936 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 2113 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 1937 | 2114 |
| 1938 const int kSize = 4 * 1024; | 2115 const int kSize = 4 * 1024; |
| 1939 scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kSize)); | 2116 scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kSize)); |
| 1940 CacheTestFillBuffer(buf->data(), kSize, false); | 2117 CacheTestFillBuffer(buf->data(), kSize, false); |
| 1941 | 2118 |
| 1942 int64 offset = 1024; | 2119 int64 offset = 1024; |
| 1943 // Write to a bunch of ranges. | 2120 // Write to a bunch of ranges. |
| 1944 for (int i = 0; i < 12; i++) { | 2121 for (int i = 0; i < 12; i++) { |
| 1945 EXPECT_EQ(kSize, entry->WriteSparseData(offset, buf, kSize, | 2122 EXPECT_EQ(kSize, entry->WriteSparseData(offset, buf, kSize, |
| 1946 net::CompletionCallback())); | 2123 net::CompletionCallback())); |
| 1947 offset *= 4; | 2124 offset *= 4; |
| 1948 } | 2125 } |
| 1949 EXPECT_EQ(9, cache_->GetEntryCount()); | 2126 EXPECT_EQ(9, cache_->GetEntryCount()); |
| 1950 | 2127 |
| 1951 entry->Close(); | 2128 entry->Close(); |
| 2129 WaitForEntryToClose(key); |
| 2130 |
| 1952 SparseTestCompletionCallback cb(cache_); | 2131 SparseTestCompletionCallback cb(cache_); |
| 1953 int rv = cache_->DoomEntry(key, cb.callback()); | 2132 int rv = cache_->DoomEntry(key, cb.callback()); |
| 1954 EXPECT_EQ(net::ERR_IO_PENDING, rv); | 2133 EXPECT_EQ(net::ERR_IO_PENDING, rv); |
| 1955 EXPECT_EQ(net::OK, cb.WaitForResult()); | 2134 EXPECT_EQ(net::OK, cb.WaitForResult()); |
| 1956 | 2135 |
| 1957 // TearDown will attempt to delete the cache_. | 2136 // TearDown will attempt to delete the cache. |
| 1958 cache_ = NULL; | 2137 cache_ = NULL; |
| 2138 cache_impl_ = NULL; |
| 2139 cache_impl_v3_ = NULL; |
| 2140 } |
| 2141 |
| 2142 TEST_F(DiskCacheEntryTest, DoomSparseEntry2) { |
| 2143 DoomSparseEntry2(); |
| 2144 } |
| 2145 |
| 2146 TEST_F(DiskCacheEntryTest, V3DoomSparseEntry2) { |
| 2147 UseVersion3(); |
| 2148 DoomSparseEntry2(); |
| 1959 } | 2149 } |
| 1960 | 2150 |
| 1961 void DiskCacheEntryTest::PartialSparseEntry() { | 2151 void DiskCacheEntryTest::PartialSparseEntry() { |
| 1962 std::string key("the first key"); | 2152 std::string key("the first key"); |
| 1963 disk_cache::Entry* entry; | 2153 disk_cache::Entry* entry; |
| 1964 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 2154 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 1965 | 2155 |
| 1966 // We should be able to deal with IO that is not aligned to the block size | 2156 // We should be able to deal with IO that is not aligned to the block size |
| 1967 // of a sparse entry, at least to write a big range without leaving holes. | 2157 // of a sparse entry, at least to write a big range without leaving holes. |
| 1968 const int kSize = 4 * 1024; | 2158 const int kSize = 4 * 1024; |
| 1969 const int kSmallSize = 128; | 2159 const int kSmallSize = 128; |
| 1970 scoped_refptr<net::IOBuffer> buf1(new net::IOBuffer(kSize)); | 2160 scoped_refptr<net::IOBuffer> buf1(new net::IOBuffer(kSize)); |
| 1971 CacheTestFillBuffer(buf1->data(), kSize, false); | 2161 CacheTestFillBuffer(buf1->data(), kSize, false); |
| 1972 | 2162 |
| 1973 // The first write is just to extend the entry. The third write occupies | 2163 // The first write is just to extend the entry. The third write occupies |
| 1974 // a 1KB block partially, it may not be written internally depending on the | 2164 // a 1KB block partially, it may not be written internally depending on the |
| 1975 // implementation. | 2165 // implementation. |
| 1976 EXPECT_EQ(kSize, WriteSparseData(entry, 20000, buf1, kSize)); | 2166 EXPECT_EQ(kSize, WriteSparseData(entry, 20000, buf1, kSize)); |
| 1977 EXPECT_EQ(kSize, WriteSparseData(entry, 500, buf1, kSize)); | 2167 EXPECT_EQ(kSize, WriteSparseData(entry, 500, buf1, kSize)); |
| 1978 EXPECT_EQ(kSmallSize, WriteSparseData(entry, 1080321, buf1, kSmallSize)); | 2168 EXPECT_EQ(kSmallSize, WriteSparseData(entry, 1080321, buf1, kSmallSize)); |
| 1979 entry->Close(); | 2169 entry->Close(); |
| 2170 WaitForEntryToClose(key); |
| 1980 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); | 2171 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 1981 | 2172 |
| 1982 scoped_refptr<net::IOBuffer> buf2(new net::IOBuffer(kSize)); | 2173 scoped_refptr<net::IOBuffer> buf2(new net::IOBuffer(kSize)); |
| 1983 memset(buf2->data(), 0, kSize); | 2174 memset(buf2->data(), 0, kSize); |
| 1984 EXPECT_EQ(0, ReadSparseData(entry, 8000, buf2, kSize)); | 2175 EXPECT_EQ(0, ReadSparseData(entry, 8000, buf2, kSize)); |
| 1985 | 2176 |
| 1986 EXPECT_EQ(500, ReadSparseData(entry, kSize, buf2, kSize)); | 2177 EXPECT_EQ(500, ReadSparseData(entry, kSize, buf2, kSize)); |
| 1987 EXPECT_EQ(0, memcmp(buf2->data(), buf1->data() + kSize - 500, 500)); | 2178 EXPECT_EQ(0, memcmp(buf2->data(), buf1->data() + kSize - 500, 500)); |
| 1988 EXPECT_EQ(0, ReadSparseData(entry, 0, buf2, kSize)); | 2179 EXPECT_EQ(0, ReadSparseData(entry, 0, buf2, kSize)); |
| 1989 | 2180 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2040 EXPECT_EQ(0, memcmp(buf2->data() + 500, buf1->data(), kSize - 500)); | 2231 EXPECT_EQ(0, memcmp(buf2->data() + 500, buf1->data(), kSize - 500)); |
| 2041 | 2232 |
| 2042 entry->Close(); | 2233 entry->Close(); |
| 2043 } | 2234 } |
| 2044 | 2235 |
| 2045 TEST_F(DiskCacheEntryTest, PartialSparseEntry) { | 2236 TEST_F(DiskCacheEntryTest, PartialSparseEntry) { |
| 2046 InitCache(); | 2237 InitCache(); |
| 2047 PartialSparseEntry(); | 2238 PartialSparseEntry(); |
| 2048 } | 2239 } |
| 2049 | 2240 |
| 2241 TEST_F(DiskCacheEntryTest, V3PartialSparseEntry) { |
| 2242 UseVersion3(); |
| 2243 InitCache(); |
| 2244 PartialSparseEntry(); |
| 2245 } |
| 2246 |
| 2050 TEST_F(DiskCacheEntryTest, MemoryPartialSparseEntry) { | 2247 TEST_F(DiskCacheEntryTest, MemoryPartialSparseEntry) { |
| 2051 SetMemoryOnlyMode(); | 2248 SetMemoryOnlyMode(); |
| 2052 InitCache(); | 2249 InitCache(); |
| 2053 PartialSparseEntry(); | 2250 PartialSparseEntry(); |
| 2054 } | 2251 } |
| 2055 | 2252 |
| 2056 // Tests that corrupt sparse children are removed automatically. | 2253 // Tests that corrupt sparse children are removed automatically. |
| 2057 TEST_F(DiskCacheEntryTest, CleanupSparseEntry) { | 2254 void DiskCacheEntryTest::CleanupSparseEntry() { |
| 2058 InitCache(); | 2255 InitCache(); |
| 2256 SetNoBuffering(); |
| 2059 std::string key("the first key"); | 2257 std::string key("the first key"); |
| 2060 disk_cache::Entry* entry; | 2258 disk_cache::Entry* entry; |
| 2061 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 2259 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 2062 | 2260 |
| 2063 const int kSize = 4 * 1024; | 2261 const int kSize = 4 * 1024; |
| 2064 scoped_refptr<net::IOBuffer> buf1(new net::IOBuffer(kSize)); | 2262 scoped_refptr<net::IOBuffer> buf1(new net::IOBuffer(kSize)); |
| 2065 CacheTestFillBuffer(buf1->data(), kSize, false); | 2263 CacheTestFillBuffer(buf1->data(), kSize, false); |
| 2066 | 2264 |
| 2067 const int k1Meg = 1024 * 1024; | 2265 const int k1Meg = 1024 * 1024; |
| 2068 EXPECT_EQ(kSize, WriteSparseData(entry, 8192, buf1, kSize)); | 2266 EXPECT_EQ(kSize, WriteSparseData(entry, 8192, buf1, kSize)); |
| 2267 AddDelayForTest(70); |
| 2069 EXPECT_EQ(kSize, WriteSparseData(entry, k1Meg + 8192, buf1, kSize)); | 2268 EXPECT_EQ(kSize, WriteSparseData(entry, k1Meg + 8192, buf1, kSize)); |
| 2269 AddDelayForTest(70); |
| 2070 EXPECT_EQ(kSize, WriteSparseData(entry, 2 * k1Meg + 8192, buf1, kSize)); | 2270 EXPECT_EQ(kSize, WriteSparseData(entry, 2 * k1Meg + 8192, buf1, kSize)); |
| 2271 AddDelayForTest(70); |
| 2071 entry->Close(); | 2272 entry->Close(); |
| 2072 EXPECT_EQ(4, cache_->GetEntryCount()); | 2273 EXPECT_EQ(4, cache_->GetEntryCount()); |
| 2073 | 2274 |
| 2074 void* iter = NULL; | 2275 void* iter = NULL; |
| 2075 int count = 0; | 2276 int count = 0; |
| 2076 std::string child_key[2]; | 2277 std::string child_key[2]; |
| 2077 while (OpenNextEntry(&iter, &entry) == net::OK) { | 2278 while (OpenNextEntry(&iter, &entry) == net::OK) { |
| 2078 ASSERT_TRUE(entry != NULL); | 2279 ASSERT_TRUE(entry != NULL); |
| 2079 // Writing to an entry will alter the LRU list and invalidate the iterator. | 2280 // Writing to an entry will alter the LRU list and invalidate the iterator. |
| 2080 if (entry->GetKey() != key && count < 2) | 2281 if (entry->GetKey() != key && count < 2) |
| 2081 child_key[count++] = entry->GetKey(); | 2282 child_key[count++] = entry->GetKey(); |
| 2082 entry->Close(); | 2283 entry->Close(); |
| 2083 } | 2284 } |
| 2084 for (int i = 0; i < 2; i++) { | 2285 for (int i = 0; i < 2; i++) { |
| 2085 ASSERT_EQ(net::OK, OpenEntry(child_key[i], &entry)); | 2286 ASSERT_EQ(net::OK, OpenEntry(child_key[i], &entry)); |
| 2086 // Overwrite the header's magic and signature. | 2287 // Overwrite the header's magic and signature. |
| 2087 EXPECT_EQ(12, WriteData(entry, 2, 0, buf1, 12, false)); | 2288 EXPECT_EQ(12, WriteData(entry, 2, 0, buf1.get(), 12, false)); |
| 2088 entry->Close(); | 2289 entry->Close(); |
| 2089 } | 2290 } |
| 2090 | 2291 |
| 2091 EXPECT_EQ(4, cache_->GetEntryCount()); | 2292 EXPECT_EQ(4, cache_->GetEntryCount()); |
| 2092 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); | 2293 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 2093 | 2294 |
| 2094 // Two children should be gone. One while reading and one while writing. | 2295 // Two children should be gone. One while reading and one while writing. |
| 2095 EXPECT_EQ(0, ReadSparseData(entry, 2 * k1Meg + 8192, buf1, kSize)); | 2296 EXPECT_EQ(0, ReadSparseData(entry, 2 * k1Meg + 8192, buf1, kSize)); |
| 2096 EXPECT_EQ(kSize, WriteSparseData(entry, k1Meg + 16384, buf1, kSize)); | 2297 EXPECT_EQ(kSize, WriteSparseData(entry, k1Meg + 16384, buf1, kSize)); |
| 2097 EXPECT_EQ(0, ReadSparseData(entry, k1Meg + 8192, buf1, kSize)); | 2298 EXPECT_EQ(0, ReadSparseData(entry, k1Meg + 8192, buf1, kSize)); |
| 2098 | 2299 |
| 2099 // We never touched this one. | 2300 // We never touched this one. |
| 2100 EXPECT_EQ(kSize, ReadSparseData(entry, 8192, buf1, kSize)); | 2301 EXPECT_EQ(kSize, ReadSparseData(entry, 8192, buf1, kSize)); |
| 2101 entry->Close(); | 2302 entry->Close(); |
| 2102 | 2303 |
| 2103 // We re-created one of the corrupt children. | 2304 // We re-created one of the corrupt children. |
| 2104 EXPECT_EQ(3, cache_->GetEntryCount()); | 2305 EXPECT_EQ(3, cache_->GetEntryCount()); |
| 2105 } | 2306 } |
| 2106 | 2307 |
| 2107 TEST_F(DiskCacheEntryTest, CancelSparseIO) { | 2308 TEST_F(DiskCacheEntryTest, CleanupSparseEntry) { |
| 2108 UseCurrentThread(); | 2309 CleanupSparseEntry(); |
| 2310 } |
| 2311 |
| 2312 TEST_F(DiskCacheEntryTest, V3CleanupSparseEntry) { |
| 2313 UseVersion3(); |
| 2314 CleanupSparseEntry(); |
| 2315 } |
| 2316 |
| 2317 void DiskCacheEntryTest::CancelSparseIO() { |
| 2109 InitCache(); | 2318 InitCache(); |
| 2319 SetNoBuffering(); |
| 2110 std::string key("the first key"); | 2320 std::string key("the first key"); |
| 2111 disk_cache::Entry* entry; | 2321 disk_cache::Entry* entry; |
| 2112 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 2322 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 2113 | 2323 |
| 2114 const int kSize = 40 * 1024; | 2324 const int kSize = 40 * 1024; |
| 2115 scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kSize)); | 2325 scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kSize)); |
| 2116 CacheTestFillBuffer(buf->data(), kSize, false); | 2326 CacheTestFillBuffer(buf->data(), kSize, false); |
| 2117 | 2327 |
| 2118 // This will open and write two "real" entries. | 2328 // This will open and write two "real" entries. |
| 2119 net::TestCompletionCallback cb1, cb2, cb3, cb4, cb5; | 2329 net::TestCompletionCallback cb1, cb2, cb3, cb4, cb5; |
| 2120 int rv = entry->WriteSparseData( | 2330 int rv = entry->WriteSparseData(1024 * 1024 - kSize / 2, buf, kSize, |
| 2121 1024 * 1024 - 4096, buf, kSize, cb1.callback()); | 2331 cb1.callback()); |
| 2122 EXPECT_EQ(net::ERR_IO_PENDING, rv); | 2332 EXPECT_EQ(net::ERR_IO_PENDING, rv); |
| 2123 | 2333 |
| 2124 int64 offset = 0; | 2334 int64 offset = 0; |
| 2125 rv = entry->GetAvailableRange(offset, kSize, &offset, cb5.callback()); | 2335 rv = entry->GetAvailableRange(offset, kSize, &offset, cb5.callback()); |
| 2126 rv = cb5.GetResult(rv); | 2336 rv = cb5.GetResult(rv); |
| 2127 if (!cb1.have_result()) { | 2337 if (!cb1.have_result()) { |
| 2128 // We may or may not have finished writing to the entry. If we have not, | 2338 // We may or may not have finished writing to the entry. If we have not, |
| 2129 // we cannot start another operation at this time. | 2339 // we cannot start another operation at this time. |
| 2130 EXPECT_EQ(net::ERR_CACHE_OPERATION_NOT_SUPPORTED, rv); | 2340 EXPECT_EQ(net::ERR_CACHE_OPERATION_NOT_SUPPORTED, rv); |
| 2131 } | 2341 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2142 entry->ReadSparseData(offset, buf, kSize, | 2352 entry->ReadSparseData(offset, buf, kSize, |
| 2143 net::CompletionCallback())); | 2353 net::CompletionCallback())); |
| 2144 EXPECT_EQ(net::ERR_CACHE_OPERATION_NOT_SUPPORTED, | 2354 EXPECT_EQ(net::ERR_CACHE_OPERATION_NOT_SUPPORTED, |
| 2145 entry->WriteSparseData(offset, buf, kSize, | 2355 entry->WriteSparseData(offset, buf, kSize, |
| 2146 net::CompletionCallback())); | 2356 net::CompletionCallback())); |
| 2147 } | 2357 } |
| 2148 | 2358 |
| 2149 // Now see if we receive all notifications. Note that we should not be able | 2359 // Now see if we receive all notifications. Note that we should not be able |
| 2150 // to write everything (unless the timing of the system is really weird). | 2360 // to write everything (unless the timing of the system is really weird). |
| 2151 rv = cb1.WaitForResult(); | 2361 rv = cb1.WaitForResult(); |
| 2152 EXPECT_TRUE(rv == 4096 || rv == kSize); | 2362 EXPECT_TRUE(rv == kSize / 2 || rv == kSize); |
| 2153 EXPECT_EQ(net::OK, cb2.WaitForResult()); | 2363 EXPECT_EQ(net::OK, cb2.WaitForResult()); |
| 2154 EXPECT_EQ(net::OK, cb3.WaitForResult()); | 2364 EXPECT_EQ(net::OK, cb3.WaitForResult()); |
| 2155 EXPECT_EQ(net::OK, cb4.WaitForResult()); | 2365 EXPECT_EQ(net::OK, cb4.WaitForResult()); |
| 2156 | 2366 |
| 2157 rv = entry->GetAvailableRange(offset, kSize, &offset, cb5.callback()); | 2367 rv = entry->GetAvailableRange(offset, kSize, &offset, cb5.callback()); |
| 2158 EXPECT_EQ(0, cb5.GetResult(rv)); | 2368 EXPECT_EQ(0, cb5.GetResult(rv)); |
| 2159 entry->Close(); | 2369 entry->Close(); |
| 2160 } | 2370 } |
| 2161 | 2371 |
| 2372 TEST_F(DiskCacheEntryTest, CancelSparseIO) { |
| 2373 UseCurrentThread(); |
| 2374 CancelSparseIO(); |
| 2375 } |
| 2376 |
| 2377 TEST_F(DiskCacheEntryTest, V3CancelSparseIO) { |
| 2378 UseVersion3(); |
| 2379 CancelSparseIO(); |
| 2380 } |
| 2381 |
| 2382 // Tests a squence of Close + Open + ReadyForSparseIO + ReadSparseData. |
| 2383 void DiskCacheEntryTest::ReadyForSparseIONoCancel() { |
| 2384 InitCache(); |
| 2385 SetNoBuffering(); |
| 2386 std::string key("the key"); |
| 2387 disk_cache::Entry* entry; |
| 2388 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 2389 |
| 2390 const int kSize = 4 * 1024; |
| 2391 scoped_refptr<net::IOBuffer> buf1(new net::IOBuffer(kSize)); |
| 2392 CacheTestFillBuffer(buf1->data(), kSize, false); |
| 2393 EXPECT_EQ(kSize, WriteSparseData(entry, 1024 * 1024 - kSize, buf1, kSize)); |
| 2394 |
| 2395 entry->Close(); |
| 2396 WaitForEntryToClose(key); |
| 2397 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 2398 net::TestCompletionCallback cb; |
| 2399 EXPECT_EQ(net::OK, cb.GetResult(entry->ReadyForSparseIO(cb.callback()))); |
| 2400 EXPECT_EQ(kSize, ReadSparseData(entry, 1024 * 1024 - kSize, buf1, kSize)); |
| 2401 entry->Close(); |
| 2402 } |
| 2403 |
| 2404 TEST_F(DiskCacheEntryTest, ReadyForSparseIONoCancel) { |
| 2405 UseVersion3(); |
| 2406 ReadyForSparseIONoCancel(); |
| 2407 } |
| 2408 |
| 2409 TEST_F(DiskCacheEntryTest, V3ReadyForSparseIONoCancel) { |
| 2410 UseVersion3(); |
| 2411 ReadyForSparseIONoCancel(); |
| 2412 } |
| 2413 |
| 2162 // Tests that we perform sanity checks on an entry's key. Note that there are | 2414 // Tests that we perform sanity checks on an entry's key. Note that there are |
| 2163 // other tests that exercise sanity checks by using saved corrupt files. | 2415 // other tests that exercise sanity checks by using saved corrupt files. |
| 2164 TEST_F(DiskCacheEntryTest, KeySanityCheck) { | 2416 TEST_F(DiskCacheEntryTest, KeySanityCheck) { |
| 2165 UseCurrentThread(); | 2417 UseCurrentThread(); |
| 2166 InitCache(); | 2418 InitCache(); |
| 2167 std::string key("the first key"); | 2419 std::string key("the first key"); |
| 2168 disk_cache::Entry* entry; | 2420 disk_cache::Entry* entry; |
| 2169 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 2421 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 2170 | 2422 |
| 2171 disk_cache::EntryImpl* entry_impl = | 2423 disk_cache::EntryImpl* entry_impl = |
| 2172 static_cast<disk_cache::EntryImpl*>(entry); | 2424 static_cast<disk_cache::EntryImpl*>(entry); |
| 2173 disk_cache::EntryStore* store = entry_impl->entry()->Data(); | 2425 disk_cache::EntryStore* store = entry_impl->entry()->Data(); |
| 2174 | 2426 |
| 2175 // We have reserved space for a short key (one block), let's say that the key | 2427 // We have reserved space for a short key (one block), let's say that the key |
| 2176 // takes more than one block, and remove the NULLs after the actual key. | 2428 // takes more than one block, and remove the NULLs after the actual key. |
| 2177 store->key_len = 800; | 2429 store->key_len = 800; |
| 2178 memset(store->key + key.size(), 'k', sizeof(store->key) - key.size()); | 2430 memset(store->key + key.size(), 'k', sizeof(store->key) - key.size()); |
| 2179 entry_impl->entry()->set_modified(); | 2431 entry_impl->entry()->set_modified(); |
| 2180 entry->Close(); | 2432 entry->Close(); |
| 2181 | 2433 |
| 2182 // We have a corrupt entry. Now reload it. We should NOT read beyond the | 2434 // We have a corrupt entry. Now reload it. We should NOT read beyond the |
| 2183 // allocated buffer here. | 2435 // allocated buffer here. |
| 2184 ASSERT_NE(net::OK, OpenEntry(key, &entry)); | 2436 ASSERT_NE(net::OK, OpenEntry(key, &entry)); |
| 2185 DisableIntegrityCheck(); | 2437 DisableIntegrityCheck(); |
| 2186 } | 2438 } |
| 2187 | 2439 |
| 2188 // The simple cache backend isn't intended to work on Windows, which has very | 2440 // The Simple Cache backend requires a few guarantees from the filesystem like |
| 2189 // different file system guarantees from Linux. | 2441 // atomic renaming of recently open files. Those guarantees are not provided in |
| 2442 // general on Windows. |
| 2190 #if defined(OS_POSIX) | 2443 #if defined(OS_POSIX) |
| 2191 | 2444 |
| 2192 TEST_F(DiskCacheEntryTest, SimpleCacheInternalAsyncIO) { | 2445 TEST_F(DiskCacheEntryTest, SimpleCacheInternalAsyncIO) { |
| 2193 SetSimpleCacheMode(); | 2446 SetSimpleCacheMode(); |
| 2194 InitCache(); | 2447 InitCache(); |
| 2195 InternalAsyncIO(); | 2448 InternalAsyncIO(); |
| 2196 } | 2449 } |
| 2197 | 2450 |
| 2198 TEST_F(DiskCacheEntryTest, SimpleCacheExternalAsyncIO) { | 2451 TEST_F(DiskCacheEntryTest, SimpleCacheExternalAsyncIO) { |
| 2199 SetSimpleCacheMode(); | 2452 SetSimpleCacheMode(); |
| (...skipping 686 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2886 ++expected; | 3139 ++expected; |
| 2887 | 3140 |
| 2888 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); | 3141 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); |
| 2889 EXPECT_EQ(kBufferSize, write_callback.last_result()); | 3142 EXPECT_EQ(kBufferSize, write_callback.last_result()); |
| 2890 EXPECT_EQ(kBufferSize, read_callback.last_result()); | 3143 EXPECT_EQ(kBufferSize, read_callback.last_result()); |
| 2891 EXPECT_EQ(0, memcmp(write_buffer->data(), read_buffer->data(), kBufferSize)); | 3144 EXPECT_EQ(0, memcmp(write_buffer->data(), read_buffer->data(), kBufferSize)); |
| 2892 entry->Close(); | 3145 entry->Close(); |
| 2893 } | 3146 } |
| 2894 | 3147 |
| 2895 #endif // defined(OS_POSIX) | 3148 #endif // defined(OS_POSIX) |
| OLD | NEW |