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

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

Issue 3167020: Disk cache: Extend the internal buffering performed by each entry... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2006-2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2010 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/platform_thread.h" 6 #include "base/platform_thread.h"
7 #include "base/timer.h" 7 #include "base/timer.h"
8 #include "base/string_util.h" 8 #include "base/string_util.h"
9 #include "net/base/io_buffer.h" 9 #include "net/base/io_buffer.h"
10 #include "net/base/net_errors.h" 10 #include "net/base/net_errors.h"
(...skipping 18 matching lines...) Expand all
29 void ExternalAsyncIO(); 29 void ExternalAsyncIO();
30 void StreamAccess(); 30 void StreamAccess();
31 void GetKey(); 31 void GetKey();
32 void GrowData(); 32 void GrowData();
33 void TruncateData(); 33 void TruncateData();
34 void ZeroLengthIO(); 34 void ZeroLengthIO();
35 void ReuseEntry(int size); 35 void ReuseEntry(int size);
36 void InvalidData(); 36 void InvalidData();
37 void DoomNormalEntry(); 37 void DoomNormalEntry();
38 void DoomedEntry(); 38 void DoomedEntry();
39 void BasicSparseIO(bool async); 39 void BasicSparseIO();
40 void HugeSparseIO(bool async); 40 void HugeSparseIO();
41 void GetAvailableRange(); 41 void GetAvailableRange();
42 void CouldBeSparse(); 42 void CouldBeSparse();
43 void DoomSparseEntry(); 43 void DoomSparseEntry();
44 void PartialSparseEntry(); 44 void PartialSparseEntry();
45 }; 45 };
46 46
47 // We need to support synchronous IO even though it is not a supported operation
48 // from the point of view of the disk cache's public interface, because we use
49 // it internally, not just by a few tests, but as part of the implementation
50 // (see sparse_control.cc, for example).
47 void DiskCacheEntryTest::InternalSyncIO() { 51 void DiskCacheEntryTest::InternalSyncIO() {
48 disk_cache::Entry *entry1 = NULL; 52 disk_cache::Entry* entry = NULL;
49 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry1)); 53 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry));
50 ASSERT_TRUE(NULL != entry1); 54 ASSERT_TRUE(NULL != entry);
51 55
52 const int kSize1 = 10; 56 const int kSize1 = 10;
53 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize1); 57 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize1);
54 CacheTestFillBuffer(buffer1->data(), kSize1, false); 58 CacheTestFillBuffer(buffer1->data(), kSize1, false);
55 EXPECT_EQ(0, entry1->ReadData(0, 0, buffer1, kSize1, NULL)); 59 EXPECT_EQ(0, entry->ReadData(0, 0, buffer1, kSize1, NULL));
56 base::strlcpy(buffer1->data(), "the data", kSize1); 60 base::strlcpy(buffer1->data(), "the data", kSize1);
57 EXPECT_EQ(10, entry1->WriteData(0, 0, buffer1, kSize1, NULL, false)); 61 EXPECT_EQ(10, entry->WriteData(0, 0, buffer1, kSize1, NULL, false));
58 memset(buffer1->data(), 0, kSize1); 62 memset(buffer1->data(), 0, kSize1);
59 EXPECT_EQ(10, entry1->ReadData(0, 0, buffer1, kSize1, NULL)); 63 EXPECT_EQ(10, entry->ReadData(0, 0, buffer1, kSize1, NULL));
60 EXPECT_STREQ("the data", buffer1->data()); 64 EXPECT_STREQ("the data", buffer1->data());
61 65
62 const int kSize2 = 5000; 66 const int kSize2 = 5000;
63 const int kSize3 = 10000; 67 const int kSize3 = 10000;
64 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize2); 68 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize2);
65 scoped_refptr<net::IOBuffer> buffer3 = new net::IOBuffer(kSize3); 69 scoped_refptr<net::IOBuffer> buffer3 = new net::IOBuffer(kSize3);
66 memset(buffer3->data(), 0, kSize3); 70 memset(buffer3->data(), 0, kSize3);
67 CacheTestFillBuffer(buffer2->data(), kSize2, false); 71 CacheTestFillBuffer(buffer2->data(), kSize2, false);
68 base::strlcpy(buffer2->data(), "The really big data goes here", kSize2); 72 base::strlcpy(buffer2->data(), "The really big data goes here", kSize2);
69 EXPECT_EQ(5000, entry1->WriteData(1, 1500, buffer2, kSize2, NULL, false)); 73 EXPECT_EQ(5000, entry->WriteData(1, 1500, buffer2, kSize2, NULL, false));
70 memset(buffer2->data(), 0, kSize2); 74 memset(buffer2->data(), 0, kSize2);
71 EXPECT_EQ(4989, entry1->ReadData(1, 1511, buffer2, kSize2, NULL)); 75 EXPECT_EQ(4989, entry->ReadData(1, 1511, buffer2, kSize2, NULL));
72 EXPECT_STREQ("big data goes here", buffer2->data()); 76 EXPECT_STREQ("big data goes here", buffer2->data());
73 EXPECT_EQ(5000, entry1->ReadData(1, 0, buffer2, kSize2, NULL)); 77 EXPECT_EQ(5000, entry->ReadData(1, 0, buffer2, kSize2, NULL));
74 EXPECT_EQ(0, memcmp(buffer2->data(), buffer3->data(), 1500)); 78 EXPECT_EQ(0, memcmp(buffer2->data(), buffer3->data(), 1500));
75 EXPECT_EQ(1500, entry1->ReadData(1, 5000, buffer2, kSize2, NULL)); 79 EXPECT_EQ(1500, entry->ReadData(1, 5000, buffer2, kSize2, NULL));
76 80
77 EXPECT_EQ(0, entry1->ReadData(1, 6500, buffer2, kSize2, NULL)); 81 EXPECT_EQ(0, entry->ReadData(1, 6500, buffer2, kSize2, NULL));
78 EXPECT_EQ(6500, entry1->ReadData(1, 0, buffer3, kSize3, NULL)); 82 EXPECT_EQ(6500, entry->ReadData(1, 0, buffer3, kSize3, NULL));
79 EXPECT_EQ(8192, entry1->WriteData(1, 0, buffer3, 8192, NULL, false)); 83 EXPECT_EQ(8192, entry->WriteData(1, 0, buffer3, 8192, NULL, false));
80 EXPECT_EQ(8192, entry1->ReadData(1, 0, buffer3, kSize3, NULL)); 84 EXPECT_EQ(8192, entry->ReadData(1, 0, buffer3, kSize3, NULL));
81 EXPECT_EQ(8192, entry1->GetDataSize(1)); 85 EXPECT_EQ(8192, entry->GetDataSize(1));
82 86
83 entry1->Doom(); 87 // We need to delete the memory buffer on this thread.
84 entry1->Close(); 88 EXPECT_EQ(0, entry->WriteData(0, 0, NULL, 0, NULL, true));
89 EXPECT_EQ(0, entry->WriteData(1, 0, NULL, 0, NULL, true));
90
91 entry->Doom();
92 entry->Close();
85 FlushQueueForTest(); 93 FlushQueueForTest();
86 EXPECT_EQ(0, cache_->GetEntryCount()); 94 EXPECT_EQ(0, cache_->GetEntryCount());
87 } 95 }
88 96
89 TEST_F(DiskCacheEntryTest, InternalSyncIO) { 97 TEST_F(DiskCacheEntryTest, InternalSyncIO) {
90 SetDirectMode(); 98 SetDirectMode();
91 InitCache(); 99 InitCache();
92 InternalSyncIO(); 100 InternalSyncIO();
93 } 101 }
94 102
95 TEST_F(DiskCacheEntryTest, MemoryOnlyInternalSyncIO) { 103 TEST_F(DiskCacheEntryTest, MemoryOnlyInternalSyncIO) {
96 SetMemoryOnlyMode(); 104 SetMemoryOnlyMode();
97 InitCache(); 105 InitCache();
98 InternalSyncIO(); 106 InternalSyncIO();
99 } 107 }
100 108
101 void DiskCacheEntryTest::InternalAsyncIO() { 109 void DiskCacheEntryTest::InternalAsyncIO() {
102 disk_cache::Entry *entry1 = NULL; 110 disk_cache::Entry* entry = NULL;
103 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry1)); 111 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry));
104 ASSERT_TRUE(NULL != entry1); 112 ASSERT_TRUE(NULL != entry);
105 113
106 // Avoid using internal buffers for the test. We have to write something to 114 // Avoid using internal buffers for the test. We have to write something to
107 // the entry and close it so that we flush the internal buffer to disk. After 115 // the entry and close it so that we flush the internal buffer to disk. After
108 // that, IO operations will be really hitting the disk. We don't care about 116 // that, IO operations will be really hitting the disk. We don't care about
109 // the content, so just extending the entry is enough (all extensions zero- 117 // the content, so just extending the entry is enough (all extensions zero-
110 // fill any holes). 118 // fill any holes).
111 EXPECT_EQ(0, entry1->WriteData(0, 15 * 1024, NULL, 0, NULL, false)); 119 EXPECT_EQ(0, WriteData(entry, 0, 15 * 1024, NULL, 0, false));
112 EXPECT_EQ(0, entry1->WriteData(1, 15 * 1024, NULL, 0, NULL, false)); 120 EXPECT_EQ(0, WriteData(entry, 1, 15 * 1024, NULL, 0, false));
113 entry1->Close(); 121 entry->Close();
114 ASSERT_EQ(net::OK, OpenEntry("the first key", &entry1)); 122 ASSERT_EQ(net::OK, OpenEntry("the first key", &entry));
115 123
116 // Let's verify that each IO goes to the right callback object. 124 // Let's verify that each IO goes to the right callback object.
117 CallbackTest callback1(false); 125 CallbackTest callback1(false);
118 CallbackTest callback2(false); 126 CallbackTest callback2(false);
119 CallbackTest callback3(false); 127 CallbackTest callback3(false);
120 CallbackTest callback4(false); 128 CallbackTest callback4(false);
121 CallbackTest callback5(false); 129 CallbackTest callback5(false);
122 CallbackTest callback6(false); 130 CallbackTest callback6(false);
123 CallbackTest callback7(false); 131 CallbackTest callback7(false);
124 CallbackTest callback8(false); 132 CallbackTest callback8(false);
(...skipping 11 matching lines...) Expand all
136 const int kSize1 = 10; 144 const int kSize1 = 10;
137 const int kSize2 = 5000; 145 const int kSize2 = 5000;
138 const int kSize3 = 10000; 146 const int kSize3 = 10000;
139 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize1); 147 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize1);
140 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize2); 148 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize2);
141 scoped_refptr<net::IOBuffer> buffer3 = new net::IOBuffer(kSize3); 149 scoped_refptr<net::IOBuffer> buffer3 = new net::IOBuffer(kSize3);
142 CacheTestFillBuffer(buffer1->data(), kSize1, false); 150 CacheTestFillBuffer(buffer1->data(), kSize1, false);
143 CacheTestFillBuffer(buffer2->data(), kSize2, false); 151 CacheTestFillBuffer(buffer2->data(), kSize2, false);
144 CacheTestFillBuffer(buffer3->data(), kSize3, false); 152 CacheTestFillBuffer(buffer3->data(), kSize3, false);
145 153
146 EXPECT_EQ(0, entry1->ReadData(0, 15 * 1024, buffer1, kSize1, &callback1)); 154 EXPECT_EQ(0, entry->ReadData(0, 15 * 1024, buffer1, kSize1, &callback1));
147 base::strlcpy(buffer1->data(), "the data", kSize1); 155 base::strlcpy(buffer1->data(), "the data", kSize1);
148 int expected = 0; 156 int expected = 0;
149 int ret = entry1->WriteData(0, 0, buffer1, kSize1, &callback2, false); 157 int ret = entry->WriteData(0, 0, buffer1, kSize1, &callback2, false);
150 EXPECT_TRUE(10 == ret || net::ERR_IO_PENDING == ret); 158 EXPECT_TRUE(10 == ret || net::ERR_IO_PENDING == ret);
151 if (net::ERR_IO_PENDING == ret) 159 if (net::ERR_IO_PENDING == ret)
152 expected++; 160 expected++;
153 161
154 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); 162 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected));
155 memset(buffer2->data(), 0, kSize2); 163 memset(buffer2->data(), 0, kSize2);
156 ret = entry1->ReadData(0, 0, buffer2, kSize1, &callback3); 164 ret = entry->ReadData(0, 0, buffer2, kSize1, &callback3);
157 EXPECT_TRUE(10 == ret || net::ERR_IO_PENDING == ret); 165 EXPECT_TRUE(10 == ret || net::ERR_IO_PENDING == ret);
158 if (net::ERR_IO_PENDING == ret) 166 if (net::ERR_IO_PENDING == ret)
159 expected++; 167 expected++;
160 168
161 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); 169 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected));
162 EXPECT_STREQ("the data", buffer2->data()); 170 EXPECT_STREQ("the data", buffer2->data());
163 171
164 base::strlcpy(buffer2->data(), "The really big data goes here", kSize2); 172 base::strlcpy(buffer2->data(), "The really big data goes here", kSize2);
165 ret = entry1->WriteData(1, 1500, buffer2, kSize2, &callback4, true); 173 ret = entry->WriteData(1, 1500, buffer2, kSize2, &callback4, true);
166 EXPECT_TRUE(5000 == ret || net::ERR_IO_PENDING == ret); 174 EXPECT_TRUE(5000 == ret || net::ERR_IO_PENDING == ret);
167 if (net::ERR_IO_PENDING == ret) 175 if (net::ERR_IO_PENDING == ret)
168 expected++; 176 expected++;
169 177
170 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); 178 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected));
171 memset(buffer3->data(), 0, kSize3); 179 memset(buffer3->data(), 0, kSize3);
172 ret = entry1->ReadData(1, 1511, buffer3, kSize2, &callback5); 180 ret = entry->ReadData(1, 1511, buffer3, kSize2, &callback5);
173 EXPECT_TRUE(4989 == ret || net::ERR_IO_PENDING == ret); 181 EXPECT_TRUE(4989 == ret || net::ERR_IO_PENDING == ret);
174 if (net::ERR_IO_PENDING == ret) 182 if (net::ERR_IO_PENDING == ret)
175 expected++; 183 expected++;
176 184
177 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); 185 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected));
178 EXPECT_STREQ("big data goes here", buffer3->data()); 186 EXPECT_STREQ("big data goes here", buffer3->data());
179 ret = entry1->ReadData(1, 0, buffer2, kSize2, &callback6); 187 ret = entry->ReadData(1, 0, buffer2, kSize2, &callback6);
180 EXPECT_TRUE(5000 == ret || net::ERR_IO_PENDING == ret); 188 EXPECT_TRUE(5000 == ret || net::ERR_IO_PENDING == ret);
181 if (net::ERR_IO_PENDING == ret) 189 if (net::ERR_IO_PENDING == ret)
182 expected++; 190 expected++;
183 191
184 memset(buffer3->data(), 0, kSize3); 192 memset(buffer3->data(), 0, kSize3);
185 193
186 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); 194 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected));
187 EXPECT_EQ(0, memcmp(buffer2->data(), buffer3->data(), 1500)); 195 EXPECT_EQ(0, memcmp(buffer2->data(), buffer3->data(), 1500));
188 ret = entry1->ReadData(1, 5000, buffer2, kSize2, &callback7); 196 ret = entry->ReadData(1, 5000, buffer2, kSize2, &callback7);
189 EXPECT_TRUE(1500 == ret || net::ERR_IO_PENDING == ret); 197 EXPECT_TRUE(1500 == ret || net::ERR_IO_PENDING == ret);
190 if (net::ERR_IO_PENDING == ret) 198 if (net::ERR_IO_PENDING == ret)
191 expected++; 199 expected++;
192 200
193 ret = entry1->ReadData(1, 0, buffer3, kSize3, &callback9); 201 ret = entry->ReadData(1, 0, buffer3, kSize3, &callback9);
194 EXPECT_TRUE(6500 == ret || net::ERR_IO_PENDING == ret); 202 EXPECT_TRUE(6500 == ret || net::ERR_IO_PENDING == ret);
195 if (net::ERR_IO_PENDING == ret) 203 if (net::ERR_IO_PENDING == ret)
196 expected++; 204 expected++;
197 205
198 ret = entry1->WriteData(1, 0, buffer3, 8192, &callback10, true); 206 ret = entry->WriteData(1, 0, buffer3, 8192, &callback10, true);
199 EXPECT_TRUE(8192 == ret || net::ERR_IO_PENDING == ret); 207 EXPECT_TRUE(8192 == ret || net::ERR_IO_PENDING == ret);
200 if (net::ERR_IO_PENDING == ret) 208 if (net::ERR_IO_PENDING == ret)
201 expected++; 209 expected++;
202 210
203 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); 211 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected));
204 ret = entry1->ReadData(1, 0, buffer3, kSize3, &callback11); 212 ret = entry->ReadData(1, 0, buffer3, kSize3, &callback11);
205 EXPECT_TRUE(8192 == ret || net::ERR_IO_PENDING == ret); 213 EXPECT_TRUE(8192 == ret || net::ERR_IO_PENDING == ret);
206 if (net::ERR_IO_PENDING == ret) 214 if (net::ERR_IO_PENDING == ret)
207 expected++; 215 expected++;
208 216
209 EXPECT_EQ(8192, entry1->GetDataSize(1)); 217 EXPECT_EQ(8192, entry->GetDataSize(1));
210 218
211 ret = entry1->ReadData(0, 0, buffer1, kSize1, &callback12); 219 ret = entry->ReadData(0, 0, buffer1, kSize1, &callback12);
212 EXPECT_TRUE(10 == ret || net::ERR_IO_PENDING == ret); 220 EXPECT_TRUE(10 == ret || net::ERR_IO_PENDING == ret);
213 if (net::ERR_IO_PENDING == ret) 221 if (net::ERR_IO_PENDING == ret)
214 expected++; 222 expected++;
215 223
216 ret = entry1->ReadData(1, 0, buffer2, kSize2, &callback13); 224 ret = entry->ReadData(1, 0, buffer2, kSize2, &callback13);
217 EXPECT_TRUE(5000 == ret || net::ERR_IO_PENDING == ret); 225 EXPECT_TRUE(5000 == ret || net::ERR_IO_PENDING == ret);
218 if (net::ERR_IO_PENDING == ret) 226 if (net::ERR_IO_PENDING == ret)
219 expected++; 227 expected++;
220 228
221 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); 229 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected));
222 230
223 EXPECT_FALSE(g_cache_tests_error); 231 EXPECT_FALSE(g_cache_tests_error);
224 EXPECT_EQ(expected, g_cache_tests_received); 232 EXPECT_EQ(expected, g_cache_tests_received);
225 233
226 entry1->Doom(); 234 entry->Doom();
227 entry1->Close(); 235 entry->Close();
228 FlushQueueForTest(); 236 FlushQueueForTest();
229 EXPECT_EQ(0, cache_->GetEntryCount()); 237 EXPECT_EQ(0, cache_->GetEntryCount());
230 } 238 }
231 239
232 TEST_F(DiskCacheEntryTest, InternalAsyncIO) { 240 TEST_F(DiskCacheEntryTest, InternalAsyncIO) {
233 SetDirectMode(); 241 SetDirectMode();
234 InitCache(); 242 InitCache();
235 InternalAsyncIO(); 243 InternalAsyncIO();
236 } 244 }
237 245
238 TEST_F(DiskCacheEntryTest, MemoryOnlyInternalAsyncIO) { 246 TEST_F(DiskCacheEntryTest, MemoryOnlyInternalAsyncIO) {
239 SetMemoryOnlyMode(); 247 SetMemoryOnlyMode();
240 InitCache(); 248 InitCache();
241 InternalAsyncIO(); 249 InternalAsyncIO();
242 } 250 }
243 251
244 void DiskCacheEntryTest::ExternalSyncIO() { 252 void DiskCacheEntryTest::ExternalSyncIO() {
245 disk_cache::Entry *entry1; 253 disk_cache::Entry* entry;
246 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry1)); 254 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry));
247 255
248 const int kSize1 = 17000; 256 const int kSize1 = 17000;
249 const int kSize2 = 25000; 257 const int kSize2 = 25000;
250 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize1); 258 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize1);
251 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize2); 259 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize2);
252 CacheTestFillBuffer(buffer1->data(), kSize1, false); 260 CacheTestFillBuffer(buffer1->data(), kSize1, false);
253 CacheTestFillBuffer(buffer2->data(), kSize2, false); 261 CacheTestFillBuffer(buffer2->data(), kSize2, false);
254 base::strlcpy(buffer1->data(), "the data", kSize1); 262 base::strlcpy(buffer1->data(), "the data", kSize1);
255 EXPECT_EQ(17000, entry1->WriteData(0, 0, buffer1, kSize1, NULL, false)); 263 EXPECT_EQ(17000, entry->WriteData(0, 0, buffer1, kSize1, NULL, false));
256 memset(buffer1->data(), 0, kSize1); 264 memset(buffer1->data(), 0, kSize1);
257 EXPECT_EQ(17000, entry1->ReadData(0, 0, buffer1, kSize1, NULL)); 265 EXPECT_EQ(17000, entry->ReadData(0, 0, buffer1, kSize1, NULL));
258 EXPECT_STREQ("the data", buffer1->data()); 266 EXPECT_STREQ("the data", buffer1->data());
259 267
260 base::strlcpy(buffer2->data(), "The really big data goes here", kSize2); 268 base::strlcpy(buffer2->data(), "The really big data goes here", kSize2);
261 EXPECT_EQ(25000, entry1->WriteData(1, 10000, buffer2, kSize2, NULL, false)); 269 EXPECT_EQ(25000, entry->WriteData(1, 10000, buffer2, kSize2, NULL, false));
262 memset(buffer2->data(), 0, kSize2); 270 memset(buffer2->data(), 0, kSize2);
263 EXPECT_EQ(24989, entry1->ReadData(1, 10011, buffer2, kSize2, NULL)); 271 EXPECT_EQ(24989, entry->ReadData(1, 10011, buffer2, kSize2, NULL));
264 EXPECT_STREQ("big data goes here", buffer2->data()); 272 EXPECT_STREQ("big data goes here", buffer2->data());
265 EXPECT_EQ(25000, entry1->ReadData(1, 0, buffer2, kSize2, NULL)); 273 EXPECT_EQ(25000, entry->ReadData(1, 0, buffer2, kSize2, NULL));
266 EXPECT_EQ(0, memcmp(buffer2->data(), buffer2->data(), 10000)); 274 EXPECT_EQ(0, memcmp(buffer2->data(), buffer2->data(), 10000));
267 EXPECT_EQ(5000, entry1->ReadData(1, 30000, buffer2, kSize2, NULL)); 275 EXPECT_EQ(5000, entry->ReadData(1, 30000, buffer2, kSize2, NULL));
268 276
269 EXPECT_EQ(0, entry1->ReadData(1, 35000, buffer2, kSize2, NULL)); 277 EXPECT_EQ(0, entry->ReadData(1, 35000, buffer2, kSize2, NULL));
270 EXPECT_EQ(17000, entry1->ReadData(1, 0, buffer1, kSize1, NULL)); 278 EXPECT_EQ(17000, entry->ReadData(1, 0, buffer1, kSize1, NULL));
271 EXPECT_EQ(17000, entry1->WriteData(1, 20000, buffer1, kSize1, NULL, false)); 279 EXPECT_EQ(17000, entry->WriteData(1, 20000, buffer1, kSize1, NULL, false));
272 EXPECT_EQ(37000, entry1->GetDataSize(1)); 280 EXPECT_EQ(37000, entry->GetDataSize(1));
273 281
274 entry1->Doom(); 282 // We need to delete the memory buffer on this thread.
275 entry1->Close(); 283 EXPECT_EQ(0, entry->WriteData(0, 0, NULL, 0, NULL, true));
284 EXPECT_EQ(0, entry->WriteData(1, 0, NULL, 0, NULL, true));
285
286 entry->Doom();
287 entry->Close();
276 FlushQueueForTest(); 288 FlushQueueForTest();
277 EXPECT_EQ(0, cache_->GetEntryCount()); 289 EXPECT_EQ(0, cache_->GetEntryCount());
278 } 290 }
279 291
280 TEST_F(DiskCacheEntryTest, ExternalSyncIO) { 292 TEST_F(DiskCacheEntryTest, ExternalSyncIO) {
281 SetDirectMode(); 293 SetDirectMode();
282 InitCache(); 294 InitCache();
283 ExternalSyncIO(); 295 ExternalSyncIO();
284 } 296 }
285 297
286 TEST_F(DiskCacheEntryTest, MemoryOnlyExternalSyncIO) { 298 TEST_F(DiskCacheEntryTest, MemoryOnlyExternalSyncIO) {
287 SetMemoryOnlyMode(); 299 SetMemoryOnlyMode();
288 InitCache(); 300 InitCache();
289 ExternalSyncIO(); 301 ExternalSyncIO();
290 } 302 }
291 303
292 void DiskCacheEntryTest::ExternalAsyncIO() { 304 void DiskCacheEntryTest::ExternalAsyncIO() {
293 disk_cache::Entry *entry1; 305 disk_cache::Entry* entry;
294 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry1)); 306 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry));
295 307
296 // Let's verify that each IO goes to the right callback object. 308 // Let's verify that each IO goes to the right callback object.
297 CallbackTest callback1(false); 309 CallbackTest callback1(false);
298 CallbackTest callback2(false); 310 CallbackTest callback2(false);
299 CallbackTest callback3(false); 311 CallbackTest callback3(false);
300 CallbackTest callback4(false); 312 CallbackTest callback4(false);
301 CallbackTest callback5(false); 313 CallbackTest callback5(false);
302 CallbackTest callback6(false); 314 CallbackTest callback6(false);
303 CallbackTest callback7(false); 315 CallbackTest callback7(false);
304 CallbackTest callback8(false); 316 CallbackTest callback8(false);
305 CallbackTest callback9(false); 317 CallbackTest callback9(false);
306 318
307 g_cache_tests_error = false; 319 g_cache_tests_error = false;
308 g_cache_tests_received = 0; 320 g_cache_tests_received = 0;
309 int expected = 0; 321 int expected = 0;
310 322
311 MessageLoopHelper helper; 323 MessageLoopHelper helper;
312 324
313 const int kSize1 = 17000; 325 const int kSize1 = 17000;
314 const int kSize2 = 25000; 326 const int kSize2 = 25000;
315 const int kSize3 = 25000; 327 const int kSize3 = 25000;
316 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize1); 328 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize1);
317 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize2); 329 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize2);
318 scoped_refptr<net::IOBuffer> buffer3 = new net::IOBuffer(kSize3); 330 scoped_refptr<net::IOBuffer> buffer3 = new net::IOBuffer(kSize3);
319 CacheTestFillBuffer(buffer1->data(), kSize1, false); 331 CacheTestFillBuffer(buffer1->data(), kSize1, false);
320 CacheTestFillBuffer(buffer2->data(), kSize2, false); 332 CacheTestFillBuffer(buffer2->data(), kSize2, false);
321 CacheTestFillBuffer(buffer3->data(), kSize3, false); 333 CacheTestFillBuffer(buffer3->data(), kSize3, false);
322 base::strlcpy(buffer1->data(), "the data", kSize1); 334 base::strlcpy(buffer1->data(), "the data", kSize1);
323 int ret = entry1->WriteData(0, 0, buffer1, kSize1, &callback1, false); 335 int ret = entry->WriteData(0, 0, buffer1, kSize1, &callback1, false);
324 EXPECT_TRUE(17000 == ret || net::ERR_IO_PENDING == ret); 336 EXPECT_TRUE(17000 == ret || net::ERR_IO_PENDING == ret);
325 if (net::ERR_IO_PENDING == ret) 337 if (net::ERR_IO_PENDING == ret)
326 expected++; 338 expected++;
327 339
328 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); 340 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected));
329 341
330 memset(buffer2->data(), 0, kSize1); 342 memset(buffer2->data(), 0, kSize1);
331 ret = entry1->ReadData(0, 0, buffer2, kSize1, &callback2); 343 ret = entry->ReadData(0, 0, buffer2, kSize1, &callback2);
332 EXPECT_TRUE(17000 == ret || net::ERR_IO_PENDING == ret); 344 EXPECT_TRUE(17000 == ret || net::ERR_IO_PENDING == ret);
333 if (net::ERR_IO_PENDING == ret) 345 if (net::ERR_IO_PENDING == ret)
334 expected++; 346 expected++;
335 347
336 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); 348 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected));
337 EXPECT_STREQ("the data", buffer1->data()); 349 EXPECT_STREQ("the data", buffer1->data());
338 350
339 base::strlcpy(buffer2->data(), "The really big data goes here", kSize2); 351 base::strlcpy(buffer2->data(), "The really big data goes here", kSize2);
340 ret = entry1->WriteData(1, 10000, buffer2, kSize2, &callback3, false); 352 ret = entry->WriteData(1, 10000, buffer2, kSize2, &callback3, false);
341 EXPECT_TRUE(25000 == ret || net::ERR_IO_PENDING == ret); 353 EXPECT_TRUE(25000 == ret || net::ERR_IO_PENDING == ret);
342 if (net::ERR_IO_PENDING == ret) 354 if (net::ERR_IO_PENDING == ret)
343 expected++; 355 expected++;
344 356
345 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); 357 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected));
346 358
347 memset(buffer3->data(), 0, kSize3); 359 memset(buffer3->data(), 0, kSize3);
348 ret = entry1->ReadData(1, 10011, buffer3, kSize3, &callback4); 360 ret = entry->ReadData(1, 10011, buffer3, kSize3, &callback4);
349 EXPECT_TRUE(24989 == ret || net::ERR_IO_PENDING == ret); 361 EXPECT_TRUE(24989 == ret || net::ERR_IO_PENDING == ret);
350 if (net::ERR_IO_PENDING == ret) 362 if (net::ERR_IO_PENDING == ret)
351 expected++; 363 expected++;
352 364
353 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); 365 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected));
354 EXPECT_STREQ("big data goes here", buffer3->data()); 366 EXPECT_STREQ("big data goes here", buffer3->data());
355 ret = entry1->ReadData(1, 0, buffer2, kSize2, &callback5); 367 ret = entry->ReadData(1, 0, buffer2, kSize2, &callback5);
356 EXPECT_TRUE(25000 == ret || net::ERR_IO_PENDING == ret); 368 EXPECT_TRUE(25000 == ret || net::ERR_IO_PENDING == ret);
357 if (net::ERR_IO_PENDING == ret) 369 if (net::ERR_IO_PENDING == ret)
358 expected++; 370 expected++;
359 371
360 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); 372 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected));
361 EXPECT_EQ(0, memcmp(buffer2->data(), buffer2->data(), 10000)); 373 EXPECT_EQ(0, memcmp(buffer2->data(), buffer2->data(), 10000));
362 ret = entry1->ReadData(1, 30000, buffer2, kSize2, &callback6); 374 ret = entry->ReadData(1, 30000, buffer2, kSize2, &callback6);
363 EXPECT_TRUE(5000 == ret || net::ERR_IO_PENDING == ret); 375 EXPECT_TRUE(5000 == ret || net::ERR_IO_PENDING == ret);
364 if (net::ERR_IO_PENDING == ret) 376 if (net::ERR_IO_PENDING == ret)
365 expected++; 377 expected++;
366 378
367 EXPECT_EQ(0, entry1->ReadData(1, 35000, buffer2, kSize2, &callback7)); 379 EXPECT_EQ(0, entry->ReadData(1, 35000, buffer2, kSize2, &callback7));
368 ret = entry1->ReadData(1, 0, buffer1, kSize1, &callback8); 380 ret = entry->ReadData(1, 0, buffer1, kSize1, &callback8);
369 EXPECT_TRUE(17000 == ret || net::ERR_IO_PENDING == ret); 381 EXPECT_TRUE(17000 == ret || net::ERR_IO_PENDING == ret);
370 if (net::ERR_IO_PENDING == ret) 382 if (net::ERR_IO_PENDING == ret)
371 expected++; 383 expected++;
372 ret = entry1->WriteData(1, 20000, buffer1, kSize1, &callback9, false); 384 ret = entry->WriteData(1, 20000, buffer1, kSize1, &callback9, false);
373 EXPECT_TRUE(17000 == ret || net::ERR_IO_PENDING == ret); 385 EXPECT_TRUE(17000 == ret || net::ERR_IO_PENDING == ret);
374 if (net::ERR_IO_PENDING == ret) 386 if (net::ERR_IO_PENDING == ret)
375 expected++; 387 expected++;
376 388
377 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); 389 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected));
378 EXPECT_EQ(37000, entry1->GetDataSize(1)); 390 EXPECT_EQ(37000, entry->GetDataSize(1));
379 391
380 EXPECT_FALSE(g_cache_tests_error); 392 EXPECT_FALSE(g_cache_tests_error);
381 EXPECT_EQ(expected, g_cache_tests_received); 393 EXPECT_EQ(expected, g_cache_tests_received);
382 394
383 entry1->Doom(); 395 entry->Doom();
384 entry1->Close(); 396 entry->Close();
385 FlushQueueForTest(); 397 FlushQueueForTest();
386 EXPECT_EQ(0, cache_->GetEntryCount()); 398 EXPECT_EQ(0, cache_->GetEntryCount());
387 } 399 }
388 400
389 TEST_F(DiskCacheEntryTest, ExternalAsyncIO) { 401 TEST_F(DiskCacheEntryTest, ExternalAsyncIO) {
390 SetDirectMode(); 402 SetDirectMode();
391 InitCache(); 403 InitCache();
392 ExternalAsyncIO(); 404 ExternalAsyncIO();
393 } 405 }
394 406
395 TEST_F(DiskCacheEntryTest, MemoryOnlyExternalAsyncIO) { 407 TEST_F(DiskCacheEntryTest, MemoryOnlyExternalAsyncIO) {
396 SetMemoryOnlyMode(); 408 SetMemoryOnlyMode();
397 InitCache(); 409 InitCache();
398 ExternalAsyncIO(); 410 ExternalAsyncIO();
399 } 411 }
400 412
401 void DiskCacheEntryTest::StreamAccess() { 413 void DiskCacheEntryTest::StreamAccess() {
402 disk_cache::Entry *entry = NULL; 414 disk_cache::Entry* entry = NULL;
403 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry)); 415 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry));
404 ASSERT_TRUE(NULL != entry); 416 ASSERT_TRUE(NULL != entry);
405 417
406 const int kBufferSize = 1024; 418 const int kBufferSize = 1024;
407 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kBufferSize); 419 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kBufferSize);
408 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kBufferSize); 420 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kBufferSize);
409 421
410 const int kNumStreams = 3; 422 const int kNumStreams = 3;
411 for (int i = 0; i < kNumStreams; i++) { 423 for (int i = 0; i < kNumStreams; i++) {
412 CacheTestFillBuffer(buffer1->data(), kBufferSize, false); 424 CacheTestFillBuffer(buffer1->data(), kBufferSize, false);
413 EXPECT_EQ(kBufferSize, entry->WriteData(i, 0, buffer1, kBufferSize, NULL, 425 EXPECT_EQ(kBufferSize, WriteData(entry, i, 0, buffer1, kBufferSize, false));
414 false));
415 memset(buffer2->data(), 0, kBufferSize); 426 memset(buffer2->data(), 0, kBufferSize);
416 EXPECT_EQ(kBufferSize, entry->ReadData(i, 0, buffer2, kBufferSize, NULL)); 427 EXPECT_EQ(kBufferSize, ReadData(entry, i, 0, buffer2, kBufferSize));
417 EXPECT_EQ(0, memcmp(buffer1->data(), buffer2->data(), kBufferSize)); 428 EXPECT_EQ(0, memcmp(buffer1->data(), buffer2->data(), kBufferSize));
418 } 429 }
419 430
420 EXPECT_EQ(net::ERR_INVALID_ARGUMENT, 431 EXPECT_EQ(net::ERR_INVALID_ARGUMENT,
421 entry->ReadData(kNumStreams, 0, buffer1, kBufferSize, NULL)); 432 ReadData(entry, kNumStreams, 0, buffer1, kBufferSize));
422 entry->Close(); 433 entry->Close();
423 } 434 }
424 435
425 TEST_F(DiskCacheEntryTest, StreamAccess) { 436 TEST_F(DiskCacheEntryTest, StreamAccess) {
426 InitCache(); 437 InitCache();
427 StreamAccess(); 438 StreamAccess();
428 } 439 }
429 440
430 TEST_F(DiskCacheEntryTest, MemoryOnlyStreamAccess) { 441 TEST_F(DiskCacheEntryTest, MemoryOnlyStreamAccess) {
431 SetMemoryOnlyMode(); 442 SetMemoryOnlyMode();
432 InitCache(); 443 InitCache();
433 StreamAccess(); 444 StreamAccess();
434 } 445 }
435 446
436 void DiskCacheEntryTest::GetKey() { 447 void DiskCacheEntryTest::GetKey() {
437 std::string key1("the first key"); 448 std::string key("the first key");
438 disk_cache::Entry *entry1; 449 disk_cache::Entry* entry;
439 ASSERT_EQ(net::OK, CreateEntry(key1, &entry1)); 450 ASSERT_EQ(net::OK, CreateEntry(key, &entry));
440 EXPECT_EQ(key1, entry1->GetKey()) << "short key"; 451 EXPECT_EQ(key, entry->GetKey()) << "short key";
441 entry1->Close(); 452 entry->Close();
442 453
443 int seed = static_cast<int>(Time::Now().ToInternalValue()); 454 int seed = static_cast<int>(Time::Now().ToInternalValue());
444 srand(seed); 455 srand(seed);
445 char key_buffer[20000]; 456 char key_buffer[20000];
446 457
447 CacheTestFillBuffer(key_buffer, 3000, true); 458 CacheTestFillBuffer(key_buffer, 3000, true);
448 key_buffer[1000] = '\0'; 459 key_buffer[1000] = '\0';
449 460
450 key1 = key_buffer; 461 key = key_buffer;
451 ASSERT_EQ(net::OK, CreateEntry(key1, &entry1)); 462 ASSERT_EQ(net::OK, CreateEntry(key, &entry));
452 EXPECT_TRUE(key1 == entry1->GetKey()) << "1000 bytes key"; 463 EXPECT_TRUE(key == entry->GetKey()) << "1000 bytes key";
453 entry1->Close(); 464 entry->Close();
454 465
455 key_buffer[1000] = 'p'; 466 key_buffer[1000] = 'p';
456 key_buffer[3000] = '\0'; 467 key_buffer[3000] = '\0';
457 key1 = key_buffer; 468 key = key_buffer;
458 ASSERT_EQ(net::OK, CreateEntry(key1, &entry1)); 469 ASSERT_EQ(net::OK, CreateEntry(key, &entry));
459 EXPECT_TRUE(key1 == entry1->GetKey()) << "medium size key"; 470 EXPECT_TRUE(key == entry->GetKey()) << "medium size key";
460 entry1->Close(); 471 entry->Close();
461 472
462 CacheTestFillBuffer(key_buffer, sizeof(key_buffer), true); 473 CacheTestFillBuffer(key_buffer, sizeof(key_buffer), true);
463 key_buffer[19999] = '\0'; 474 key_buffer[19999] = '\0';
464 475
465 key1 = key_buffer; 476 key = key_buffer;
466 ASSERT_EQ(net::OK, CreateEntry(key1, &entry1)); 477 ASSERT_EQ(net::OK, CreateEntry(key, &entry));
467 EXPECT_TRUE(key1 == entry1->GetKey()) << "long key"; 478 EXPECT_TRUE(key == entry->GetKey()) << "long key";
468 entry1->Close(); 479 entry->Close();
469 } 480 }
470 481
471 TEST_F(DiskCacheEntryTest, GetKey) { 482 TEST_F(DiskCacheEntryTest, GetKey) {
472 InitCache(); 483 InitCache();
473 GetKey(); 484 GetKey();
474 } 485 }
475 486
476 TEST_F(DiskCacheEntryTest, MemoryOnlyGetKey) { 487 TEST_F(DiskCacheEntryTest, MemoryOnlyGetKey) {
477 SetMemoryOnlyMode(); 488 SetMemoryOnlyMode();
478 InitCache(); 489 InitCache();
479 GetKey(); 490 GetKey();
480 } 491 }
481 492
482 void DiskCacheEntryTest::GrowData() { 493 void DiskCacheEntryTest::GrowData() {
483 std::string key1("the first key"); 494 std::string key1("the first key");
484 disk_cache::Entry *entry1, *entry2; 495 disk_cache::Entry* entry;
485 ASSERT_EQ(net::OK, CreateEntry(key1, &entry1)); 496 ASSERT_EQ(net::OK, CreateEntry(key1, &entry));
486 497
487 const int kSize = 20000; 498 const int kSize = 20000;
488 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize); 499 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize);
489 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize); 500 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize);
490 CacheTestFillBuffer(buffer1->data(), kSize, false); 501 CacheTestFillBuffer(buffer1->data(), kSize, false);
491 memset(buffer2->data(), 0, kSize); 502 memset(buffer2->data(), 0, kSize);
492 503
493 base::strlcpy(buffer1->data(), "the data", kSize); 504 base::strlcpy(buffer1->data(), "the data", kSize);
494 EXPECT_EQ(10, entry1->WriteData(0, 0, buffer1, 10, NULL, false)); 505 EXPECT_EQ(10, WriteData(entry, 0, 0, buffer1, 10, false));
495 EXPECT_EQ(10, entry1->ReadData(0, 0, buffer2, 10, NULL)); 506 EXPECT_EQ(10, ReadData(entry, 0, 0, buffer2, 10));
496 EXPECT_STREQ("the data", buffer2->data()); 507 EXPECT_STREQ("the data", buffer2->data());
497 EXPECT_EQ(10, entry1->GetDataSize(0)); 508 EXPECT_EQ(10, entry->GetDataSize(0));
498 509
499 EXPECT_EQ(2000, entry1->WriteData(0, 0, buffer1, 2000, NULL, false)); 510 EXPECT_EQ(2000, WriteData(entry, 0, 0, buffer1, 2000, false));
500 EXPECT_EQ(2000, entry1->GetDataSize(0)); 511 EXPECT_EQ(2000, entry->GetDataSize(0));
501 EXPECT_EQ(2000, entry1->ReadData(0, 0, buffer2, 2000, NULL)); 512 EXPECT_EQ(2000, ReadData(entry, 0, 0, buffer2, 2000));
502 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 2000)); 513 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 2000));
503 514
504 EXPECT_EQ(20000, entry1->WriteData(0, 0, buffer1, kSize, NULL, false)); 515 EXPECT_EQ(20000, WriteData(entry, 0, 0, buffer1, kSize, false));
505 EXPECT_EQ(20000, entry1->GetDataSize(0)); 516 EXPECT_EQ(20000, entry->GetDataSize(0));
506 EXPECT_EQ(20000, entry1->ReadData(0, 0, buffer2, kSize, NULL)); 517 EXPECT_EQ(20000, ReadData(entry, 0, 0, buffer2, kSize));
507 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), kSize)); 518 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), kSize));
508 entry1->Close(); 519 entry->Close();
509 520
510 memset(buffer2->data(), 0, kSize); 521 memset(buffer2->data(), 0, kSize);
511 ASSERT_EQ(net::OK, CreateEntry("Second key", &entry2)); 522 std::string key2("Second key");
512 EXPECT_EQ(10, entry2->WriteData(0, 0, buffer1, 10, NULL, false)); 523 ASSERT_EQ(net::OK, CreateEntry(key2, &entry));
513 EXPECT_EQ(10, entry2->GetDataSize(0)); 524 EXPECT_EQ(10, WriteData(entry, 0, 0, buffer1, 10, false));
514 entry2->Close(); 525 EXPECT_EQ(10, entry->GetDataSize(0));
526 entry->Close();
515 527
516 // Go from an internal address to a bigger block size. 528 // Go from an internal address to a bigger block size.
517 ASSERT_EQ(net::OK, OpenEntry("Second key", &entry2)); 529 ASSERT_EQ(net::OK, OpenEntry(key2, &entry));
518 EXPECT_EQ(2000, entry2->WriteData(0, 0, buffer1, 2000, NULL, false)); 530 EXPECT_EQ(2000, WriteData(entry, 0, 0, buffer1, 2000, false));
519 EXPECT_EQ(2000, entry2->GetDataSize(0)); 531 EXPECT_EQ(2000, entry->GetDataSize(0));
520 EXPECT_EQ(2000, entry2->ReadData(0, 0, buffer2, 2000, NULL)); 532 EXPECT_EQ(2000, ReadData(entry, 0, 0, buffer2, 2000));
521 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 2000)); 533 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 2000));
522 entry2->Close(); 534 entry->Close();
523 memset(buffer2->data(), 0, kSize); 535 memset(buffer2->data(), 0, kSize);
524 536
525 // Go from an internal address to an external one. 537 // Go from an internal address to an external one.
526 ASSERT_EQ(net::OK, OpenEntry("Second key", &entry2)); 538 ASSERT_EQ(net::OK, OpenEntry(key2, &entry));
527 EXPECT_EQ(20000, entry2->WriteData(0, 0, buffer1, kSize, NULL, false)); 539 EXPECT_EQ(20000, WriteData(entry, 0, 0, buffer1, kSize, false));
528 EXPECT_EQ(20000, entry2->GetDataSize(0)); 540 EXPECT_EQ(20000, entry->GetDataSize(0));
529 EXPECT_EQ(20000, entry2->ReadData(0, 0, buffer2, kSize, NULL)); 541 EXPECT_EQ(20000, ReadData(entry, 0, 0, buffer2, kSize));
530 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), kSize)); 542 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), kSize));
531 entry2->Close(); 543 entry->Close();
544
545 // Double check the size from disk.
546 ASSERT_EQ(net::OK, OpenEntry(key2, &entry));
547 EXPECT_EQ(20000, entry->GetDataSize(0));
548
549 // Now extend the entry without actual data.
550 EXPECT_EQ(0, WriteData(entry, 0, 45500, buffer1, 0, false));
551 entry->Close();
552
553 // And check again from disk.
554 ASSERT_EQ(net::OK, OpenEntry(key2, &entry));
555 EXPECT_EQ(45500, entry->GetDataSize(0));
556 entry->Close();
532 } 557 }
533 558
534 TEST_F(DiskCacheEntryTest, GrowData) { 559 TEST_F(DiskCacheEntryTest, GrowData) {
535 InitCache(); 560 InitCache();
536 GrowData(); 561 GrowData();
537 } 562 }
538 563
539 TEST_F(DiskCacheEntryTest, MemoryOnlyGrowData) { 564 TEST_F(DiskCacheEntryTest, MemoryOnlyGrowData) {
540 SetMemoryOnlyMode(); 565 SetMemoryOnlyMode();
541 InitCache(); 566 InitCache();
542 GrowData(); 567 GrowData();
543 } 568 }
544 569
545 void DiskCacheEntryTest::TruncateData() { 570 void DiskCacheEntryTest::TruncateData() {
546 std::string key1("the first key"); 571 std::string key("the first key");
547 disk_cache::Entry *entry1; 572 disk_cache::Entry* entry;
548 ASSERT_EQ(net::OK, CreateEntry(key1, &entry1)); 573 ASSERT_EQ(net::OK, CreateEntry(key, &entry));
549 574
550 const int kSize1 = 20000; 575 const int kSize1 = 20000;
551 const int kSize2 = 20000; 576 const int kSize2 = 20000;
552 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize1); 577 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize1);
553 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize2); 578 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize2);
554 579
555 CacheTestFillBuffer(buffer1->data(), kSize1, false); 580 CacheTestFillBuffer(buffer1->data(), kSize1, false);
556 memset(buffer2->data(), 0, kSize2); 581 memset(buffer2->data(), 0, kSize2);
557 582
558 // Simple truncation: 583 // Simple truncation:
559 EXPECT_EQ(200, entry1->WriteData(0, 0, buffer1, 200, NULL, false)); 584 EXPECT_EQ(200, entry->WriteData(0, 0, buffer1, 200, NULL, false));
560 EXPECT_EQ(200, entry1->GetDataSize(0)); 585 EXPECT_EQ(200, entry->GetDataSize(0));
561 EXPECT_EQ(100, entry1->WriteData(0, 0, buffer1, 100, NULL, false)); 586 EXPECT_EQ(100, entry->WriteData(0, 0, buffer1, 100, NULL, false));
562 EXPECT_EQ(200, entry1->GetDataSize(0)); 587 EXPECT_EQ(200, entry->GetDataSize(0));
563 EXPECT_EQ(100, entry1->WriteData(0, 0, buffer1, 100, NULL, true)); 588 EXPECT_EQ(100, entry->WriteData(0, 0, buffer1, 100, NULL, true));
564 EXPECT_EQ(100, entry1->GetDataSize(0)); 589 EXPECT_EQ(100, entry->GetDataSize(0));
565 EXPECT_EQ(0, entry1->WriteData(0, 50, buffer1, 0, NULL, true)); 590 EXPECT_EQ(0, entry->WriteData(0, 50, buffer1, 0, NULL, true));
566 EXPECT_EQ(50, entry1->GetDataSize(0)); 591 EXPECT_EQ(50, entry->GetDataSize(0));
567 EXPECT_EQ(0, entry1->WriteData(0, 0, buffer1, 0, NULL, true)); 592 EXPECT_EQ(0, entry->WriteData(0, 0, buffer1, 0, NULL, true));
568 EXPECT_EQ(0, entry1->GetDataSize(0)); 593 EXPECT_EQ(0, entry->GetDataSize(0));
569 entry1->Close(); 594 entry->Close();
570 ASSERT_EQ(net::OK, OpenEntry(key1, &entry1)); 595 ASSERT_EQ(net::OK, OpenEntry(key, &entry));
571 596
572 // Go to an external file. 597 // Go to an external file.
573 EXPECT_EQ(20000, entry1->WriteData(0, 0, buffer1, 20000, NULL, true)); 598 EXPECT_EQ(20000, entry->WriteData(0, 0, buffer1, 20000, NULL, true));
574 EXPECT_EQ(20000, entry1->GetDataSize(0)); 599 EXPECT_EQ(20000, entry->GetDataSize(0));
575 EXPECT_EQ(20000, entry1->ReadData(0, 0, buffer2, 20000, NULL)); 600 EXPECT_EQ(20000, entry->ReadData(0, 0, buffer2, 20000, NULL));
576 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 20000)); 601 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 20000));
577 memset(buffer2->data(), 0, kSize2); 602 memset(buffer2->data(), 0, kSize2);
578 603
579 // External file truncation 604 // External file truncation
580 EXPECT_EQ(18000, entry1->WriteData(0, 0, buffer1, 18000, NULL, false)); 605 EXPECT_EQ(18000, entry->WriteData(0, 0, buffer1, 18000, NULL, false));
581 EXPECT_EQ(20000, entry1->GetDataSize(0)); 606 EXPECT_EQ(20000, entry->GetDataSize(0));
582 EXPECT_EQ(18000, entry1->WriteData(0, 0, buffer1, 18000, NULL, true)); 607 EXPECT_EQ(18000, entry->WriteData(0, 0, buffer1, 18000, NULL, true));
583 EXPECT_EQ(18000, entry1->GetDataSize(0)); 608 EXPECT_EQ(18000, entry->GetDataSize(0));
584 EXPECT_EQ(0, entry1->WriteData(0, 17500, buffer1, 0, NULL, true)); 609 EXPECT_EQ(0, entry->WriteData(0, 17500, buffer1, 0, NULL, true));
585 EXPECT_EQ(17500, entry1->GetDataSize(0)); 610 EXPECT_EQ(17500, entry->GetDataSize(0));
586 611
587 // And back to an internal block. 612 // And back to an internal block.
588 EXPECT_EQ(600, entry1->WriteData(0, 1000, buffer1, 600, NULL, true)); 613 EXPECT_EQ(600, entry->WriteData(0, 1000, buffer1, 600, NULL, true));
589 EXPECT_EQ(1600, entry1->GetDataSize(0)); 614 EXPECT_EQ(1600, entry->GetDataSize(0));
590 EXPECT_EQ(600, entry1->ReadData(0, 1000, buffer2, 600, NULL)); 615 EXPECT_EQ(600, entry->ReadData(0, 1000, buffer2, 600, NULL));
591 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 600)); 616 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 600));
592 EXPECT_EQ(1000, entry1->ReadData(0, 0, buffer2, 1000, NULL)); 617 EXPECT_EQ(1000, entry->ReadData(0, 0, buffer2, 1000, NULL));
593 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 1000)) << 618 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 1000)) <<
594 "Preserves previous data"; 619 "Preserves previous data";
595 620
596 // Go from external file to zero length. 621 // Go from external file to zero length.
597 EXPECT_EQ(20000, entry1->WriteData(0, 0, buffer1, 20000, NULL, true)); 622 EXPECT_EQ(20000, entry->WriteData(0, 0, buffer1, 20000, NULL, true));
598 EXPECT_EQ(20000, entry1->GetDataSize(0)); 623 EXPECT_EQ(20000, entry->GetDataSize(0));
599 EXPECT_EQ(0, entry1->WriteData(0, 0, buffer1, 0, NULL, true)); 624 EXPECT_EQ(0, entry->WriteData(0, 0, buffer1, 0, NULL, true));
600 EXPECT_EQ(0, entry1->GetDataSize(0)); 625 EXPECT_EQ(0, entry->GetDataSize(0));
601 626
602 entry1->Close(); 627 entry->Close();
603 } 628 }
604 629
605 TEST_F(DiskCacheEntryTest, TruncateData) { 630 TEST_F(DiskCacheEntryTest, TruncateData) {
606 InitCache(); 631 InitCache();
607 TruncateData(); 632 TruncateData();
608 633
609 // We generate asynchronous IO that is not really tracked until completion 634 // We generate asynchronous IO that is not really tracked until completion
610 // so we just wait here before running the next test. 635 // so we just wait here before running the next test.
611 MessageLoopHelper helper; 636 MessageLoopHelper helper;
612 helper.WaitUntilCacheIoFinished(1); 637 helper.WaitUntilCacheIoFinished(1);
613 } 638 }
614 639
615 TEST_F(DiskCacheEntryTest, MemoryOnlyTruncateData) { 640 TEST_F(DiskCacheEntryTest, MemoryOnlyTruncateData) {
616 SetMemoryOnlyMode(); 641 SetMemoryOnlyMode();
617 InitCache(); 642 InitCache();
618 TruncateData(); 643 TruncateData();
619 } 644 }
620 645
621 void DiskCacheEntryTest::ZeroLengthIO() { 646 void DiskCacheEntryTest::ZeroLengthIO() {
622 std::string key1("the first key"); 647 std::string key("the first key");
623 disk_cache::Entry *entry1; 648 disk_cache::Entry* entry;
624 ASSERT_EQ(net::OK, CreateEntry(key1, &entry1)); 649 ASSERT_EQ(net::OK, CreateEntry(key, &entry));
625 650
626 EXPECT_EQ(0, entry1->ReadData(0, 0, NULL, 0, NULL)); 651 EXPECT_EQ(0, ReadData(entry, 0, 0, NULL, 0));
627 EXPECT_EQ(0, entry1->WriteData(0, 0, NULL, 0, NULL, false)); 652 EXPECT_EQ(0, WriteData(entry, 0, 0, NULL, 0, false));
628 653
629 // This write should extend the entry. 654 // This write should extend the entry.
630 EXPECT_EQ(0, entry1->WriteData(0, 1000, NULL, 0, NULL, false)); 655 EXPECT_EQ(0, WriteData(entry, 0, 1000, NULL, 0, false));
631 EXPECT_EQ(0, entry1->ReadData(0, 500, NULL, 0, NULL)); 656 EXPECT_EQ(0, ReadData(entry, 0, 500, NULL, 0));
632 EXPECT_EQ(0, entry1->ReadData(0, 2000, NULL, 0, NULL)); 657 EXPECT_EQ(0, ReadData(entry, 0, 2000, NULL, 0));
633 EXPECT_EQ(1000, entry1->GetDataSize(0)); 658 EXPECT_EQ(1000, entry->GetDataSize(0));
634 entry1->Close(); 659
660 EXPECT_EQ(0, WriteData(entry, 0, 100000, NULL, 0, true));
661 EXPECT_EQ(0, ReadData(entry, 0, 50000, NULL, 0));
662 EXPECT_EQ(100000, entry->GetDataSize(0));
663
664 // Lets verify the actual content.
665 const int kSize = 20;
666 const char zeros[kSize] = {};
667 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kSize);
668
669 CacheTestFillBuffer(buffer->data(), kSize, false);
670 EXPECT_EQ(kSize, ReadData(entry, 0, 500, buffer, kSize));
671 EXPECT_TRUE(!memcmp(buffer->data(), zeros, kSize));
672
673 CacheTestFillBuffer(buffer->data(), kSize, false);
674 EXPECT_EQ(kSize, ReadData(entry, 0, 5000, buffer, kSize));
675 EXPECT_TRUE(!memcmp(buffer->data(), zeros, kSize));
676
677 CacheTestFillBuffer(buffer->data(), kSize, false);
678 EXPECT_EQ(kSize, ReadData(entry, 0, 50000, buffer, kSize));
679 EXPECT_TRUE(!memcmp(buffer->data(), zeros, kSize));
680
681 entry->Close();
635 } 682 }
636 683
637 TEST_F(DiskCacheEntryTest, ZeroLengthIO) { 684 TEST_F(DiskCacheEntryTest, ZeroLengthIO) {
638 InitCache(); 685 InitCache();
639 ZeroLengthIO(); 686 ZeroLengthIO();
640 } 687 }
641 688
642 TEST_F(DiskCacheEntryTest, MemoryOnlyZeroLengthIO) { 689 TEST_F(DiskCacheEntryTest, MemoryOnlyZeroLengthIO) {
643 SetMemoryOnlyMode(); 690 SetMemoryOnlyMode();
644 InitCache(); 691 InitCache();
645 ZeroLengthIO(); 692 ZeroLengthIO();
646 } 693 }
647 694
695 // Tests that we handle the content correctly when buffering.
696 TEST_F(DiskCacheEntryTest, Buffering) {
697 InitCache();
698 std::string key("the first key");
699 disk_cache::Entry* entry;
700 ASSERT_EQ(net::OK, CreateEntry(key, &entry));
701
702 const int kSize = 200;
703 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize);
704 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize);
705 CacheTestFillBuffer(buffer1->data(), kSize, true);
706 CacheTestFillBuffer(buffer2->data(), kSize, true);
707
708 EXPECT_EQ(kSize, WriteData(entry, 1, 0, buffer1, kSize, false));
709 entry->Close();
710
711 // Write a little more and read what we wrote before.
712 ASSERT_EQ(net::OK, OpenEntry(key, &entry));
713 EXPECT_EQ(kSize, WriteData(entry, 1, 5000, buffer1, kSize, false));
714 EXPECT_EQ(kSize, ReadData(entry, 1, 0, buffer2, kSize));
715 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize));
716
717 // Now go to an external file.
718 EXPECT_EQ(kSize, WriteData(entry, 1, 18000, buffer1, kSize, false));
719 entry->Close();
720
721 // Write something else and verify old data.
722 ASSERT_EQ(net::OK, OpenEntry(key, &entry));
723 EXPECT_EQ(kSize, WriteData(entry, 1, 10000, buffer1, kSize, false));
724 CacheTestFillBuffer(buffer2->data(), kSize, true);
725 EXPECT_EQ(kSize, ReadData(entry, 1, 5000, buffer2, kSize));
726 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize));
727 CacheTestFillBuffer(buffer2->data(), kSize, true);
728 EXPECT_EQ(kSize, ReadData(entry, 1, 0, buffer2, kSize));
729 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize));
730 CacheTestFillBuffer(buffer2->data(), kSize, true);
731 EXPECT_EQ(kSize, ReadData(entry, 1, 18000, buffer2, kSize));
732 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize));
733
734 // Extend the file some more.
735 EXPECT_EQ(kSize, WriteData(entry, 1, 23000, buffer1, kSize, false));
736 entry->Close();
737
738 // And now make sure that we can deal with data in both places (ram/disk).
739 ASSERT_EQ(net::OK, OpenEntry(key, &entry));
740 EXPECT_EQ(kSize, WriteData(entry, 1, 17000, buffer1, kSize, false));
741
742 // We should not overwrite the data at 18000 with this.
743 EXPECT_EQ(kSize, WriteData(entry, 1, 19000, buffer1, kSize, false));
744 CacheTestFillBuffer(buffer2->data(), kSize, true);
745 EXPECT_EQ(kSize, ReadData(entry, 1, 18000, buffer2, kSize));
746 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize));
747 CacheTestFillBuffer(buffer2->data(), kSize, true);
748 EXPECT_EQ(kSize, ReadData(entry, 1, 17000, buffer2, kSize));
749 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize));
750
751 EXPECT_EQ(kSize, WriteData(entry, 1, 22900, buffer1, kSize, false));
752 CacheTestFillBuffer(buffer2->data(), kSize, true);
753 EXPECT_EQ(100, ReadData(entry, 1, 23000, buffer2, kSize));
754 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data() + 100, 100));
755
756 CacheTestFillBuffer(buffer2->data(), kSize, true);
757 EXPECT_EQ(100, ReadData(entry, 1, 23100, buffer2, kSize));
758 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data() + 100, 100));
759
760 entry->Close();
761 }
762
763 // Some extra tests to make sure that buffering works properly when changing
764 // the entry size.
765 TEST_F(DiskCacheEntryTest, SizeChanges) {
766 InitCache();
767 std::string key("the first key");
768 disk_cache::Entry* entry;
769 ASSERT_EQ(net::OK, CreateEntry(key, &entry));
770
771 const int kSize = 200;
772 const char zeros[kSize] = {};
773 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize);
774 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize);
775 CacheTestFillBuffer(buffer1->data(), kSize, true);
776 CacheTestFillBuffer(buffer2->data(), kSize, true);
777
778 EXPECT_EQ(kSize, WriteData(entry, 1, 0, buffer1, kSize, true));
779 EXPECT_EQ(kSize, WriteData(entry, 1, 17000, buffer1, kSize, true));
780 EXPECT_EQ(kSize, WriteData(entry, 1, 23000, buffer1, kSize, true));
781 entry->Close();
782
783 // Extend the file and read between the old size and the new write.
784 ASSERT_EQ(net::OK, OpenEntry(key, &entry));
785 EXPECT_EQ(23000 + kSize, entry->GetDataSize(1));
786 EXPECT_EQ(kSize, WriteData(entry, 1, 25000, buffer1, kSize, true));
787 EXPECT_EQ(25000 + kSize, entry->GetDataSize(1));
788 EXPECT_EQ(kSize, ReadData(entry, 1, 24000, buffer2, kSize));
789 EXPECT_TRUE(!memcmp(buffer2->data(), zeros, kSize));
790
791 // Read at the end of the old file size.
792 EXPECT_EQ(35, ReadData(entry, 1, 23000 + kSize - 35, buffer2, kSize));
793 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data() + kSize - 35, 35));
794
795 // Read slightly before the last write.
796 CacheTestFillBuffer(buffer2->data(), kSize, true);
797 EXPECT_EQ(kSize, ReadData(entry, 1, 24900, buffer2, kSize));
798 EXPECT_TRUE(!memcmp(buffer2->data(), zeros, 100));
799 EXPECT_TRUE(!memcmp(buffer2->data() + 100, buffer1->data(), kSize - 100));
800
801 // Extend the entry a little more.
802 EXPECT_EQ(kSize, WriteData(entry, 1, 26000, buffer1, kSize, true));
803 EXPECT_EQ(26000 + kSize, entry->GetDataSize(1));
804 CacheTestFillBuffer(buffer2->data(), kSize, true);
805 EXPECT_EQ(kSize, ReadData(entry, 1, 25900, buffer2, kSize));
806 EXPECT_TRUE(!memcmp(buffer2->data(), zeros, 100));
807 EXPECT_TRUE(!memcmp(buffer2->data() + 100, buffer1->data(), kSize - 100));
808
809 // And now reduce the size.
810 EXPECT_EQ(kSize, WriteData(entry, 1, 25000, buffer1, kSize, true));
811 EXPECT_EQ(25000 + kSize, entry->GetDataSize(1));
812 EXPECT_EQ(28, ReadData(entry, 1, 25000 + kSize - 28, buffer2, kSize));
813 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data() + kSize - 28, 28));
814
815 // Reduce the size with a buffer that is not extending the size.
816 EXPECT_EQ(kSize, WriteData(entry, 1, 24000, buffer1, kSize, false));
817 EXPECT_EQ(25000 + kSize, entry->GetDataSize(1));
818 EXPECT_EQ(kSize, WriteData(entry, 1, 24500, buffer1, kSize, true));
819 EXPECT_EQ(24500 + kSize, entry->GetDataSize(1));
820 EXPECT_EQ(kSize, ReadData(entry, 1, 23900, buffer2, kSize));
821 EXPECT_TRUE(!memcmp(buffer2->data(), zeros, 100));
822 EXPECT_TRUE(!memcmp(buffer2->data() + 100, buffer1->data(), kSize - 100));
823
824 // And now reduce the size below the old size.
825 EXPECT_EQ(kSize, WriteData(entry, 1, 19000, buffer1, kSize, true));
826 EXPECT_EQ(19000 + kSize, entry->GetDataSize(1));
827 EXPECT_EQ(kSize, ReadData(entry, 1, 18900, buffer2, kSize));
828 EXPECT_TRUE(!memcmp(buffer2->data(), zeros, 100));
829 EXPECT_TRUE(!memcmp(buffer2->data() + 100, buffer1->data(), kSize - 100));
830
831 // Verify that the actual file is truncated.
832 entry->Close();
833 ASSERT_EQ(net::OK, OpenEntry(key, &entry));
834 EXPECT_EQ(19000 + kSize, entry->GetDataSize(1));
835
836 entry->Close();
837 }
838
648 // Write more than the total cache capacity but to a single entry. |size| is the 839 // Write more than the total cache capacity but to a single entry. |size| is the
649 // amount of bytes to write each time. 840 // amount of bytes to write each time.
650 void DiskCacheEntryTest::ReuseEntry(int size) { 841 void DiskCacheEntryTest::ReuseEntry(int size) {
651 std::string key1("the first key"); 842 std::string key1("the first key");
652 disk_cache::Entry *entry; 843 disk_cache::Entry* entry;
653 ASSERT_EQ(net::OK, CreateEntry(key1, &entry)); 844 ASSERT_EQ(net::OK, CreateEntry(key1, &entry));
654 845
655 entry->Close(); 846 entry->Close();
656 std::string key2("the second key"); 847 std::string key2("the second key");
657 ASSERT_EQ(net::OK, CreateEntry(key2, &entry)); 848 ASSERT_EQ(net::OK, CreateEntry(key2, &entry));
658 849
659 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(size); 850 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(size);
660 CacheTestFillBuffer(buffer->data(), size, false); 851 CacheTestFillBuffer(buffer->data(), size, false);
661 852
662 for (int i = 0; i < 15; i++) { 853 for (int i = 0; i < 15; i++) {
663 EXPECT_EQ(0, entry->WriteData(0, 0, buffer, 0, NULL, true)); 854 EXPECT_EQ(0, WriteData(entry, 0, 0, buffer, 0, true));
664 EXPECT_EQ(size, entry->WriteData(0, 0, buffer, size, NULL, false)); 855 EXPECT_EQ(size, WriteData(entry, 0, 0, buffer, size, false));
665 entry->Close(); 856 entry->Close();
666 ASSERT_EQ(net::OK, OpenEntry(key2, &entry)); 857 ASSERT_EQ(net::OK, OpenEntry(key2, &entry));
667 } 858 }
668 859
669 entry->Close(); 860 entry->Close();
670 ASSERT_EQ(net::OK, OpenEntry(key1, &entry)) << "have not evicted this entry"; 861 ASSERT_EQ(net::OK, OpenEntry(key1, &entry)) << "have not evicted this entry";
671 entry->Close(); 862 entry->Close();
672 } 863 }
673 864
674 TEST_F(DiskCacheEntryTest, ReuseExternalEntry) { 865 TEST_F(DiskCacheEntryTest, ReuseExternalEntry) {
(...skipping 21 matching lines...) Expand all
696 TEST_F(DiskCacheEntryTest, MemoryOnlyReuseInternalEntry) { 887 TEST_F(DiskCacheEntryTest, MemoryOnlyReuseInternalEntry) {
697 SetDirectMode(); 888 SetDirectMode();
698 SetMemoryOnlyMode(); 889 SetMemoryOnlyMode();
699 SetMaxSize(100 * 1024); 890 SetMaxSize(100 * 1024);
700 InitCache(); 891 InitCache();
701 ReuseEntry(10 * 1024); 892 ReuseEntry(10 * 1024);
702 } 893 }
703 894
704 // Reading somewhere that was not written should return zeros. 895 // Reading somewhere that was not written should return zeros.
705 void DiskCacheEntryTest::InvalidData() { 896 void DiskCacheEntryTest::InvalidData() {
706 std::string key1("the first key"); 897 std::string key("the first key");
707 disk_cache::Entry *entry1; 898 disk_cache::Entry* entry;
708 ASSERT_EQ(net::OK, CreateEntry(key1, &entry1)); 899 ASSERT_EQ(net::OK, CreateEntry(key, &entry));
709 900
710 const int kSize1 = 20000; 901 const int kSize1 = 20000;
711 const int kSize2 = 20000; 902 const int kSize2 = 20000;
712 const int kSize3 = 20000; 903 const int kSize3 = 20000;
713 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize1); 904 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize1);
714 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize2); 905 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize2);
715 scoped_refptr<net::IOBuffer> buffer3 = new net::IOBuffer(kSize3); 906 scoped_refptr<net::IOBuffer> buffer3 = new net::IOBuffer(kSize3);
716 907
717 CacheTestFillBuffer(buffer1->data(), kSize1, false); 908 CacheTestFillBuffer(buffer1->data(), kSize1, false);
718 memset(buffer2->data(), 0, kSize2); 909 memset(buffer2->data(), 0, kSize2);
719 910
720 // Simple data grow: 911 // Simple data grow:
721 EXPECT_EQ(200, entry1->WriteData(0, 400, buffer1, 200, NULL, false)); 912 EXPECT_EQ(200, WriteData(entry, 0, 400, buffer1, 200, false));
722 EXPECT_EQ(600, entry1->GetDataSize(0)); 913 EXPECT_EQ(600, entry->GetDataSize(0));
723 EXPECT_EQ(100, entry1->ReadData(0, 300, buffer3, 100, NULL)); 914 EXPECT_EQ(100, ReadData(entry, 0, 300, buffer3, 100));
724 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 100)); 915 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 100));
725 entry1->Close(); 916 entry->Close();
726 ASSERT_EQ(net::OK, OpenEntry(key1, &entry1)); 917 ASSERT_EQ(net::OK, OpenEntry(key, &entry));
727 918
728 // The entry is now on disk. Load it and extend it. 919 // The entry is now on disk. Load it and extend it.
729 EXPECT_EQ(200, entry1->WriteData(0, 800, buffer1, 200, NULL, false)); 920 EXPECT_EQ(200, WriteData(entry, 0, 800, buffer1, 200, false));
730 EXPECT_EQ(1000, entry1->GetDataSize(0)); 921 EXPECT_EQ(1000, entry->GetDataSize(0));
731 EXPECT_EQ(100, entry1->ReadData(0, 700, buffer3, 100, NULL)); 922 EXPECT_EQ(100, ReadData(entry, 0, 700, buffer3, 100));
732 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 100)); 923 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 100));
733 entry1->Close(); 924 entry->Close();
734 ASSERT_EQ(net::OK, OpenEntry(key1, &entry1)); 925 ASSERT_EQ(net::OK, OpenEntry(key, &entry));
735 926
736 // This time using truncate. 927 // This time using truncate.
737 EXPECT_EQ(200, entry1->WriteData(0, 1800, buffer1, 200, NULL, true)); 928 EXPECT_EQ(200, WriteData(entry, 0, 1800, buffer1, 200, true));
738 EXPECT_EQ(2000, entry1->GetDataSize(0)); 929 EXPECT_EQ(2000, entry->GetDataSize(0));
739 EXPECT_EQ(100, entry1->ReadData(0, 1500, buffer3, 100, NULL)); 930 EXPECT_EQ(100, ReadData(entry, 0, 1500, buffer3, 100));
740 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 100)); 931 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 100));
741 932
742 // Go to an external file. 933 // Go to an external file.
743 EXPECT_EQ(200, entry1->WriteData(0, 19800, buffer1, 200, NULL, false)); 934 EXPECT_EQ(200, WriteData(entry, 0, 19800, buffer1, 200, false));
744 EXPECT_EQ(20000, entry1->GetDataSize(0)); 935 EXPECT_EQ(20000, entry->GetDataSize(0));
745 EXPECT_EQ(4000, entry1->ReadData(0, 14000, buffer3, 4000, NULL)); 936 EXPECT_EQ(4000, ReadData(entry, 0, 14000, buffer3, 4000));
746 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 4000)); 937 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 4000));
747 938
748 // And back to an internal block. 939 // And back to an internal block.
749 EXPECT_EQ(600, entry1->WriteData(0, 1000, buffer1, 600, NULL, true)); 940 EXPECT_EQ(600, WriteData(entry, 0, 1000, buffer1, 600, true));
750 EXPECT_EQ(1600, entry1->GetDataSize(0)); 941 EXPECT_EQ(1600, entry->GetDataSize(0));
751 EXPECT_EQ(600, entry1->ReadData(0, 1000, buffer3, 600, NULL)); 942 EXPECT_EQ(600, ReadData(entry, 0, 1000, buffer3, 600));
752 EXPECT_TRUE(!memcmp(buffer3->data(), buffer1->data(), 600)); 943 EXPECT_TRUE(!memcmp(buffer3->data(), buffer1->data(), 600));
753 944
754 // Extend it again. 945 // Extend it again.
755 EXPECT_EQ(600, entry1->WriteData(0, 2000, buffer1, 600, NULL, false)); 946 EXPECT_EQ(600, WriteData(entry, 0, 2000, buffer1, 600, false));
756 EXPECT_EQ(2600, entry1->GetDataSize(0)); 947 EXPECT_EQ(2600, entry->GetDataSize(0));
757 EXPECT_EQ(200, entry1->ReadData(0, 1800, buffer3, 200, NULL)); 948 EXPECT_EQ(200, ReadData(entry, 0, 1800, buffer3, 200));
758 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 200)); 949 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 200));
759 950
760 // And again (with truncation flag). 951 // And again (with truncation flag).
761 EXPECT_EQ(600, entry1->WriteData(0, 3000, buffer1, 600, NULL, true)); 952 EXPECT_EQ(600, WriteData(entry, 0, 3000, buffer1, 600, true));
762 EXPECT_EQ(3600, entry1->GetDataSize(0)); 953 EXPECT_EQ(3600, entry->GetDataSize(0));
763 EXPECT_EQ(200, entry1->ReadData(0, 2800, buffer3, 200, NULL)); 954 EXPECT_EQ(200, ReadData(entry, 0, 2800, buffer3, 200));
764 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 200)); 955 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 200));
765 956
766 entry1->Close(); 957 entry->Close();
767 } 958 }
768 959
769 TEST_F(DiskCacheEntryTest, InvalidData) { 960 TEST_F(DiskCacheEntryTest, InvalidData) {
770 InitCache(); 961 InitCache();
771 InvalidData(); 962 InvalidData();
772 } 963 }
773 964
774 TEST_F(DiskCacheEntryTest, MemoryOnlyInvalidData) { 965 TEST_F(DiskCacheEntryTest, MemoryOnlyInvalidData) {
775 SetMemoryOnlyMode(); 966 SetMemoryOnlyMode();
776 InitCache(); 967 InitCache();
777 InvalidData(); 968 InvalidData();
778 } 969 }
779 970
780 void DiskCacheEntryTest::DoomNormalEntry() { 971 void DiskCacheEntryTest::DoomNormalEntry() {
781 std::string key1("the first key"); 972 std::string key("the first key");
782 disk_cache::Entry *entry1; 973 disk_cache::Entry* entry;
783 ASSERT_EQ(net::OK, CreateEntry(key1, &entry1)); 974 ASSERT_EQ(net::OK, CreateEntry(key, &entry));
784 entry1->Doom(); 975 entry->Doom();
785 entry1->Close(); 976 entry->Close();
786 977
787 const int kSize = 20000; 978 const int kSize = 20000;
788 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kSize); 979 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kSize);
789 CacheTestFillBuffer(buffer->data(), kSize, true); 980 CacheTestFillBuffer(buffer->data(), kSize, true);
790 buffer->data()[19999] = '\0'; 981 buffer->data()[19999] = '\0';
791 982
792 key1 = buffer->data(); 983 key = buffer->data();
793 ASSERT_EQ(net::OK, CreateEntry(key1, &entry1)); 984 ASSERT_EQ(net::OK, CreateEntry(key, &entry));
794 EXPECT_EQ(20000, entry1->WriteData(0, 0, buffer, kSize, NULL, false)); 985 EXPECT_EQ(20000, WriteData(entry, 0, 0, buffer, kSize, false));
795 EXPECT_EQ(20000, entry1->WriteData(1, 0, buffer, kSize, NULL, false)); 986 EXPECT_EQ(20000, WriteData(entry, 1, 0, buffer, kSize, false));
796 entry1->Doom(); 987 entry->Doom();
797 entry1->Close(); 988 entry->Close();
798 989
799 FlushQueueForTest(); 990 FlushQueueForTest();
800 EXPECT_EQ(0, cache_->GetEntryCount()); 991 EXPECT_EQ(0, cache_->GetEntryCount());
801 } 992 }
802 993
803 TEST_F(DiskCacheEntryTest, DoomEntry) { 994 TEST_F(DiskCacheEntryTest, DoomEntry) {
804 SetDirectMode(); 995 SetDirectMode();
805 InitCache(); 996 InitCache();
806 DoomNormalEntry(); 997 DoomNormalEntry();
807 } 998 }
808 999
809 TEST_F(DiskCacheEntryTest, MemoryOnlyDoomEntry) { 1000 TEST_F(DiskCacheEntryTest, MemoryOnlyDoomEntry) {
810 SetMemoryOnlyMode(); 1001 SetMemoryOnlyMode();
811 InitCache(); 1002 InitCache();
812 DoomNormalEntry(); 1003 DoomNormalEntry();
813 } 1004 }
814 1005
815 // Verify that basic operations work as expected with doomed entries. 1006 // Verify that basic operations work as expected with doomed entries.
816 void DiskCacheEntryTest::DoomedEntry() { 1007 void DiskCacheEntryTest::DoomedEntry() {
817 std::string key("the first key"); 1008 std::string key("the first key");
818 disk_cache::Entry *entry; 1009 disk_cache::Entry* entry;
819 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 1010 ASSERT_EQ(net::OK, CreateEntry(key, &entry));
820 entry->Doom(); 1011 entry->Doom();
821 1012
822 FlushQueueForTest(); 1013 FlushQueueForTest();
823 EXPECT_EQ(0, cache_->GetEntryCount()); 1014 EXPECT_EQ(0, cache_->GetEntryCount());
824 Time initial = Time::Now(); 1015 Time initial = Time::Now();
825 PlatformThread::Sleep(20); 1016 PlatformThread::Sleep(20);
826 1017
827 const int kSize1 = 2000; 1018 const int kSize1 = 2000;
828 const int kSize2 = 2000; 1019 const int kSize2 = 2000;
829 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize1); 1020 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize1);
830 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize2); 1021 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize2);
831 CacheTestFillBuffer(buffer1->data(), kSize1, false); 1022 CacheTestFillBuffer(buffer1->data(), kSize1, false);
832 memset(buffer2->data(), 0, kSize2); 1023 memset(buffer2->data(), 0, kSize2);
833 1024
834 EXPECT_EQ(2000, entry->WriteData(0, 0, buffer1, 2000, NULL, false)); 1025 EXPECT_EQ(2000, WriteData(entry, 0, 0, buffer1, 2000, false));
835 EXPECT_EQ(2000, entry->ReadData(0, 0, buffer2, 2000, NULL)); 1026 EXPECT_EQ(2000, ReadData(entry, 0, 0, buffer2, 2000));
836 EXPECT_EQ(0, memcmp(buffer1->data(), buffer2->data(), kSize1)); 1027 EXPECT_EQ(0, memcmp(buffer1->data(), buffer2->data(), kSize1));
837 EXPECT_EQ(key, entry->GetKey()); 1028 EXPECT_EQ(key, entry->GetKey());
838 EXPECT_TRUE(initial < entry->GetLastModified()); 1029 EXPECT_TRUE(initial < entry->GetLastModified());
839 EXPECT_TRUE(initial < entry->GetLastUsed()); 1030 EXPECT_TRUE(initial < entry->GetLastUsed());
840 1031
841 entry->Close(); 1032 entry->Close();
842 } 1033 }
843 1034
844 TEST_F(DiskCacheEntryTest, DoomedEntry) { 1035 TEST_F(DiskCacheEntryTest, DoomedEntry) {
845 SetDirectMode(); 1036 SetDirectMode();
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
885 disk_cache::MemEntryImpl* mem_entry = 1076 disk_cache::MemEntryImpl* mem_entry =
886 reinterpret_cast<disk_cache::MemEntryImpl*>(entry); 1077 reinterpret_cast<disk_cache::MemEntryImpl*>(entry);
887 EXPECT_EQ(disk_cache::MemEntryImpl::kParentEntry, mem_entry->type()); 1078 EXPECT_EQ(disk_cache::MemEntryImpl::kParentEntry, mem_entry->type());
888 mem_entry->Close(); 1079 mem_entry->Close();
889 } 1080 }
890 EXPECT_EQ(1, count); 1081 EXPECT_EQ(1, count);
891 } 1082 }
892 1083
893 // Writes |buf_1| to offset and reads it back as |buf_2|. 1084 // Writes |buf_1| to offset and reads it back as |buf_2|.
894 void VerifySparseIO(disk_cache::Entry* entry, int64 offset, 1085 void VerifySparseIO(disk_cache::Entry* entry, int64 offset,
895 net::IOBuffer* buf_1, int size, bool async, 1086 net::IOBuffer* buf_1, int size, net::IOBuffer* buf_2) {
896 net::IOBuffer* buf_2) { 1087 TestCompletionCallback cb;
897 TestCompletionCallback callback;
898 TestCompletionCallback* cb = async ? &callback : NULL;
899 1088
900 memset(buf_2->data(), 0, size); 1089 memset(buf_2->data(), 0, size);
901 int ret = entry->ReadSparseData(offset, buf_2, size, cb); 1090 int ret = entry->ReadSparseData(offset, buf_2, size, &cb);
902 ret = callback.GetResult(ret); 1091 EXPECT_EQ(0, cb.GetResult(ret));
903 EXPECT_EQ(0, ret);
904 1092
905 ret = entry->WriteSparseData(offset, buf_1, size, cb); 1093 ret = entry->WriteSparseData(offset, buf_1, size, &cb);
906 ret = callback.GetResult(ret); 1094 EXPECT_EQ(size, cb.GetResult(ret));
907 EXPECT_EQ(size, ret);
908 1095
909 ret = entry->ReadSparseData(offset, buf_2, size, cb); 1096 ret = entry->ReadSparseData(offset, buf_2, size, &cb);
910 ret = callback.GetResult(ret); 1097 EXPECT_EQ(size, cb.GetResult(ret));
911 EXPECT_EQ(size, ret);
912 1098
913 EXPECT_EQ(0, memcmp(buf_1->data(), buf_2->data(), size)); 1099 EXPECT_EQ(0, memcmp(buf_1->data(), buf_2->data(), size));
914 } 1100 }
915 1101
916 // Reads |size| bytes from |entry| at |offset| and verifies that they are the 1102 // Reads |size| bytes from |entry| at |offset| and verifies that they are the
917 // same as the content of the provided |buffer|. 1103 // same as the content of the provided |buffer|.
918 void VerifyContentSparseIO(disk_cache::Entry* entry, int64 offset, char* buffer, 1104 void VerifyContentSparseIO(disk_cache::Entry* entry, int64 offset, char* buffer,
919 int size, bool async) { 1105 int size) {
920 TestCompletionCallback callback; 1106 TestCompletionCallback cb;
921 TestCompletionCallback* cb = async ? &callback : NULL;
922 1107
923 scoped_refptr<net::IOBuffer> buf_1 = new net::IOBuffer(size); 1108 scoped_refptr<net::IOBuffer> buf_1 = new net::IOBuffer(size);
924 memset(buf_1->data(), 0, size); 1109 memset(buf_1->data(), 0, size);
925 int ret = entry->ReadSparseData(offset, buf_1, size, cb); 1110 int ret = entry->ReadSparseData(offset, buf_1, size, &cb);
926 ret = callback.GetResult(ret); 1111 EXPECT_EQ(size, cb.GetResult(ret));
927 EXPECT_EQ(size, ret);
928 1112
929 EXPECT_EQ(0, memcmp(buf_1->data(), buffer, size)); 1113 EXPECT_EQ(0, memcmp(buf_1->data(), buffer, size));
930 } 1114 }
931 1115
932 void DiskCacheEntryTest::BasicSparseIO(bool async) { 1116 void DiskCacheEntryTest::BasicSparseIO() {
933 std::string key("the first key"); 1117 std::string key("the first key");
934 disk_cache::Entry* entry; 1118 disk_cache::Entry* entry;
935 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 1119 ASSERT_EQ(net::OK, CreateEntry(key, &entry));
936 1120
937 const int kSize = 2048; 1121 const int kSize = 2048;
938 scoped_refptr<net::IOBuffer> buf_1 = new net::IOBuffer(kSize); 1122 scoped_refptr<net::IOBuffer> buf_1 = new net::IOBuffer(kSize);
939 scoped_refptr<net::IOBuffer> buf_2 = new net::IOBuffer(kSize); 1123 scoped_refptr<net::IOBuffer> buf_2 = new net::IOBuffer(kSize);
940 CacheTestFillBuffer(buf_1->data(), kSize, false); 1124 CacheTestFillBuffer(buf_1->data(), kSize, false);
941 1125
942 // Write at offset 0. 1126 // Write at offset 0.
943 VerifySparseIO(entry, 0, buf_1, kSize, async, buf_2); 1127 VerifySparseIO(entry, 0, buf_1, kSize, buf_2);
944 1128
945 // Write at offset 0x400000 (4 MB). 1129 // Write at offset 0x400000 (4 MB).
946 VerifySparseIO(entry, 0x400000, buf_1, kSize, async, buf_2); 1130 VerifySparseIO(entry, 0x400000, buf_1, kSize, buf_2);
947 1131
948 // Write at offset 0x800000000 (32 GB). 1132 // Write at offset 0x800000000 (32 GB).
949 VerifySparseIO(entry, 0x800000000LL, buf_1, kSize, async, buf_2); 1133 VerifySparseIO(entry, 0x800000000LL, buf_1, kSize, buf_2);
950 1134
951 entry->Close(); 1135 entry->Close();
952 1136
953 // Check everything again. 1137 // Check everything again.
954 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 1138 ASSERT_EQ(net::OK, OpenEntry(key, &entry));
955 VerifyContentSparseIO(entry, 0, buf_1->data(), kSize, async); 1139 VerifyContentSparseIO(entry, 0, buf_1->data(), kSize);
956 VerifyContentSparseIO(entry, 0x400000, buf_1->data(), kSize, async); 1140 VerifyContentSparseIO(entry, 0x400000, buf_1->data(), kSize);
957 VerifyContentSparseIO(entry, 0x800000000LL, buf_1->data(), kSize, async); 1141 VerifyContentSparseIO(entry, 0x800000000LL, buf_1->data(), kSize);
958 entry->Close(); 1142 entry->Close();
959 } 1143 }
960 1144
961 TEST_F(DiskCacheEntryTest, BasicSparseSyncIO) { 1145 TEST_F(DiskCacheEntryTest, BasicSparseIO) {
962 InitCache(); 1146 InitCache();
963 BasicSparseIO(false); 1147 BasicSparseIO();
964 } 1148 }
965 1149
966 TEST_F(DiskCacheEntryTest, MemoryOnlyBasicSparseSyncIO) { 1150 TEST_F(DiskCacheEntryTest, MemoryOnlyBasicSparseIO) {
967 SetMemoryOnlyMode(); 1151 SetMemoryOnlyMode();
968 InitCache(); 1152 InitCache();
969 BasicSparseIO(false); 1153 BasicSparseIO();
970 } 1154 }
971 1155
972 TEST_F(DiskCacheEntryTest, BasicSparseAsyncIO) { 1156 void DiskCacheEntryTest::HugeSparseIO() {
973 InitCache();
974 BasicSparseIO(true);
975 }
976
977 TEST_F(DiskCacheEntryTest, MemoryOnlyBasicSparseAsyncIO) {
978 SetMemoryOnlyMode();
979 InitCache();
980 BasicSparseIO(true);
981 }
982
983 void DiskCacheEntryTest::HugeSparseIO(bool async) {
984 std::string key("the first key"); 1157 std::string key("the first key");
985 disk_cache::Entry* entry; 1158 disk_cache::Entry* entry;
986 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 1159 ASSERT_EQ(net::OK, CreateEntry(key, &entry));
987 1160
988 // Write 1.2 MB so that we cover multiple entries. 1161 // Write 1.2 MB so that we cover multiple entries.
989 const int kSize = 1200 * 1024; 1162 const int kSize = 1200 * 1024;
990 scoped_refptr<net::IOBuffer> buf_1 = new net::IOBuffer(kSize); 1163 scoped_refptr<net::IOBuffer> buf_1 = new net::IOBuffer(kSize);
991 scoped_refptr<net::IOBuffer> buf_2 = new net::IOBuffer(kSize); 1164 scoped_refptr<net::IOBuffer> buf_2 = new net::IOBuffer(kSize);
992 CacheTestFillBuffer(buf_1->data(), kSize, false); 1165 CacheTestFillBuffer(buf_1->data(), kSize, false);
993 1166
994 // Write at offset 0x20F0000 (33 MB - 64 KB). 1167 // Write at offset 0x20F0000 (33 MB - 64 KB).
995 VerifySparseIO(entry, 0x20F0000, buf_1, kSize, async, buf_2); 1168 VerifySparseIO(entry, 0x20F0000, buf_1, kSize, buf_2);
996 entry->Close(); 1169 entry->Close();
997 1170
998 // Check it again. 1171 // Check it again.
999 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 1172 ASSERT_EQ(net::OK, OpenEntry(key, &entry));
1000 VerifyContentSparseIO(entry, 0x20F0000, buf_1->data(), kSize, async); 1173 VerifyContentSparseIO(entry, 0x20F0000, buf_1->data(), kSize);
1001 entry->Close(); 1174 entry->Close();
1002 } 1175 }
1003 1176
1004 TEST_F(DiskCacheEntryTest, HugeSparseSyncIO) { 1177 TEST_F(DiskCacheEntryTest, HugeSparseIO) {
1005 InitCache(); 1178 InitCache();
1006 HugeSparseIO(false); 1179 HugeSparseIO();
1007 } 1180 }
1008 1181
1009 TEST_F(DiskCacheEntryTest, MemoryOnlyHugeSparseSyncIO) { 1182 TEST_F(DiskCacheEntryTest, MemoryOnlyHugeSparseIO) {
1010 SetMemoryOnlyMode(); 1183 SetMemoryOnlyMode();
1011 InitCache(); 1184 InitCache();
1012 HugeSparseIO(false); 1185 HugeSparseIO();
1013 }
1014
1015 TEST_F(DiskCacheEntryTest, HugeSparseAsyncIO) {
1016 InitCache();
1017 HugeSparseIO(true);
1018 }
1019
1020 TEST_F(DiskCacheEntryTest, MemoryOnlyHugeSparseAsyncIO) {
1021 SetMemoryOnlyMode();
1022 InitCache();
1023 HugeSparseIO(true);
1024 } 1186 }
1025 1187
1026 void DiskCacheEntryTest::GetAvailableRange() { 1188 void DiskCacheEntryTest::GetAvailableRange() {
1027 std::string key("the first key"); 1189 std::string key("the first key");
1028 disk_cache::Entry* entry; 1190 disk_cache::Entry* entry;
1029 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 1191 ASSERT_EQ(net::OK, CreateEntry(key, &entry));
1030 1192
1031 const int kSize = 16 * 1024; 1193 const int kSize = 16 * 1024;
1032 scoped_refptr<net::IOBuffer> buf = new net::IOBuffer(kSize); 1194 scoped_refptr<net::IOBuffer> buf = new net::IOBuffer(kSize);
1033 CacheTestFillBuffer(buf->data(), kSize, false); 1195 CacheTestFillBuffer(buf->data(), kSize, false);
1034 1196
1035 // Write at offset 0x20F0000 (33 MB - 64 KB), and 0x20F4400 (33 MB - 47 KB). 1197 // Write at offset 0x20F0000 (33 MB - 64 KB), and 0x20F4400 (33 MB - 47 KB).
1036 EXPECT_EQ(kSize, entry->WriteSparseData(0x20F0000, buf, kSize, NULL)); 1198 EXPECT_EQ(kSize, WriteSparseData(entry, 0x20F0000, buf, kSize));
1037 EXPECT_EQ(kSize, entry->WriteSparseData(0x20F4400, buf, kSize, NULL)); 1199 EXPECT_EQ(kSize, WriteSparseData(entry, 0x20F4400, buf, kSize));
1038 1200
1039 // We stop at the first empty block. 1201 // We stop at the first empty block.
1040 int64 start; 1202 int64 start;
1041 TestCompletionCallback cb; 1203 TestCompletionCallback cb;
1042 int rv = entry->GetAvailableRange(0x20F0000, kSize * 2, &start, &cb); 1204 int rv = entry->GetAvailableRange(0x20F0000, kSize * 2, &start, &cb);
1043 EXPECT_EQ(kSize, cb.GetResult(rv)); 1205 EXPECT_EQ(kSize, cb.GetResult(rv));
1044 EXPECT_EQ(0x20F0000, start); 1206 EXPECT_EQ(0x20F0000, start);
1045 1207
1046 start = 0; 1208 start = 0;
1047 rv = entry->GetAvailableRange(0, kSize, &start, &cb); 1209 rv = entry->GetAvailableRange(0, kSize, &start, &cb);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1088 void DiskCacheEntryTest::CouldBeSparse() { 1250 void DiskCacheEntryTest::CouldBeSparse() {
1089 std::string key("the first key"); 1251 std::string key("the first key");
1090 disk_cache::Entry* entry; 1252 disk_cache::Entry* entry;
1091 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 1253 ASSERT_EQ(net::OK, CreateEntry(key, &entry));
1092 1254
1093 const int kSize = 16 * 1024; 1255 const int kSize = 16 * 1024;
1094 scoped_refptr<net::IOBuffer> buf = new net::IOBuffer(kSize); 1256 scoped_refptr<net::IOBuffer> buf = new net::IOBuffer(kSize);
1095 CacheTestFillBuffer(buf->data(), kSize, false); 1257 CacheTestFillBuffer(buf->data(), kSize, false);
1096 1258
1097 // Write at offset 0x20F0000 (33 MB - 64 KB). 1259 // Write at offset 0x20F0000 (33 MB - 64 KB).
1098 EXPECT_EQ(kSize, entry->WriteSparseData(0x20F0000, buf, kSize, NULL)); 1260 EXPECT_EQ(kSize, WriteSparseData(entry, 0x20F0000, buf, kSize));
1099 1261
1100 EXPECT_TRUE(entry->CouldBeSparse()); 1262 EXPECT_TRUE(entry->CouldBeSparse());
1101 entry->Close(); 1263 entry->Close();
1102 1264
1103 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 1265 ASSERT_EQ(net::OK, OpenEntry(key, &entry));
1104 EXPECT_TRUE(entry->CouldBeSparse()); 1266 EXPECT_TRUE(entry->CouldBeSparse());
1105 entry->Close(); 1267 entry->Close();
1106 1268
1107 // Now verify a regular entry. 1269 // Now verify a regular entry.
1108 key.assign("another key"); 1270 key.assign("another key");
1109 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 1271 ASSERT_EQ(net::OK, CreateEntry(key, &entry));
1110 EXPECT_FALSE(entry->CouldBeSparse()); 1272 EXPECT_FALSE(entry->CouldBeSparse());
1111 1273
1112 EXPECT_EQ(kSize, entry->WriteData(0, 0, buf, kSize, NULL, false)); 1274 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buf, kSize, false));
1113 EXPECT_EQ(kSize, entry->WriteData(1, 0, buf, kSize, NULL, false)); 1275 EXPECT_EQ(kSize, WriteData(entry, 1, 0, buf, kSize, false));
1114 EXPECT_EQ(kSize, entry->WriteData(2, 0, buf, kSize, NULL, false)); 1276 EXPECT_EQ(kSize, WriteData(entry, 2, 0, buf, kSize, false));
1115 1277
1116 EXPECT_FALSE(entry->CouldBeSparse()); 1278 EXPECT_FALSE(entry->CouldBeSparse());
1117 entry->Close(); 1279 entry->Close();
1118 1280
1119 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 1281 ASSERT_EQ(net::OK, OpenEntry(key, &entry));
1120 EXPECT_FALSE(entry->CouldBeSparse()); 1282 EXPECT_FALSE(entry->CouldBeSparse());
1121 entry->Close(); 1283 entry->Close();
1122 } 1284 }
1123 1285
1124 TEST_F(DiskCacheEntryTest, CouldBeSparse) { 1286 TEST_F(DiskCacheEntryTest, CouldBeSparse) {
(...skipping 17 matching lines...) Expand all
1142 CacheTestFillBuffer(buf_1->data(), kSize, false); 1304 CacheTestFillBuffer(buf_1->data(), kSize, false);
1143 1305
1144 std::string key("the first key"); 1306 std::string key("the first key");
1145 disk_cache::Entry* entry; 1307 disk_cache::Entry* entry;
1146 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 1308 ASSERT_EQ(net::OK, CreateEntry(key, &entry));
1147 1309
1148 // This loop writes back to back starting from offset 0 and 9000. 1310 // This loop writes back to back starting from offset 0 and 9000.
1149 for (int i = 0; i < kSize; i += 1024) { 1311 for (int i = 0; i < kSize; i += 1024) {
1150 scoped_refptr<net::WrappedIOBuffer> buf_3 = 1312 scoped_refptr<net::WrappedIOBuffer> buf_3 =
1151 new net::WrappedIOBuffer(buf_1->data() + i); 1313 new net::WrappedIOBuffer(buf_1->data() + i);
1152 VerifySparseIO(entry, i, buf_3, 1024, false, buf_2); 1314 VerifySparseIO(entry, i, buf_3, 1024, buf_2);
1153 VerifySparseIO(entry, 9000 + i, buf_3, 1024, false, buf_2); 1315 VerifySparseIO(entry, 9000 + i, buf_3, 1024, buf_2);
1154 } 1316 }
1155 1317
1156 // Make sure we have data written. 1318 // Make sure we have data written.
1157 VerifyContentSparseIO(entry, 0, buf_1->data(), kSize, false); 1319 VerifyContentSparseIO(entry, 0, buf_1->data(), kSize);
1158 VerifyContentSparseIO(entry, 9000, buf_1->data(), kSize, false); 1320 VerifyContentSparseIO(entry, 9000, buf_1->data(), kSize);
1159 1321
1160 // This tests a large write that spans 3 entries from a misaligned offset. 1322 // This tests a large write that spans 3 entries from a misaligned offset.
1161 VerifySparseIO(entry, 20481, buf_1, 8192, false, buf_2); 1323 VerifySparseIO(entry, 20481, buf_1, 8192, buf_2);
1162 1324
1163 entry->Close(); 1325 entry->Close();
1164 } 1326 }
1165 1327
1166 TEST_F(DiskCacheEntryTest, MemoryOnlyMisalignedGetAvailableRange) { 1328 TEST_F(DiskCacheEntryTest, MemoryOnlyMisalignedGetAvailableRange) {
1167 SetMemoryOnlyMode(); 1329 SetMemoryOnlyMode();
1168 InitCache(); 1330 InitCache();
1169 1331
1170 const int kSize = 8192; 1332 const int kSize = 8192;
1171 scoped_refptr<net::IOBuffer> buf = new net::IOBuffer(kSize); 1333 scoped_refptr<net::IOBuffer> buf = new net::IOBuffer(kSize);
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
1345 // We should be able to deal with IO that is not aligned to the block size 1507 // We should be able to deal with IO that is not aligned to the block size
1346 // of a sparse entry, at least to write a big range without leaving holes. 1508 // of a sparse entry, at least to write a big range without leaving holes.
1347 const int kSize = 4 * 1024; 1509 const int kSize = 4 * 1024;
1348 const int kSmallSize = 128; 1510 const int kSmallSize = 128;
1349 scoped_refptr<net::IOBuffer> buf1 = new net::IOBuffer(kSize); 1511 scoped_refptr<net::IOBuffer> buf1 = new net::IOBuffer(kSize);
1350 CacheTestFillBuffer(buf1->data(), kSize, false); 1512 CacheTestFillBuffer(buf1->data(), kSize, false);
1351 1513
1352 // The first write is just to extend the entry. The third write occupies 1514 // The first write is just to extend the entry. The third write occupies
1353 // a 1KB block partially, it may not be written internally depending on the 1515 // a 1KB block partially, it may not be written internally depending on the
1354 // implementation. 1516 // implementation.
1355 EXPECT_EQ(kSize, entry->WriteSparseData(20000, buf1, kSize, NULL)); 1517 EXPECT_EQ(kSize, WriteSparseData(entry, 20000, buf1, kSize));
1356 EXPECT_EQ(kSize, entry->WriteSparseData(500, buf1, kSize, NULL)); 1518 EXPECT_EQ(kSize, WriteSparseData(entry, 500, buf1, kSize));
1357 EXPECT_EQ(kSmallSize, 1519 EXPECT_EQ(kSmallSize, WriteSparseData(entry, 1080321, buf1, kSmallSize));
1358 entry->WriteSparseData(1080321, buf1, kSmallSize, NULL));
1359 entry->Close(); 1520 entry->Close();
1360 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 1521 ASSERT_EQ(net::OK, OpenEntry(key, &entry));
1361 1522
1362 scoped_refptr<net::IOBuffer> buf2 = new net::IOBuffer(kSize); 1523 scoped_refptr<net::IOBuffer> buf2 = new net::IOBuffer(kSize);
1363 memset(buf2->data(), 0, kSize); 1524 memset(buf2->data(), 0, kSize);
1364 EXPECT_EQ(0, entry->ReadSparseData(8000, buf2, kSize, NULL)); 1525 EXPECT_EQ(0, entry->ReadSparseData(8000, buf2, kSize, NULL));
1365 1526
1366 EXPECT_EQ(500, entry->ReadSparseData(kSize, buf2, kSize, NULL)); 1527 EXPECT_EQ(500, ReadSparseData(entry, kSize, buf2, kSize));
1367 EXPECT_EQ(0, memcmp(buf2->data(), buf1->data() + kSize - 500, 500)); 1528 EXPECT_EQ(0, memcmp(buf2->data(), buf1->data() + kSize - 500, 500));
1368 EXPECT_EQ(0, entry->ReadSparseData(0, buf2, kSize, NULL)); 1529 EXPECT_EQ(0, ReadSparseData(entry, 0, buf2, kSize));
1369 1530
1370 // This read should not change anything. 1531 // This read should not change anything.
1371 EXPECT_EQ(96, entry->ReadSparseData(24000, buf2, kSize, NULL)); 1532 EXPECT_EQ(96, ReadSparseData(entry, 24000, buf2, kSize));
1372 EXPECT_EQ(500, entry->ReadSparseData(kSize, buf2, kSize, NULL)); 1533 EXPECT_EQ(500, ReadSparseData(entry, kSize, buf2, kSize));
1373 EXPECT_EQ(0, entry->ReadSparseData(499, buf2, kSize, NULL)); 1534 EXPECT_EQ(0, ReadSparseData(entry, 99, buf2, kSize));
1374 1535
1375 int rv; 1536 int rv;
1376 int64 start; 1537 int64 start;
1377 TestCompletionCallback cb; 1538 TestCompletionCallback cb;
1378 if (memory_only_) { 1539 if (memory_only_) {
1379 rv = entry->GetAvailableRange(0, 600, &start, &cb); 1540 rv = entry->GetAvailableRange(0, 600, &start, &cb);
1380 EXPECT_EQ(100, cb.GetResult(rv)); 1541 EXPECT_EQ(100, cb.GetResult(rv));
1381 EXPECT_EQ(500, start); 1542 EXPECT_EQ(500, start);
1382 } else { 1543 } else {
1383 rv = entry->GetAvailableRange(0, 2048, &start, &cb); 1544 rv = entry->GetAvailableRange(0, 2048, &start, &cb);
(...skipping 20 matching lines...) Expand all
1404 EXPECT_EQ(20480, start); 1565 EXPECT_EQ(20480, start);
1405 } 1566 }
1406 rv = entry->GetAvailableRange(3073, kSize, &start, &cb); 1567 rv = entry->GetAvailableRange(3073, kSize, &start, &cb);
1407 EXPECT_EQ(1523, cb.GetResult(rv)); 1568 EXPECT_EQ(1523, cb.GetResult(rv));
1408 EXPECT_EQ(3073, start); 1569 EXPECT_EQ(3073, start);
1409 rv = entry->GetAvailableRange(4600, kSize, &start, &cb); 1570 rv = entry->GetAvailableRange(4600, kSize, &start, &cb);
1410 EXPECT_EQ(0, cb.GetResult(rv)); 1571 EXPECT_EQ(0, cb.GetResult(rv));
1411 EXPECT_EQ(4600, start); 1572 EXPECT_EQ(4600, start);
1412 1573
1413 // Now make another write and verify that there is no hole in between. 1574 // Now make another write and verify that there is no hole in between.
1414 EXPECT_EQ(kSize, entry->WriteSparseData(500 + kSize, buf1, kSize, NULL)); 1575 EXPECT_EQ(kSize, WriteSparseData(entry, 500 + kSize, buf1, kSize));
1415 rv = entry->GetAvailableRange(1024, 10000, &start, &cb); 1576 rv = entry->GetAvailableRange(1024, 10000, &start, &cb);
1416 EXPECT_EQ(7 * 1024 + 500, cb.GetResult(rv)); 1577 EXPECT_EQ(7 * 1024 + 500, cb.GetResult(rv));
1417 EXPECT_EQ(1024, start); 1578 EXPECT_EQ(1024, start);
1418 EXPECT_EQ(kSize, entry->ReadSparseData(kSize, buf2, kSize, NULL)); 1579 EXPECT_EQ(kSize, ReadSparseData(entry, kSize, buf2, kSize));
1419 EXPECT_EQ(0, memcmp(buf2->data(), buf1->data() + kSize - 500, 500)); 1580 EXPECT_EQ(0, memcmp(buf2->data(), buf1->data() + kSize - 500, 500));
1420 EXPECT_EQ(0, memcmp(buf2->data() + 500, buf1->data(), kSize - 500)); 1581 EXPECT_EQ(0, memcmp(buf2->data() + 500, buf1->data(), kSize - 500));
1421 1582
1422 entry->Close(); 1583 entry->Close();
1423 } 1584 }
1424 1585
1425 TEST_F(DiskCacheEntryTest, PartialSparseEntry) { 1586 TEST_F(DiskCacheEntryTest, PartialSparseEntry) {
1426 InitCache(); 1587 InitCache();
1427 PartialSparseEntry(); 1588 PartialSparseEntry();
1428 } 1589 }
1429 1590
1430 TEST_F(DiskCacheEntryTest, MemoryPartialSparseEntry) { 1591 TEST_F(DiskCacheEntryTest, MemoryPartialSparseEntry) {
1431 SetMemoryOnlyMode(); 1592 SetMemoryOnlyMode();
1432 InitCache(); 1593 InitCache();
1433 PartialSparseEntry(); 1594 PartialSparseEntry();
1434 } 1595 }
1435 1596
1436 // Tests that corrupt sparse children are removed automatically. 1597 // Tests that corrupt sparse children are removed automatically.
1437 TEST_F(DiskCacheEntryTest, CleanupSparseEntry) { 1598 TEST_F(DiskCacheEntryTest, CleanupSparseEntry) {
1438 InitCache(); 1599 InitCache();
1439 std::string key("the first key"); 1600 std::string key("the first key");
1440 disk_cache::Entry* entry; 1601 disk_cache::Entry* entry;
1441 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 1602 ASSERT_EQ(net::OK, CreateEntry(key, &entry));
1442 1603
1443 const int kSize = 4 * 1024; 1604 const int kSize = 4 * 1024;
1444 scoped_refptr<net::IOBuffer> buf1 = new net::IOBuffer(kSize); 1605 scoped_refptr<net::IOBuffer> buf1 = new net::IOBuffer(kSize);
1445 CacheTestFillBuffer(buf1->data(), kSize, false); 1606 CacheTestFillBuffer(buf1->data(), kSize, false);
1446 1607
1447 const int k1Meg = 1024 * 1024; 1608 const int k1Meg = 1024 * 1024;
1448 EXPECT_EQ(kSize, entry->WriteSparseData(8192, buf1, kSize, NULL)); 1609 EXPECT_EQ(kSize, WriteSparseData(entry, 8192, buf1, kSize));
1449 EXPECT_EQ(kSize, entry->WriteSparseData(k1Meg + 8192, buf1, kSize, NULL)); 1610 EXPECT_EQ(kSize, WriteSparseData(entry, k1Meg + 8192, buf1, kSize));
1450 EXPECT_EQ(kSize, entry->WriteSparseData(2 * k1Meg + 8192, buf1, kSize, NULL)); 1611 EXPECT_EQ(kSize, WriteSparseData(entry, 2 * k1Meg + 8192, buf1, kSize));
1451 entry->Close(); 1612 entry->Close();
1452 EXPECT_EQ(4, cache_->GetEntryCount()); 1613 EXPECT_EQ(4, cache_->GetEntryCount());
1453 1614
1454 void* iter = NULL; 1615 void* iter = NULL;
1455 int count = 0; 1616 int count = 0;
1456 std::string child_key[2]; 1617 std::string child_key[2];
1457 while (OpenNextEntry(&iter, &entry) == net::OK) { 1618 while (OpenNextEntry(&iter, &entry) == net::OK) {
1458 ASSERT_TRUE(entry != NULL); 1619 ASSERT_TRUE(entry != NULL);
1459 // Writing to an entry will alter the LRU list and invalidate the iterator. 1620 // Writing to an entry will alter the LRU list and invalidate the iterator.
1460 if (entry->GetKey() != key && count < 2) 1621 if (entry->GetKey() != key && count < 2)
1461 child_key[count++] = entry->GetKey(); 1622 child_key[count++] = entry->GetKey();
1462 entry->Close(); 1623 entry->Close();
1463 } 1624 }
1464 for (int i = 0; i < 2; i++) { 1625 for (int i = 0; i < 2; i++) {
1465 ASSERT_EQ(net::OK, OpenEntry(child_key[i], &entry)); 1626 ASSERT_EQ(net::OK, OpenEntry(child_key[i], &entry));
1466 // Overwrite the header's magic and signature. 1627 // Overwrite the header's magic and signature.
1467 EXPECT_EQ(12, entry->WriteData(2, 0, buf1, 12, NULL, false)); 1628 EXPECT_EQ(12, WriteData(entry, 2, 0, buf1, 12, false));
1468 entry->Close(); 1629 entry->Close();
1469 } 1630 }
1470 1631
1471 EXPECT_EQ(4, cache_->GetEntryCount()); 1632 EXPECT_EQ(4, cache_->GetEntryCount());
1472 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 1633 ASSERT_EQ(net::OK, OpenEntry(key, &entry));
1473 1634
1474 // Two children should be gone. One while reading and one while writing. 1635 // Two children should be gone. One while reading and one while writing.
1475 EXPECT_EQ(0, entry->ReadSparseData(2 * k1Meg + 8192, buf1, kSize, NULL)); 1636 EXPECT_EQ(0, ReadSparseData(entry, 2 * k1Meg + 8192, buf1, kSize));
1476 EXPECT_EQ(kSize, entry->WriteSparseData(k1Meg + 16384, buf1, kSize, NULL)); 1637 EXPECT_EQ(kSize, WriteSparseData(entry, k1Meg + 16384, buf1, kSize));
1477 EXPECT_EQ(0, entry->ReadSparseData(k1Meg + 8192, buf1, kSize, NULL)); 1638 EXPECT_EQ(0, ReadSparseData(entry, k1Meg + 8192, buf1, kSize));
1478 1639
1479 // We never touched this one. 1640 // We never touched this one.
1480 EXPECT_EQ(kSize, entry->ReadSparseData(8192, buf1, kSize, NULL)); 1641 EXPECT_EQ(kSize, ReadSparseData(entry, 8192, buf1, kSize));
1481 entry->Close(); 1642 entry->Close();
1482 1643
1483 // We re-created one of the corrupt children. 1644 // We re-created one of the corrupt children.
1484 EXPECT_EQ(3, cache_->GetEntryCount()); 1645 EXPECT_EQ(3, cache_->GetEntryCount());
1485 } 1646 }
1486 1647
1487 TEST_F(DiskCacheEntryTest, CancelSparseIO) { 1648 TEST_F(DiskCacheEntryTest, CancelSparseIO) {
1488 UseCurrentThread(); 1649 UseCurrentThread();
1489 InitCache(); 1650 InitCache();
1490 std::string key("the first key"); 1651 std::string key("the first key");
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1528 rv = cb1.WaitForResult(); 1689 rv = cb1.WaitForResult();
1529 EXPECT_TRUE(rv == 4096 || rv == kSize); 1690 EXPECT_TRUE(rv == 4096 || rv == kSize);
1530 EXPECT_EQ(net::OK, cb2.WaitForResult()); 1691 EXPECT_EQ(net::OK, cb2.WaitForResult());
1531 EXPECT_EQ(net::OK, cb3.WaitForResult()); 1692 EXPECT_EQ(net::OK, cb3.WaitForResult());
1532 EXPECT_EQ(net::OK, cb4.WaitForResult()); 1693 EXPECT_EQ(net::OK, cb4.WaitForResult());
1533 1694
1534 rv = entry->GetAvailableRange(offset, kSize, &offset, &cb5); 1695 rv = entry->GetAvailableRange(offset, kSize, &offset, &cb5);
1535 EXPECT_EQ(0, cb5.GetResult(rv)); 1696 EXPECT_EQ(0, cb5.GetResult(rv));
1536 entry->Close(); 1697 entry->Close();
1537 } 1698 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698