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 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
188 visitor->Trace(dummy_client_); | 188 visitor->Trace(dummy_client_); |
189 visitor->Trace(resource_); | 189 visitor->Trace(resource_); |
190 RawResourceClient::Trace(visitor); | 190 RawResourceClient::Trace(visitor); |
191 } | 191 } |
192 | 192 |
193 private: | 193 private: |
194 Member<DummyClient> dummy_client_; | 194 Member<DummyClient> dummy_client_; |
195 Member<Resource> resource_; | 195 Member<Resource> resource_; |
196 }; | 196 }; |
197 | 197 |
198 TEST_F(RawResourceTest, RevalidationSucceeded) { | |
199 Resource* resource = | |
200 RawResource::Create(ResourceRequest("data:text/html,"), Resource::kRaw); | |
201 ResourceResponse response; | |
202 response.SetHTTPStatusCode(200); | |
203 resource->ResponseReceived(response, nullptr); | |
204 const char kData[5] = "abcd"; | |
205 resource->AppendData(kData, 4); | |
206 resource->Finish(); | |
207 GetMemoryCache()->Add(resource); | |
208 | |
209 // Simulate a successful revalidation. | |
210 resource->SetRevalidatingRequest(ResourceRequest("data:text/html,")); | |
211 | |
212 Persistent<DummyClient> client = new DummyClient; | |
213 resource->AddClient(client); | |
214 | |
215 ResourceResponse revalidating_response; | |
216 revalidating_response.SetHTTPStatusCode(304); | |
217 resource->ResponseReceived(revalidating_response, nullptr); | |
218 EXPECT_FALSE(resource->IsCacheValidator()); | |
219 EXPECT_EQ(200, resource->GetResponse().HttpStatusCode()); | |
220 EXPECT_EQ(4u, resource->ResourceBuffer()->size()); | |
221 EXPECT_EQ(resource, GetMemoryCache()->ResourceForURL( | |
222 KURL(kParsedURLString, "data:text/html,"))); | |
223 GetMemoryCache()->Remove(resource); | |
224 | |
225 resource->RemoveClient(client); | |
226 EXPECT_FALSE(resource->IsAlive()); | |
227 EXPECT_FALSE(client->Called()); | |
228 EXPECT_EQ("abcd", String(client->Data().data(), client->Data().size())); | |
229 } | |
230 | |
231 TEST_F(RawResourceTest, RevalidationSucceededForResourceWithoutBody) { | |
232 Resource* resource = | |
233 RawResource::Create(ResourceRequest("data:text/html,"), Resource::kRaw); | |
234 ResourceResponse response; | |
235 response.SetHTTPStatusCode(200); | |
236 resource->ResponseReceived(response, nullptr); | |
237 resource->Finish(); | |
238 GetMemoryCache()->Add(resource); | |
239 | |
240 // Simulate a successful revalidation. | |
241 resource->SetRevalidatingRequest(ResourceRequest("data:text/html,")); | |
242 | |
243 Persistent<DummyClient> client = new DummyClient; | |
244 resource->AddClient(client); | |
245 | |
246 ResourceResponse revalidating_response; | |
247 revalidating_response.SetHTTPStatusCode(304); | |
248 resource->ResponseReceived(revalidating_response, nullptr); | |
249 EXPECT_FALSE(resource->IsCacheValidator()); | |
250 EXPECT_EQ(200, resource->GetResponse().HttpStatusCode()); | |
251 EXPECT_FALSE(resource->ResourceBuffer()); | |
252 EXPECT_EQ(resource, GetMemoryCache()->ResourceForURL( | |
253 KURL(kParsedURLString, "data:text/html,"))); | |
254 GetMemoryCache()->Remove(resource); | |
255 | |
256 resource->RemoveClient(client); | |
257 EXPECT_FALSE(resource->IsAlive()); | |
258 EXPECT_FALSE(client->Called()); | |
259 EXPECT_EQ(0u, client->Data().size()); | |
260 } | |
261 | |
262 TEST_F(RawResourceTest, RevalidationSucceededUpdateHeaders) { | |
263 Resource* resource = | |
264 RawResource::Create(ResourceRequest("data:text/html,"), Resource::kRaw); | |
265 ResourceResponse response; | |
266 response.SetHTTPStatusCode(200); | |
267 response.AddHTTPHeaderField("keep-alive", "keep-alive value"); | |
268 response.AddHTTPHeaderField("expires", "expires value"); | |
269 response.AddHTTPHeaderField("last-modified", "last-modified value"); | |
270 response.AddHTTPHeaderField("proxy-authenticate", "proxy-authenticate value"); | |
271 response.AddHTTPHeaderField("proxy-connection", "proxy-connection value"); | |
272 response.AddHTTPHeaderField("x-custom", "custom value"); | |
273 resource->ResponseReceived(response, nullptr); | |
274 resource->Finish(); | |
275 GetMemoryCache()->Add(resource); | |
276 | |
277 // Simulate a successful revalidation. | |
278 resource->SetRevalidatingRequest(ResourceRequest("data:text/html,")); | |
279 | |
280 // Validate that these headers pre-update. | |
281 EXPECT_EQ("keep-alive value", | |
282 resource->GetResponse().HttpHeaderField("keep-alive")); | |
283 EXPECT_EQ("expires value", | |
284 resource->GetResponse().HttpHeaderField("expires")); | |
285 EXPECT_EQ("last-modified value", | |
286 resource->GetResponse().HttpHeaderField("last-modified")); | |
287 EXPECT_EQ("proxy-authenticate value", | |
288 resource->GetResponse().HttpHeaderField("proxy-authenticate")); | |
289 EXPECT_EQ("proxy-authenticate value", | |
290 resource->GetResponse().HttpHeaderField("proxy-authenticate")); | |
291 EXPECT_EQ("proxy-connection value", | |
292 resource->GetResponse().HttpHeaderField("proxy-connection")); | |
293 EXPECT_EQ("custom value", | |
294 resource->GetResponse().HttpHeaderField("x-custom")); | |
295 | |
296 Persistent<DummyClient> client = new DummyClient; | |
297 resource->AddClient(client.Get()); | |
298 | |
299 // Perform a revalidation step. | |
300 ResourceResponse revalidating_response; | |
301 revalidating_response.SetHTTPStatusCode(304); | |
302 // Headers that aren't copied with an 304 code. | |
303 revalidating_response.AddHTTPHeaderField("keep-alive", "garbage"); | |
304 revalidating_response.AddHTTPHeaderField("expires", "garbage"); | |
305 revalidating_response.AddHTTPHeaderField("last-modified", "garbage"); | |
306 revalidating_response.AddHTTPHeaderField("proxy-authenticate", "garbage"); | |
307 revalidating_response.AddHTTPHeaderField("proxy-connection", "garbage"); | |
308 // Header that is updated with 304 code. | |
309 revalidating_response.AddHTTPHeaderField("x-custom", "updated"); | |
310 resource->ResponseReceived(revalidating_response, nullptr); | |
311 | |
312 // Validate the original response. | |
313 EXPECT_EQ(200, resource->GetResponse().HttpStatusCode()); | |
314 | |
315 // Validate that these headers are not updated. | |
316 EXPECT_EQ("keep-alive value", | |
317 resource->GetResponse().HttpHeaderField("keep-alive")); | |
318 EXPECT_EQ("expires value", | |
319 resource->GetResponse().HttpHeaderField("expires")); | |
320 EXPECT_EQ("last-modified value", | |
321 resource->GetResponse().HttpHeaderField("last-modified")); | |
322 EXPECT_EQ("proxy-authenticate value", | |
323 resource->GetResponse().HttpHeaderField("proxy-authenticate")); | |
324 EXPECT_EQ("proxy-authenticate value", | |
325 resource->GetResponse().HttpHeaderField("proxy-authenticate")); | |
326 EXPECT_EQ("proxy-connection value", | |
327 resource->GetResponse().HttpHeaderField("proxy-connection")); | |
328 EXPECT_EQ("updated", resource->GetResponse().HttpHeaderField("x-custom")); | |
329 | |
330 GetMemoryCache()->Remove(resource); | |
331 | |
332 resource->RemoveClient(client); | |
333 EXPECT_FALSE(resource->IsAlive()); | |
334 EXPECT_FALSE(client->Called()); | |
335 EXPECT_EQ(0u, client->Data().size()); | |
336 } | |
337 | |
338 TEST_F(RawResourceTest, RedirectDuringRevalidation) { | |
339 Resource* resource = RawResource::Create( | |
340 ResourceRequest("https://example.com/1"), Resource::kRaw); | |
341 ResourceResponse response; | |
342 response.SetURL(KURL(kParsedURLString, "https://example.com/1")); | |
343 response.SetHTTPStatusCode(200); | |
344 resource->ResponseReceived(response, nullptr); | |
345 const char kData[5] = "abcd"; | |
346 resource->AppendData(kData, 4); | |
347 resource->Finish(); | |
348 GetMemoryCache()->Add(resource); | |
349 | |
350 EXPECT_FALSE(resource->IsCacheValidator()); | |
351 EXPECT_EQ("https://example.com/1", | |
352 resource->GetResourceRequest().Url().GetString()); | |
353 EXPECT_EQ("https://example.com/1", | |
354 resource->LastResourceRequest().Url().GetString()); | |
355 | |
356 // Simulate a revalidation. | |
357 resource->SetRevalidatingRequest(ResourceRequest("https://example.com/1")); | |
358 EXPECT_TRUE(resource->IsCacheValidator()); | |
359 EXPECT_EQ("https://example.com/1", | |
360 resource->GetResourceRequest().Url().GetString()); | |
361 EXPECT_EQ("https://example.com/1", | |
362 resource->LastResourceRequest().Url().GetString()); | |
363 | |
364 Persistent<DummyClient> client = new DummyClient; | |
365 resource->AddClient(client); | |
366 | |
367 // The revalidating request is redirected. | |
368 ResourceResponse redirect_response; | |
369 redirect_response.SetURL(KURL(kParsedURLString, "https://example.com/1")); | |
370 redirect_response.SetHTTPHeaderField("location", "https://example.com/2"); | |
371 redirect_response.SetHTTPStatusCode(308); | |
372 ResourceRequest redirected_revalidating_request("https://example.com/2"); | |
373 resource->WillFollowRedirect(redirected_revalidating_request, | |
374 redirect_response); | |
375 EXPECT_FALSE(resource->IsCacheValidator()); | |
376 EXPECT_EQ("https://example.com/1", | |
377 resource->GetResourceRequest().Url().GetString()); | |
378 EXPECT_EQ("https://example.com/2", | |
379 resource->LastResourceRequest().Url().GetString()); | |
380 | |
381 // The final response is received. | |
382 ResourceResponse revalidating_response; | |
383 revalidating_response.SetURL(KURL(kParsedURLString, "https://example.com/2")); | |
384 revalidating_response.SetHTTPStatusCode(200); | |
385 resource->ResponseReceived(revalidating_response, nullptr); | |
386 const char kData2[4] = "xyz"; | |
387 resource->AppendData(kData2, 3); | |
388 resource->Finish(); | |
389 EXPECT_FALSE(resource->IsCacheValidator()); | |
390 EXPECT_EQ("https://example.com/1", | |
391 resource->GetResourceRequest().Url().GetString()); | |
392 EXPECT_EQ("https://example.com/2", | |
393 resource->LastResourceRequest().Url().GetString()); | |
394 EXPECT_FALSE(resource->IsCacheValidator()); | |
395 EXPECT_EQ(200, resource->GetResponse().HttpStatusCode()); | |
396 EXPECT_EQ(3u, resource->ResourceBuffer()->size()); | |
397 EXPECT_EQ(resource, GetMemoryCache()->ResourceForURL( | |
398 KURL(kParsedURLString, "https://example.com/1"))); | |
399 | |
400 EXPECT_TRUE(client->Called()); | |
401 EXPECT_EQ(1, client->NumberOfRedirectsReceived()); | |
402 EXPECT_EQ("xyz", String(client->Data().data(), client->Data().size())); | |
403 | |
404 // Test the case where a client is added after revalidation is completed. | |
405 Persistent<DummyClient> client2 = new DummyClient; | |
406 resource->AddClient(client2); | |
407 | |
408 // Because RawResourceClient is added asynchronously, | |
409 // |runUntilIdle()| is called to make |client2| to be notified. | |
410 platform_->RunUntilIdle(); | |
411 | |
412 EXPECT_TRUE(client2->Called()); | |
413 EXPECT_EQ(1, client2->NumberOfRedirectsReceived()); | |
414 EXPECT_EQ("xyz", String(client2->Data().data(), client2->Data().size())); | |
415 | |
416 GetMemoryCache()->Remove(resource); | |
417 | |
418 resource->RemoveClient(client); | |
419 resource->RemoveClient(client2); | |
420 EXPECT_FALSE(resource->IsAlive()); | |
421 } | |
422 | 198 |
423 TEST_F(RawResourceTest, AddClientDuringCallback) { | 199 TEST_F(RawResourceTest, AddClientDuringCallback) { |
424 Resource* raw = | 200 Resource* raw = |
425 RawResource::Create(ResourceRequest("data:text/html,"), Resource::kRaw); | 201 RawResource::Create(ResourceRequest("data:text/html,"), Resource::kRaw); |
426 | 202 |
427 // Create a non-null response. | 203 // Create a non-null response. |
428 ResourceResponse response = raw->GetResponse(); | 204 ResourceResponse response = raw->GetResponse(); |
429 response.SetURL(KURL(kParsedURLString, "http://600.613/")); | 205 response.SetURL(KURL(kParsedURLString, "http://600.613/")); |
430 raw->SetResponse(response); | 206 raw->SetResponse(response); |
431 raw->Finish(); | 207 raw->Finish(); |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
581 CanReuseDevToolsEmulateNetworkConditionsClientIdHeader) { | 357 CanReuseDevToolsEmulateNetworkConditionsClientIdHeader) { |
582 ResourceRequest request("data:text/html,"); | 358 ResourceRequest request("data:text/html,"); |
583 request.SetHTTPHeaderField( | 359 request.SetHTTPHeaderField( |
584 HTTPNames::X_DevTools_Emulate_Network_Conditions_Client_Id, "Foo"); | 360 HTTPNames::X_DevTools_Emulate_Network_Conditions_Client_Id, "Foo"); |
585 Resource* raw = RawResource::Create(request, Resource::kRaw); | 361 Resource* raw = RawResource::Create(request, Resource::kRaw); |
586 EXPECT_TRUE(raw->CanReuse(FetchParameters(ResourceRequest("data:text/html,"), | 362 EXPECT_TRUE(raw->CanReuse(FetchParameters(ResourceRequest("data:text/html,"), |
587 FetchInitiatorInfo()))); | 363 FetchInitiatorInfo()))); |
588 } | 364 } |
589 | 365 |
590 } // namespace blink | 366 } // namespace blink |
OLD | NEW |