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

Side by Side Diff: third_party/WebKit/Source/platform/loader/fetch/RawResourceTest.cpp

Issue 2845513002: [WIP] Add Resource::IsShareable
Patch Set: fix Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698