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

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

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

Powered by Google App Engine
This is Rietveld 408576698