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

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

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