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