OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |