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