OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2013, Google Inc. All rights reserved. | 2 * Copyright (c) 2013, Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 replaceMemoryCacheForTesting(m_globalMemoryCache.release()); | 87 replaceMemoryCacheForTesting(m_globalMemoryCache.release()); |
88 } | 88 } |
89 | 89 |
90 Persistent<MemoryCache> m_globalMemoryCache; | 90 Persistent<MemoryCache> m_globalMemoryCache; |
91 }; | 91 }; |
92 | 92 |
93 // Verifies that setters and getters for cache capacities work correcty. | 93 // Verifies that setters and getters for cache capacities work correcty. |
94 TEST_F(MemoryCacheTest, CapacityAccounting) { | 94 TEST_F(MemoryCacheTest, CapacityAccounting) { |
95 const size_t sizeMax = ~static_cast<size_t>(0); | 95 const size_t sizeMax = ~static_cast<size_t>(0); |
96 const size_t totalCapacity = sizeMax / 4; | 96 const size_t totalCapacity = sizeMax / 4; |
97 const size_t minDeadCapacity = sizeMax / 16; | 97 memoryCache()->setCapacity(totalCapacity); |
98 const size_t maxDeadCapacity = sizeMax / 8; | |
99 memoryCache()->setCapacities(minDeadCapacity, maxDeadCapacity, totalCapacity); | |
100 EXPECT_EQ(totalCapacity, memoryCache()->capacity()); | 98 EXPECT_EQ(totalCapacity, memoryCache()->capacity()); |
101 EXPECT_EQ(minDeadCapacity, memoryCache()->minDeadCapacity()); | |
102 EXPECT_EQ(maxDeadCapacity, memoryCache()->maxDeadCapacity()); | |
103 } | 99 } |
104 | 100 |
105 TEST_F(MemoryCacheTest, VeryLargeResourceAccounting) { | 101 TEST_F(MemoryCacheTest, VeryLargeResourceAccounting) { |
106 const size_t sizeMax = ~static_cast<size_t>(0); | 102 const size_t sizeMax = ~static_cast<size_t>(0); |
107 const size_t totalCapacity = sizeMax / 4; | 103 const size_t totalCapacity = sizeMax / 4; |
108 const size_t minDeadCapacity = sizeMax / 16; | |
109 const size_t maxDeadCapacity = sizeMax / 8; | |
110 const size_t resourceSize1 = sizeMax / 16; | 104 const size_t resourceSize1 = sizeMax / 16; |
111 const size_t resourceSize2 = sizeMax / 20; | 105 const size_t resourceSize2 = sizeMax / 20; |
112 memoryCache()->setCapacities(minDeadCapacity, maxDeadCapacity, totalCapacity); | 106 memoryCache()->setCapacity(totalCapacity); |
113 FakeResource* cachedResource = FakeResource::create( | 107 FakeResource* cachedResource = FakeResource::create( |
114 ResourceRequest("http://test/resource"), Resource::Raw); | 108 ResourceRequest("http://test/resource"), Resource::Raw); |
115 cachedResource->fakeEncodedSize(resourceSize1); | 109 cachedResource->fakeEncodedSize(resourceSize1); |
116 | 110 |
117 EXPECT_EQ(0u, memoryCache()->deadSize()); | 111 EXPECT_EQ(0u, memoryCache()->size()); |
118 EXPECT_EQ(0u, memoryCache()->liveSize()); | |
119 memoryCache()->add(cachedResource); | 112 memoryCache()->add(cachedResource); |
120 EXPECT_EQ(cachedResource->size(), memoryCache()->deadSize()); | 113 EXPECT_EQ(cachedResource->size(), memoryCache()->size()); |
121 EXPECT_EQ(0u, memoryCache()->liveSize()); | |
122 | 114 |
123 Persistent<MockResourceClient> client = | 115 Persistent<MockResourceClient> client = |
124 new MockResourceClient(cachedResource); | 116 new MockResourceClient(cachedResource); |
125 EXPECT_EQ(0u, memoryCache()->deadSize()); | 117 EXPECT_EQ(cachedResource->size(), memoryCache()->size()); |
126 EXPECT_EQ(cachedResource->size(), memoryCache()->liveSize()); | |
127 | 118 |
128 cachedResource->fakeEncodedSize(resourceSize2); | 119 cachedResource->fakeEncodedSize(resourceSize2); |
129 EXPECT_EQ(0u, memoryCache()->deadSize()); | 120 EXPECT_EQ(cachedResource->size(), memoryCache()->size()); |
130 EXPECT_EQ(cachedResource->size(), memoryCache()->liveSize()); | |
131 } | 121 } |
132 | 122 |
133 // Verifies that dead resources that exceed dead resource capacity are evicted | 123 static void runTask1(Resource* resource1, Resource* resource2) { |
134 // from cache when pruning. | |
135 static void TestDeadResourceEviction(Resource* resource1, Resource* resource2) { | |
136 memoryCache()->setDelayBeforeLiveDecodedPrune(0); | |
137 memoryCache()->setMaxPruneDeferralDelay(0); | |
138 const unsigned totalCapacity = 1000000; | |
139 const unsigned minDeadCapacity = 0; | |
140 const unsigned maxDeadCapacity = 0; | |
141 memoryCache()->setCapacities(minDeadCapacity, maxDeadCapacity, totalCapacity); | |
142 | |
143 const char data[5] = "abcd"; | |
144 resource1->appendData(data, 3u); | |
145 resource2->appendData(data, 2u); | |
146 | |
147 // The resource size has to be nonzero for this test to be meaningful, but | 124 // The resource size has to be nonzero for this test to be meaningful, but |
148 // we do not rely on it having any particular value. | 125 // we do not rely on it having any particular value. |
149 EXPECT_GT(resource1->size(), 0u); | 126 EXPECT_GT(resource1->size(), 0u); |
150 EXPECT_GT(resource2->size(), 0u); | 127 EXPECT_GT(resource2->size(), 0u); |
151 | 128 |
152 EXPECT_EQ(0u, memoryCache()->deadSize()); | 129 EXPECT_EQ(0u, memoryCache()->size()); |
153 EXPECT_EQ(0u, memoryCache()->liveSize()); | |
154 | 130 |
155 memoryCache()->add(resource1); | 131 memoryCache()->add(resource1); |
156 EXPECT_EQ(resource1->size(), memoryCache()->deadSize()); | 132 memoryCache()->add(resource2); |
157 EXPECT_EQ(0u, memoryCache()->liveSize()); | |
158 | 133 |
159 memoryCache()->add(resource2); | 134 size_t totalSize = resource1->size() + resource2->size(); |
160 EXPECT_EQ(resource1->size() + resource2->size(), memoryCache()->deadSize()); | 135 EXPECT_EQ(totalSize, memoryCache()->size()); |
161 EXPECT_EQ(0u, memoryCache()->liveSize()); | 136 EXPECT_GT(resource1->decodedSize(), 0u); |
| 137 EXPECT_GT(resource2->decodedSize(), 0u); |
162 | 138 |
| 139 // We expect actual pruning doesn't occur here synchronously but deferred |
| 140 // to the end of this task, due to the previous pruning invoked in |
| 141 // TestLiveResourceEvictionAtEndOfTask(). |
163 memoryCache()->prune(); | 142 memoryCache()->prune(); |
164 EXPECT_EQ(0u, memoryCache()->deadSize()); | 143 EXPECT_EQ(totalSize, memoryCache()->size()); |
165 EXPECT_EQ(0u, memoryCache()->liveSize()); | 144 EXPECT_GT(resource1->decodedSize(), 0u); |
| 145 EXPECT_GT(resource2->decodedSize(), 0u); |
166 } | 146 } |
167 | 147 |
168 TEST_F(MemoryCacheTest, DeadResourceEviction_Basic) { | 148 static void runTask2(unsigned sizeWithoutDecode) { |
169 Resource* resource1 = RawResource::create( | 149 // Next task: now, the live resource was evicted. |
170 ResourceRequest("http://test/resource1"), Resource::Raw); | 150 EXPECT_EQ(sizeWithoutDecode, memoryCache()->size()); |
171 Resource* resource2 = RawResource::create( | |
172 ResourceRequest("http://test/resource2"), Resource::Raw); | |
173 TestDeadResourceEviction(resource1, resource2); | |
174 } | 151 } |
175 | 152 |
176 TEST_F(MemoryCacheTest, DeadResourceEviction_MultipleResourceMaps) { | 153 static void TestLiveResourceEvictionAtEndOfTask(Resource* resource1, |
177 Resource* resource1 = RawResource::create( | 154 Resource* resource2) { |
178 ResourceRequest("http://test/resource1"), Resource::Raw); | 155 memoryCache()->setDelayBeforeLiveDecodedPrune(0); |
179 Resource* resource2 = RawResource::create( | |
180 ResourceRequest("http://test/resource2"), Resource::Raw); | |
181 resource2->setCacheIdentifier("foo"); | |
182 TestDeadResourceEviction(resource1, resource2); | |
183 } | |
184 | 156 |
185 static void runTask1(Resource* live, Resource* dead) { | 157 // Enforce pruning by adding |dummyResource| and then call prune(). |
186 // The resource size has to be nonzero for this test to be meaningful, but | 158 Resource* dummyResource = |
187 // we do not rely on it having any particular value. | 159 RawResource::create(ResourceRequest("http://dummy"), Resource::Raw); |
188 EXPECT_GT(live->size(), 0u); | 160 memoryCache()->add(dummyResource); |
189 EXPECT_GT(dead->size(), 0u); | 161 EXPECT_GT(memoryCache()->size(), 1u); |
| 162 const unsigned totalCapacity = 1; |
| 163 memoryCache()->setCapacity(totalCapacity); |
| 164 memoryCache()->prune(); |
| 165 memoryCache()->remove(dummyResource); |
| 166 EXPECT_EQ(0u, memoryCache()->size()); |
190 | 167 |
191 EXPECT_EQ(0u, memoryCache()->deadSize()); | |
192 EXPECT_EQ(0u, memoryCache()->liveSize()); | |
193 | |
194 memoryCache()->add(dead); | |
195 memoryCache()->add(live); | |
196 memoryCache()->updateDecodedResource(live, UpdateForPropertyChange); | |
197 EXPECT_EQ(dead->size(), memoryCache()->deadSize()); | |
198 EXPECT_EQ(live->size(), memoryCache()->liveSize()); | |
199 EXPECT_GT(live->decodedSize(), 0u); | |
200 | |
201 memoryCache()->prune(); // Dead resources are pruned immediately | |
202 EXPECT_EQ(dead->size(), memoryCache()->deadSize()); | |
203 EXPECT_EQ(live->size(), memoryCache()->liveSize()); | |
204 EXPECT_GT(live->decodedSize(), 0u); | |
205 } | |
206 | |
207 static void runTask2(unsigned liveSizeWithoutDecode) { | |
208 // Next task: now, the live resource was evicted. | |
209 EXPECT_EQ(0u, memoryCache()->deadSize()); | |
210 EXPECT_EQ(liveSizeWithoutDecode, memoryCache()->liveSize()); | |
211 } | |
212 | |
213 static void TestLiveResourceEvictionAtEndOfTask(Resource* cachedDeadResource, | |
214 Resource* cachedLiveResource) { | |
215 memoryCache()->setDelayBeforeLiveDecodedPrune(0); | |
216 const unsigned totalCapacity = 1; | |
217 const unsigned minDeadCapacity = 0; | |
218 const unsigned maxDeadCapacity = 0; | |
219 memoryCache()->setCapacities(minDeadCapacity, maxDeadCapacity, totalCapacity); | |
220 const char data[6] = "abcde"; | 168 const char data[6] = "abcde"; |
221 cachedDeadResource->appendData(data, 3u); | 169 resource1->appendData(data, 3u); |
222 cachedDeadResource->finish(); | 170 resource1->finish(); |
223 Persistent<MockResourceClient> client = | 171 Persistent<MockResourceClient> client = new MockResourceClient(resource2); |
224 new MockResourceClient(cachedLiveResource); | 172 resource2->appendData(data, 4u); |
225 cachedLiveResource->appendData(data, 4u); | 173 resource2->finish(); |
226 cachedLiveResource->finish(); | |
227 | 174 |
228 Platform::current()->currentThread()->getWebTaskRunner()->postTask( | 175 Platform::current()->currentThread()->getWebTaskRunner()->postTask( |
229 BLINK_FROM_HERE, WTF::bind(&runTask1, wrapPersistent(cachedLiveResource), | 176 BLINK_FROM_HERE, WTF::bind(&runTask1, wrapPersistent(resource1), |
230 wrapPersistent(cachedDeadResource))); | 177 wrapPersistent(resource2))); |
231 Platform::current()->currentThread()->getWebTaskRunner()->postTask( | 178 Platform::current()->currentThread()->getWebTaskRunner()->postTask( |
232 BLINK_FROM_HERE, | 179 BLINK_FROM_HERE, |
233 WTF::bind(&runTask2, cachedLiveResource->encodedSize() + | 180 WTF::bind(&runTask2, |
234 cachedLiveResource->overheadSize())); | 181 resource1->encodedSize() + resource1->overheadSize() + |
| 182 resource2->encodedSize() + resource2->overheadSize())); |
235 testing::runPendingTasks(); | 183 testing::runPendingTasks(); |
236 } | 184 } |
237 | 185 |
238 // Verified that when ordering a prune in a runLoop task, the prune | 186 // Verified that when ordering a prune in a runLoop task, the prune |
239 // is deferred to the end of the task. | 187 // is deferred to the end of the task. |
240 TEST_F(MemoryCacheTest, LiveResourceEvictionAtEndOfTask_Basic) { | 188 TEST_F(MemoryCacheTest, LiveResourceEvictionAtEndOfTask_Basic) { |
241 Resource* cachedDeadResource = | 189 Resource* resource1 = FakeDecodedResource::create( |
242 RawResource::create(ResourceRequest("hhtp://foo"), Resource::Raw); | 190 ResourceRequest("http://test/resource1"), Resource::Raw); |
243 Resource* cachedLiveResource = FakeDecodedResource::create( | 191 Resource* resource2 = FakeDecodedResource::create( |
244 ResourceRequest("http://test/resource"), Resource::Raw); | 192 ResourceRequest("http://test/resource2"), Resource::Raw); |
245 TestLiveResourceEvictionAtEndOfTask(cachedDeadResource, cachedLiveResource); | 193 TestLiveResourceEvictionAtEndOfTask(resource1, resource2); |
246 } | 194 } |
247 | 195 |
248 TEST_F(MemoryCacheTest, LiveResourceEvictionAtEndOfTask_MultipleResourceMaps) { | 196 TEST_F(MemoryCacheTest, LiveResourceEvictionAtEndOfTask_MultipleResourceMaps) { |
249 { | 197 { |
250 Resource* cachedDeadResource = | 198 Resource* resource1 = FakeDecodedResource::create( |
251 RawResource::create(ResourceRequest("hhtp://foo"), Resource::Raw); | 199 ResourceRequest("http://test/resource1"), Resource::Raw); |
252 cachedDeadResource->setCacheIdentifier("foo"); | 200 Resource* resource2 = FakeDecodedResource::create( |
253 Resource* cachedLiveResource = FakeDecodedResource::create( | 201 ResourceRequest("http://test/resource2"), Resource::Raw); |
254 ResourceRequest("http://test/resource"), Resource::Raw); | 202 resource1->setCacheIdentifier("foo"); |
255 TestLiveResourceEvictionAtEndOfTask(cachedDeadResource, cachedLiveResource); | 203 TestLiveResourceEvictionAtEndOfTask(resource1, resource2); |
256 memoryCache()->evictResources(); | 204 memoryCache()->evictResources(); |
257 } | 205 } |
258 { | 206 { |
259 Resource* cachedDeadResource = | 207 Resource* resource1 = FakeDecodedResource::create( |
260 RawResource::create(ResourceRequest("hhtp://foo"), Resource::Raw); | 208 ResourceRequest("http://test/resource1"), Resource::Raw); |
261 Resource* cachedLiveResource = FakeDecodedResource::create( | 209 Resource* resource2 = FakeDecodedResource::create( |
262 ResourceRequest("http://test/resource"), Resource::Raw); | 210 ResourceRequest("http://test/resource2"), Resource::Raw); |
263 cachedLiveResource->setCacheIdentifier("foo"); | 211 resource1->setCacheIdentifier("foo"); |
264 TestLiveResourceEvictionAtEndOfTask(cachedDeadResource, cachedLiveResource); | 212 resource2->setCacheIdentifier("bar"); |
265 memoryCache()->evictResources(); | 213 TestLiveResourceEvictionAtEndOfTask(resource1, resource2); |
266 } | |
267 { | |
268 Resource* cachedDeadResource = RawResource::create( | |
269 ResourceRequest("hhtp://test/resource"), Resource::Raw); | |
270 cachedDeadResource->setCacheIdentifier("foo"); | |
271 Resource* cachedLiveResource = FakeDecodedResource::create( | |
272 ResourceRequest("http://test/resource"), Resource::Raw); | |
273 cachedLiveResource->setCacheIdentifier("bar"); | |
274 TestLiveResourceEvictionAtEndOfTask(cachedDeadResource, cachedLiveResource); | |
275 memoryCache()->evictResources(); | 214 memoryCache()->evictResources(); |
276 } | 215 } |
277 } | 216 } |
278 | 217 |
279 // Verifies that cached resources are evicted immediately after release when | 218 // Verifies that |
280 // the total dead resource size is more than double the dead resource capacity. | 219 // - Resources are not evicted synchronously when ResourceClient is removed. |
| 220 // - size() is updated appropriately when Resources are added to MemoryCache |
| 221 // and garbage collected. |
281 static void TestClientRemoval(Resource* resource1, Resource* resource2) { | 222 static void TestClientRemoval(Resource* resource1, Resource* resource2) { |
282 const char data[6] = "abcde"; | 223 const char data[6] = "abcde"; |
283 Persistent<MockResourceClient> client1 = new MockResourceClient(resource1); | 224 Persistent<MockResourceClient> client1 = new MockResourceClient(resource1); |
284 resource1->appendData(data, 4u); | 225 resource1->appendData(data, 4u); |
285 Persistent<MockResourceClient> client2 = new MockResourceClient(resource2); | 226 Persistent<MockResourceClient> client2 = new MockResourceClient(resource2); |
286 resource2->appendData(data, 4u); | 227 resource2->appendData(data, 4u); |
287 | 228 |
288 const unsigned minDeadCapacity = 0; | 229 memoryCache()->setCapacity(0); |
289 const unsigned maxDeadCapacity = | |
290 ((resource1->size() + resource2->size()) / 2) - 1; | |
291 const unsigned totalCapacity = maxDeadCapacity; | |
292 memoryCache()->setCapacities(minDeadCapacity, maxDeadCapacity, totalCapacity); | |
293 memoryCache()->add(resource1); | 230 memoryCache()->add(resource1); |
294 memoryCache()->add(resource2); | 231 memoryCache()->add(resource2); |
| 232 |
| 233 size_t originalTotalSize = resource1->size() + resource2->size(); |
| 234 |
295 // Call prune. There is nothing to prune, but this will initialize | 235 // Call prune. There is nothing to prune, but this will initialize |
296 // the prune timestamp, allowing future prunes to be deferred. | 236 // the prune timestamp, allowing future prunes to be deferred. |
297 memoryCache()->prune(); | 237 memoryCache()->prune(); |
298 EXPECT_GT(resource1->decodedSize(), 0u); | 238 EXPECT_GT(resource1->decodedSize(), 0u); |
299 EXPECT_GT(resource2->decodedSize(), 0u); | 239 EXPECT_GT(resource2->decodedSize(), 0u); |
300 EXPECT_EQ(0u, memoryCache()->deadSize()); | 240 EXPECT_EQ(originalTotalSize, memoryCache()->size()); |
301 EXPECT_EQ(resource1->size() + resource2->size(), memoryCache()->liveSize()); | |
302 | 241 |
303 // Removing the client from resource1 should not trigger pruning. | 242 // Removing the client from resource1 should not trigger pruning. |
304 client1->removeAsClient(); | 243 client1->removeAsClient(); |
305 EXPECT_GT(resource1->decodedSize(), 0u); | 244 EXPECT_GT(resource1->decodedSize(), 0u); |
306 EXPECT_GT(resource2->decodedSize(), 0u); | 245 EXPECT_GT(resource2->decodedSize(), 0u); |
307 EXPECT_EQ(resource1->size(), memoryCache()->deadSize()); | 246 EXPECT_EQ(originalTotalSize, memoryCache()->size()); |
308 EXPECT_EQ(resource2->size(), memoryCache()->liveSize()); | |
309 EXPECT_TRUE(memoryCache()->contains(resource1)); | 247 EXPECT_TRUE(memoryCache()->contains(resource1)); |
310 EXPECT_TRUE(memoryCache()->contains(resource2)); | 248 EXPECT_TRUE(memoryCache()->contains(resource2)); |
311 | 249 |
312 // Removing the client from resource2 should not trigger pruning. | 250 // Removing the client from resource2 should not trigger pruning. |
313 client2->removeAsClient(); | 251 client2->removeAsClient(); |
314 EXPECT_GT(resource1->decodedSize(), 0u); | 252 EXPECT_GT(resource1->decodedSize(), 0u); |
315 EXPECT_GT(resource2->decodedSize(), 0u); | 253 EXPECT_GT(resource2->decodedSize(), 0u); |
316 EXPECT_EQ(resource1->size() + resource2->size(), memoryCache()->deadSize()); | 254 EXPECT_EQ(originalTotalSize, memoryCache()->size()); |
317 EXPECT_EQ(0u, memoryCache()->liveSize()); | |
318 EXPECT_TRUE(memoryCache()->contains(resource1)); | 255 EXPECT_TRUE(memoryCache()->contains(resource1)); |
319 EXPECT_TRUE(memoryCache()->contains(resource2)); | 256 EXPECT_TRUE(memoryCache()->contains(resource2)); |
320 | 257 |
321 WeakPersistent<Resource> resource1Weak = resource1; | 258 WeakPersistent<Resource> resource1Weak = resource1; |
322 WeakPersistent<Resource> resource2Weak = resource2; | 259 WeakPersistent<Resource> resource2Weak = resource2; |
323 | 260 |
324 ThreadState::current()->collectGarbage( | 261 ThreadState::current()->collectGarbage( |
325 BlinkGC::NoHeapPointersOnStack, BlinkGC::GCWithSweep, BlinkGC::ForcedGC); | 262 BlinkGC::NoHeapPointersOnStack, BlinkGC::GCWithSweep, BlinkGC::ForcedGC); |
326 // Resources are garbage-collected (WeakMemoryCache) and thus removed | 263 // Resources are garbage-collected (WeakMemoryCache) and thus removed |
327 // from MemoryCache. | 264 // from MemoryCache. |
328 EXPECT_FALSE(resource1Weak); | 265 EXPECT_FALSE(resource1Weak); |
329 EXPECT_FALSE(resource2Weak); | 266 EXPECT_FALSE(resource2Weak); |
330 EXPECT_EQ(0u, memoryCache()->deadSize()); | 267 EXPECT_EQ(0u, memoryCache()->size()); |
331 EXPECT_EQ(0u, memoryCache()->liveSize()); | |
332 } | 268 } |
333 | 269 |
334 TEST_F(MemoryCacheTest, ClientRemoval_Basic) { | 270 TEST_F(MemoryCacheTest, ClientRemoval_Basic) { |
335 Resource* resource1 = FakeDecodedResource::create( | 271 Resource* resource1 = FakeDecodedResource::create( |
336 ResourceRequest("http://foo.com"), Resource::Raw); | 272 ResourceRequest("http://foo.com"), Resource::Raw); |
337 Resource* resource2 = FakeDecodedResource::create( | 273 Resource* resource2 = FakeDecodedResource::create( |
338 ResourceRequest("http://test/resource"), Resource::Raw); | 274 ResourceRequest("http://test/resource"), Resource::Raw); |
339 TestClientRemoval(resource1, resource2); | 275 TestClientRemoval(resource1, resource2); |
340 } | 276 } |
341 | 277 |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
432 FakeResource::create(ResourceRequest(url1), Resource::Raw); | 368 FakeResource::create(ResourceRequest(url1), Resource::Raw); |
433 memoryCache()->add(resource); | 369 memoryCache()->add(resource); |
434 EXPECT_TRUE(memoryCache()->contains(resource)); | 370 EXPECT_TRUE(memoryCache()->contains(resource)); |
435 | 371 |
436 EXPECT_EQ(resource, memoryCache()->resourceForURL(url1)); | 372 EXPECT_EQ(resource, memoryCache()->resourceForURL(url1)); |
437 | 373 |
438 const KURL url2 = MemoryCache::removeFragmentIdentifierIfNeeded(url1); | 374 const KURL url2 = MemoryCache::removeFragmentIdentifierIfNeeded(url1); |
439 EXPECT_EQ(resource, memoryCache()->resourceForURL(url2)); | 375 EXPECT_EQ(resource, memoryCache()->resourceForURL(url2)); |
440 } | 376 } |
441 | 377 |
442 TEST_F(MemoryCacheTest, MakeLiveAndDead) { | |
443 FakeResource* resource = FakeResource::create( | |
444 ResourceRequest("http://test/resource"), Resource::Raw); | |
445 const char data[6] = "abcde"; | |
446 resource->appendData(data, 5u); | |
447 memoryCache()->add(resource); | |
448 | |
449 const size_t deadSize = memoryCache()->deadSize(); | |
450 const size_t liveSize = memoryCache()->liveSize(); | |
451 | |
452 memoryCache()->makeLive(resource); | |
453 EXPECT_EQ(deadSize, memoryCache()->deadSize() + resource->size()); | |
454 EXPECT_EQ(liveSize, memoryCache()->liveSize() - resource->size()); | |
455 | |
456 memoryCache()->makeDead(resource); | |
457 EXPECT_EQ(deadSize, memoryCache()->deadSize()); | |
458 EXPECT_EQ(liveSize, memoryCache()->liveSize()); | |
459 } | |
460 | |
461 TEST_F(MemoryCacheTest, RemoveURLFromCache) { | 378 TEST_F(MemoryCacheTest, RemoveURLFromCache) { |
462 const KURL url1 = KURL(ParsedURLString, "http://test/resource1"); | 379 const KURL url1 = KURL(ParsedURLString, "http://test/resource1"); |
463 FakeResource* resource1 = | 380 Persistent<FakeResource> resource1 = |
464 FakeResource::create(ResourceRequest(url1), Resource::Raw); | 381 FakeResource::create(ResourceRequest(url1), Resource::Raw); |
465 memoryCache()->add(resource1); | 382 memoryCache()->add(resource1); |
466 EXPECT_TRUE(memoryCache()->contains(resource1)); | 383 EXPECT_TRUE(memoryCache()->contains(resource1)); |
467 | 384 |
468 memoryCache()->removeURLFromCache(url1); | 385 memoryCache()->removeURLFromCache(url1); |
469 EXPECT_FALSE(memoryCache()->contains(resource1)); | 386 EXPECT_FALSE(memoryCache()->contains(resource1)); |
470 | 387 |
471 const KURL url2 = KURL(ParsedURLString, "http://test/resource2#foo"); | 388 const KURL url2 = KURL(ParsedURLString, "http://test/resource2#foo"); |
472 FakeResource* resource2 = | 389 FakeResource* resource2 = |
473 FakeResource::create(ResourceRequest(url2), Resource::Raw); | 390 FakeResource::create(ResourceRequest(url2), Resource::Raw); |
474 memoryCache()->add(resource2); | 391 memoryCache()->add(resource2); |
475 EXPECT_TRUE(memoryCache()->contains(resource2)); | 392 EXPECT_TRUE(memoryCache()->contains(resource2)); |
476 | 393 |
477 memoryCache()->removeURLFromCache(url2); | 394 memoryCache()->removeURLFromCache(url2); |
478 EXPECT_FALSE(memoryCache()->contains(resource2)); | 395 EXPECT_FALSE(memoryCache()->contains(resource2)); |
479 } | 396 } |
480 | 397 |
481 } // namespace blink | 398 } // namespace blink |
OLD | NEW |