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

Side by Side Diff: components/data_reduction_proxy/core/browser/data_reduction_proxy_bypass_stats_unittest.cc

Issue 2777823002: Bypass DRP if a redirect cycle is detected (Closed)
Patch Set: ryansturm comments Created 3 years, 8 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 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "components/data_reduction_proxy/core/browser/data_reduction_proxy_bypa ss_stats.h" 5 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_bypa ss_stats.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <memory> 10 #include <memory>
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after
328 328
329 std::unique_ptr<net::URLRequest> request( 329 std::unique_ptr<net::URLRequest> request(
330 context_.CreateRequest(url, net::IDLE, &delegate_)); 330 context_.CreateRequest(url, net::IDLE, &delegate_));
331 request->set_method("GET"); 331 request->set_method("GET");
332 request->SetLoadFlags(load_flags); 332 request->SetLoadFlags(load_flags);
333 request->Start(); 333 request->Start();
334 drp_test_context_->RunUntilIdle(); 334 drp_test_context_->RunUntilIdle();
335 return request; 335 return request;
336 } 336 }
337 337
338 // Create and execute a fake request that goes through a redirect loop using
339 // the data reduction proxy stack.
340 std::unique_ptr<net::URLRequest> CreateAndExecuteURLRedirectCycleRequest() {
341 MockRead redirect_mock_reads_1[] = {
342 MockRead("HTTP/1.1 302 Found\r\n"
343 "Via: 1.1 Chrome-Compression-Proxy\r\n"
344 "Location: http://bar.com/\r\n\r\n"),
345 MockRead(""), MockRead(net::SYNCHRONOUS, net::OK),
346 };
347 net::StaticSocketDataProvider redirect_socket_data_provider_1(
348 redirect_mock_reads_1, arraysize(redirect_mock_reads_1), nullptr, 0);
349 mock_socket_factory_.AddSocketDataProvider(
350 &redirect_socket_data_provider_1);
351
352 // The response after the redirect comes through proxy.
353 MockRead redirect_mock_reads_2[] = {
354 MockRead("HTTP/1.1 302 Found\r\n"
355 "Via: 1.1 Chrome-Compression-Proxy\r\n"
356 "Location: http://foo.com/\r\n\r\n"),
357 MockRead(""), MockRead(net::SYNCHRONOUS, net::OK),
358 };
359 net::StaticSocketDataProvider redirect_socket_data_provider_2(
360 redirect_mock_reads_2, arraysize(redirect_mock_reads_2), nullptr, 0);
361 mock_socket_factory_.AddSocketDataProvider(
362 &redirect_socket_data_provider_2);
363
364 // The response after the redirect comes through proxy and there is a
365 // redirect cycle.
366 MockRead redirect_mock_reads_3[] = {
367 MockRead("HTTP/1.1 302 Found\r\n"
368 "Via: 1.1 Chrome-Compression-Proxy\r\n"
369 "Location: http://bar.com/\r\n\r\n"),
370 MockRead(""), MockRead(net::SYNCHRONOUS, net::OK),
371 };
372 net::StaticSocketDataProvider redirect_socket_data_provider_3(
373 redirect_mock_reads_3, arraysize(redirect_mock_reads_3), nullptr, 0);
374 mock_socket_factory_.AddSocketDataProvider(
375 &redirect_socket_data_provider_3);
376
377 // Data reduction proxy should be bypassed, and the response should come
378 // directly.
379 MockRead response_mock_reads[] = {
380 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead(kBody.c_str()),
381 MockRead(net::SYNCHRONOUS, net::OK),
382 };
383 net::StaticSocketDataProvider response_socket_data_provider(
384 response_mock_reads, arraysize(response_mock_reads), nullptr, 0);
385 mock_socket_factory_.AddSocketDataProvider(&response_socket_data_provider);
386
387 std::unique_ptr<net::URLRequest> request(
388 context_.CreateRequest(GURL("http://foo.com"), net::IDLE, &delegate_));
389 request->set_method("GET");
390 request->Start();
391 drp_test_context_->RunUntilIdle();
392 return request;
393 }
394
338 void set_proxy_service(net::ProxyService* proxy_service) { 395 void set_proxy_service(net::ProxyService* proxy_service) {
339 context_.set_proxy_service(proxy_service); 396 context_.set_proxy_service(proxy_service);
340 } 397 }
341 398
342 void set_host_resolver(net::HostResolver* host_resolver) { 399 void set_host_resolver(net::HostResolver* host_resolver) {
343 context_.set_host_resolver(host_resolver); 400 context_.set_host_resolver(host_resolver);
344 } 401 }
345 402
346 const DataReductionProxySettings* settings() const { 403 const DataReductionProxySettings* settings() const {
347 return drp_test_context_->settings(); 404 return drp_test_context_->settings();
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 "DataReductionProxy.BypassedBytes.MediumTriggeringRequest", 447 "DataReductionProxy.BypassedBytes.MediumTriggeringRequest",
391 "DataReductionProxy.BypassedBytes.LongAll", 448 "DataReductionProxy.BypassedBytes.LongAll",
392 "DataReductionProxy.BypassedBytes.LongTriggeringRequest", 449 "DataReductionProxy.BypassedBytes.LongTriggeringRequest",
393 "DataReductionProxy.BypassedBytes.MissingViaHeader4xx", 450 "DataReductionProxy.BypassedBytes.MissingViaHeader4xx",
394 "DataReductionProxy.BypassedBytes.MissingViaHeaderOther", 451 "DataReductionProxy.BypassedBytes.MissingViaHeaderOther",
395 "DataReductionProxy.BypassedBytes.Malformed407", 452 "DataReductionProxy.BypassedBytes.Malformed407",
396 "DataReductionProxy.BypassedBytes.Status500HttpInternalServerError", 453 "DataReductionProxy.BypassedBytes.Status500HttpInternalServerError",
397 "DataReductionProxy.BypassedBytes.Status502HttpBadGateway", 454 "DataReductionProxy.BypassedBytes.Status502HttpBadGateway",
398 "DataReductionProxy.BypassedBytes.Status503HttpServiceUnavailable", 455 "DataReductionProxy.BypassedBytes.Status503HttpServiceUnavailable",
399 "DataReductionProxy.BypassedBytes.NetworkErrorOther", 456 "DataReductionProxy.BypassedBytes.NetworkErrorOther",
457 "DataReductionProxy.BypassedBytes.RedirectCycle",
400 }; 458 };
401 459
402 for (const std::string& histogram : kHistograms) { 460 for (const std::string& histogram : kHistograms) {
403 if (excluded_histograms.find(histogram) == 461 if (excluded_histograms.find(histogram) ==
404 excluded_histograms.end()) { 462 excluded_histograms.end()) {
405 histogram_tester.ExpectTotalCount(histogram, 0); 463 histogram_tester.ExpectTotalCount(histogram, 0);
406 } 464 }
407 } 465 }
408 } 466 }
409 467
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
501 test_case.initial_response_headers, kBody.c_str(), 559 test_case.initial_response_headers, kBody.c_str(),
502 nullptr, nullptr); 560 nullptr, nullptr);
503 561
504 histogram_tester.ExpectUniqueSample(test_case.histogram_name, kBody.size(), 562 histogram_tester.ExpectUniqueSample(test_case.histogram_name, kBody.size(),
505 1); 563 1);
506 ExpectOtherBypassedBytesHistogramsEmpty(histogram_tester, 564 ExpectOtherBypassedBytesHistogramsEmpty(histogram_tester,
507 test_case.histogram_name); 565 test_case.histogram_name);
508 } 566 }
509 } 567 }
510 568
569 // Verify that when there is a URL redirect cycle, data reduction proxy is
570 // bypassed for a single request.
571 TEST_F(DataReductionProxyBypassStatsEndToEndTest, URLRedirectCycle) {
572 InitializeContext();
573 ClearBadProxies();
574 base::HistogramTester histogram_tester_1;
575 CreateAndExecuteURLRedirectCycleRequest();
576
577 histogram_tester_1.ExpectUniqueSample(
578 "DataReductionProxy.BypassedBytes.URLRedirectCycle", kBody.size(), 1);
579 ExpectOtherBypassedBytesHistogramsEmpty(
580 histogram_tester_1, "DataReductionProxy.BypassedBytes.URLRedirectCycle");
581
582 // The second request should be sent via the proxy.
583 base::HistogramTester histogram_tester_2;
584 CreateAndExecuteRequest(GURL("http://bar.com"), net::LOAD_NORMAL, net::OK,
585 "HTTP/1.1 200 OK\r\n"
586 "Via: 1.1 Chrome-Compression-Proxy\r\n\r\n",
587 kNextBody.c_str(), nullptr, nullptr);
588 histogram_tester_2.ExpectUniqueSample(
589 "DataReductionProxy.BypassedBytes.NotBypassed", kNextBody.size(), 1);
590 ExpectOtherBypassedBytesHistogramsEmpty(
591 histogram_tester_2, "DataReductionProxy.BypassedBytes.NotBypassed");
592 }
593
511 TEST_F(DataReductionProxyBypassStatsEndToEndTest, 594 TEST_F(DataReductionProxyBypassStatsEndToEndTest,
512 BypassedBytesProxyOverridden) { 595 BypassedBytesProxyOverridden) {
513 std::unique_ptr<net::ProxyService> proxy_service( 596 std::unique_ptr<net::ProxyService> proxy_service(
514 net::ProxyService::CreateFixed("http://test.com:80")); 597 net::ProxyService::CreateFixed("http://test.com:80"));
515 set_proxy_service(proxy_service.get()); 598 set_proxy_service(proxy_service.get());
516 InitializeContext(); 599 InitializeContext();
517 600
518 base::HistogramTester histogram_tester; 601 base::HistogramTester histogram_tester;
519 CreateAndExecuteRequest(GURL("http://foo.com"), net::LOAD_NORMAL, net::OK, 602 CreateAndExecuteRequest(GURL("http://foo.com"), net::LOAD_NORMAL, net::OK,
520 "HTTP/1.1 200 OK\r\n\r\n", kBody.c_str(), nullptr, 603 "HTTP/1.1 200 OK\r\n\r\n", kBody.c_str(), nullptr,
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after
867 {false, "HTTP/1.1 404 Not Found\n", -1, 404}}; 950 {false, "HTTP/1.1 404 Not Found\n", -1, 404}};
868 951
869 for (size_t i = 0; i < arraysize(test_cases); ++i) { 952 for (size_t i = 0; i < arraysize(test_cases); ++i) {
870 base::HistogramTester histogram_tester; 953 base::HistogramTester histogram_tester;
871 std::string raw_headers(test_cases[i].headers); 954 std::string raw_headers(test_cases[i].headers);
872 HeadersToRaw(&raw_headers); 955 HeadersToRaw(&raw_headers);
873 scoped_refptr<net::HttpResponseHeaders> headers( 956 scoped_refptr<net::HttpResponseHeaders> headers(
874 new net::HttpResponseHeaders(raw_headers)); 957 new net::HttpResponseHeaders(raw_headers));
875 958
876 DataReductionProxyBypassStats::DetectAndRecordMissingViaHeaderResponseCode( 959 DataReductionProxyBypassStats::DetectAndRecordMissingViaHeaderResponseCode(
877 test_cases[i].is_primary, headers.get()); 960 test_cases[i].is_primary, *headers);
878 961
879 if (test_cases[i].expected_primary_sample == -1) { 962 if (test_cases[i].expected_primary_sample == -1) {
880 histogram_tester.ExpectTotalCount(kPrimaryHistogramName, 0); 963 histogram_tester.ExpectTotalCount(kPrimaryHistogramName, 0);
881 } else { 964 } else {
882 histogram_tester.ExpectUniqueSample( 965 histogram_tester.ExpectUniqueSample(
883 kPrimaryHistogramName, test_cases[i].expected_primary_sample, 1); 966 kPrimaryHistogramName, test_cases[i].expected_primary_sample, 1);
884 } 967 }
885 968
886 if (test_cases[i].expected_fallback_sample == -1) { 969 if (test_cases[i].expected_fallback_sample == -1) {
887 histogram_tester.ExpectTotalCount(kFallbackHistogramName, 0); 970 histogram_tester.ExpectTotalCount(kFallbackHistogramName, 0);
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
990 base::HistogramTester histogram_tester; 1073 base::HistogramTester histogram_tester;
991 CreateAndExecuteRequest(GURL("http://bar.com"), net::LOAD_NORMAL, net::OK, 1074 CreateAndExecuteRequest(GURL("http://bar.com"), net::LOAD_NORMAL, net::OK,
992 "HTTP/1.1 200 OK\r\n" 1075 "HTTP/1.1 200 OK\r\n"
993 "Via: 1.1 Chrome-Compression-Proxy\r\n\r\n", 1076 "Via: 1.1 Chrome-Compression-Proxy\r\n\r\n",
994 kNextBody.c_str(), nullptr, nullptr); 1077 kNextBody.c_str(), nullptr, nullptr);
995 histogram_tester.ExpectUniqueSample("DataReductionProxy.ProxySchemeUsed", 1078 histogram_tester.ExpectUniqueSample("DataReductionProxy.ProxySchemeUsed",
996 2 /*PROXY_SCHEME_HTTPS */, 1); 1079 2 /*PROXY_SCHEME_HTTPS */, 1);
997 } 1080 }
998 1081
999 } // namespace data_reduction_proxy 1082 } // namespace data_reduction_proxy
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698