1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file. 4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/data_reduction_proxy/browser/data_reduction_proxy_usage_stats.h" 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <string> 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/bind.h" 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/scoped_ptr.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/metrics/histogram.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/test/histogram_tester.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/data_reduction_proxy/common/data_reduction_proxy_headers_test_utils.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/base/host_port_pair.h" 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/base/request_priority.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/http/http_response_headers.h" 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/http/http_util.h" 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/url_request/url_request.h" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/url_request/url_request_job_factory_impl.h" 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/url_request/url_request_status.h" 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/url_request/url_request_test_job.h" 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/url_request/url_request_test_util.h" 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "testing/gmock/include/gmock/gmock.h" 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "testing/gtest/include/gtest/gtest.h" 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing testing::Return; 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace { 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass DataReductionProxyParamsMock : 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public data_reduction_proxy::DataReductionProxyParams { 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DataReductionProxyParamsMock() : 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci data_reduction_proxy::DataReductionProxyParams(0) {} 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual ~DataReductionProxyParamsMock() {} 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MOCK_CONST_METHOD2( 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci IsDataReductionProxy, 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool(const net::HostPortPair& host_port_pair, 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci data_reduction_proxy::DataReductionProxyTypeInfo* proxy_info)); 416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) MOCK_CONST_METHOD2( 426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) WasDataReductionProxyUsed, 436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool(const net::URLRequest*, 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci data_reduction_proxy::DataReductionProxyTypeInfo* proxy_info)); 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private: 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DISALLOW_COPY_AND_ASSIGN(DataReductionProxyParamsMock); 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace data_reduction_proxy { 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass DataReductionProxyUsageStatsTest : public testing::Test { 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DataReductionProxyUsageStatsTest() 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : loop_proxy_(base::MessageLoopProxy::current().get()), 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch context_(true), 596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) unavailable_(false) { 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch context_.Init(); 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The |test_job_factory_| takes ownership of the interceptor. 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci test_job_interceptor_ = new net::TestJobInterceptor(); 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(test_job_factory_.SetProtocolHandler(url::kHttpScheme, 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci test_job_interceptor_)); 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci context_.set_job_factory(&test_job_factory_); 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) mock_url_request_ = context_.CreateRequest(GURL(), net::IDLE, &delegate_, 7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) NULL); 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) void NotifyUnavailable(bool unavailable) { 746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) unavailable_ = unavailable; 756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<net::URLRequest> CreateURLRequestWithResponseHeaders( 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GURL& url, 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& raw_response_headers) { 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<net::URLRequest> fake_request = context_.CreateRequest( 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci url, net::IDLE, &delegate_, NULL); 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Create a test job that will fill in the given response headers for the 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // |fake_request|. 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<net::URLRequestTestJob> test_job( 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new net::URLRequestTestJob(fake_request.get(), 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci context_.network_delegate(), 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci raw_response_headers, std::string(), true)); 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Configure the interceptor to use the test job to handle the next request. 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci test_job_interceptor_->set_main_intercept_job(test_job.get()); 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fake_request->Start(); 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::MessageLoop::current()->RunUntilIdle(); 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(fake_request->response_headers() != NULL); 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return fake_request.Pass(); 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Required for base::MessageLoopProxy::current(). 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::MessageLoopForUI loop_; 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::MessageLoopProxy* loop_proxy_; 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch protected: 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net::TestURLRequestContext context_; 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net::TestDelegate delegate_; 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DataReductionProxyParamsMock mock_params_; 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<net::URLRequest> mock_url_request_; 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // |test_job_interceptor_| is owned by |test_job_factory_|. 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net::TestJobInterceptor* test_job_interceptor_; 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net::URLRequestJobFactoryImpl test_job_factory_; 1116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool unavailable_; 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(DataReductionProxyUsageStatsTest, IsDataReductionProxyUnreachable) { 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net::ProxyServer fallback_proxy_server = 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net::ProxyServer::FromURI("foo.com", net::ProxyServer::SCHEME_HTTP); 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci data_reduction_proxy::DataReductionProxyTypeInfo proxy_info; 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch struct TestCase { 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool fallback_proxy_server_is_data_reduction_proxy; 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool was_proxy_used; 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool is_unreachable; 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch }; 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const TestCase test_cases[] = { 124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false, 126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false, 127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false 128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch }, 129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false, 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci true, 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }, 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch true, 136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch true, 137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false 138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch }, 139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch true, 141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false, 142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch true 143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch }; 145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) { 146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TestCase test_case = test_cases[i]; 147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(mock_params_, IsDataReductionProxy(testing::_, testing::_)) 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .WillRepeatedly(testing::Return( 1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci test_case.fallback_proxy_server_is_data_reduction_proxy)); 15103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_CALL(mock_params_, 15203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) WasDataReductionProxyUsed(mock_url_request_.get(), NULL)) 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .WillRepeatedly(testing::Return(test_case.was_proxy_used)); 154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<DataReductionProxyUsageStats> usage_stats( 156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new DataReductionProxyUsageStats( 1576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) &mock_params_, loop_proxy_)); 1586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) usage_stats->set_unavailable_callback( 1596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::Bind(&DataReductionProxyUsageStatsTest::NotifyUnavailable, 1606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::Unretained(this))); 161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci usage_stats->OnProxyFallback(fallback_proxy_server, 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net::ERR_PROXY_CONNECTION_FAILED); 16403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) usage_stats->OnUrlRequestCompleted(mock_url_request_.get(), false); 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::MessageLoop::current()->RunUntilIdle(); 166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(test_case.is_unreachable, unavailable_); 168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(DataReductionProxyUsageStatsTest, ProxyUnreachableThenReachable) { 1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net::ProxyServer fallback_proxy_server = 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net::ProxyServer::FromURI("foo.com", net::ProxyServer::SCHEME_HTTP); 1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<DataReductionProxyUsageStats> usage_stats( 1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new DataReductionProxyUsageStats( 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &mock_params_, loop_proxy_)); 1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci usage_stats->set_unavailable_callback( 1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&DataReductionProxyUsageStatsTest::NotifyUnavailable, 1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Unretained(this))); 1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(mock_params_, IsDataReductionProxy(testing::_, testing::_)) 1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .WillOnce(testing::Return(true)); 1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(mock_params_, 1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WasDataReductionProxyUsed(mock_url_request_.get(), NULL)) 1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .WillOnce(testing::Return(true)); 1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // proxy falls back 1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci usage_stats->OnProxyFallback(fallback_proxy_server, 1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net::ERR_PROXY_CONNECTION_FAILED); 1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::MessageLoop::current()->RunUntilIdle(); 1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(unavailable_); 1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // proxy succeeds 1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci usage_stats->OnUrlRequestCompleted(mock_url_request_.get(), false); 1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::MessageLoop::current()->RunUntilIdle(); 1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(unavailable_); 1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(DataReductionProxyUsageStatsTest, ProxyReachableThenUnreachable) { 2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net::ProxyServer fallback_proxy_server = 2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net::ProxyServer::FromURI("foo.com", net::ProxyServer::SCHEME_HTTP); 2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<DataReductionProxyUsageStats> usage_stats( 2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new DataReductionProxyUsageStats( 2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &mock_params_, loop_proxy_)); 2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci usage_stats->set_unavailable_callback( 2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&DataReductionProxyUsageStatsTest::NotifyUnavailable, 2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Unretained(this))); 2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(mock_params_, 2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WasDataReductionProxyUsed(mock_url_request_.get(), NULL)) 2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .WillOnce(testing::Return(true)); 2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(mock_params_, IsDataReductionProxy(testing::_, testing::_)) 2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .WillRepeatedly(testing::Return(true)); 2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Proxy succeeds. 2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci usage_stats->OnUrlRequestCompleted(mock_url_request_.get(), false); 2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::MessageLoop::current()->RunUntilIdle(); 2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(unavailable_); 2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Then proxy falls back indefinitely. 2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci usage_stats->OnProxyFallback(fallback_proxy_server, 2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net::ERR_PROXY_CONNECTION_FAILED); 2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci usage_stats->OnProxyFallback(fallback_proxy_server, 2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net::ERR_PROXY_CONNECTION_FAILED); 2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci usage_stats->OnProxyFallback(fallback_proxy_server, 2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net::ERR_PROXY_CONNECTION_FAILED); 2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci usage_stats->OnProxyFallback(fallback_proxy_server, 2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net::ERR_PROXY_CONNECTION_FAILED); 2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::MessageLoop::current()->RunUntilIdle(); 2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(unavailable_); 2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(DataReductionProxyUsageStatsTest, 2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DetectAndRecordMissingViaHeaderResponseCode) { 2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string kPrimaryHistogramName = 2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "DataReductionProxy.MissingViaHeader.ResponseCode.Primary"; 2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string kFallbackHistogramName = 2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "DataReductionProxy.MissingViaHeader.ResponseCode.Fallback"; 2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci struct TestCase { 2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool is_primary; 2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char* headers; 2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int expected_primary_sample; // -1 indicates no expected sample. 2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int expected_fallback_sample; // -1 indicates no expected sample. 2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const TestCase test_cases[] = { 2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci true, 2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "HTTP/1.1 200 OK\n" 2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "Via: 1.1 Chrome-Compression-Proxy\n", 2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci -1, 2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci -1 2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }, 2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false, 2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "HTTP/1.1 200 OK\n" 2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "Via: 1.1 Chrome-Compression-Proxy\n", 2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci -1, 2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci -1 2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }, 2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci true, 2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "HTTP/1.1 200 OK\n", 2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 200, 2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci -1 2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }, 2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false, 2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "HTTP/1.1 200 OK\n", 2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci -1, 2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 200 2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }, 2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci true, 2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "HTTP/1.1 304 Not Modified\n", 2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 304, 2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci -1 2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }, 2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false, 2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "HTTP/1.1 304 Not Modified\n", 2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci -1, 2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 304 2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }, 2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci true, 2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "HTTP/1.1 404 Not Found\n", 2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 404, 2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci -1 2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }, 2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false, 2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "HTTP/1.1 404 Not Found\n", 2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci -1, 2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 404 2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) { 2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::HistogramTester histogram_tester; 3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string raw_headers(test_cases[i].headers); 3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HeadersToRaw(&raw_headers); 3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<net::HttpResponseHeaders> headers( 3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new net::HttpResponseHeaders(raw_headers)); 3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DataReductionProxyUsageStats::DetectAndRecordMissingViaHeaderResponseCode( 3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci test_cases[i].is_primary, headers.get()); 3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (test_cases[i].expected_primary_sample == -1) { 3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci histogram_tester.ExpectTotalCount(kPrimaryHistogramName, 0); 3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else { 3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci histogram_tester.ExpectUniqueSample( 3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kPrimaryHistogramName, test_cases[i].expected_primary_sample, 1); 3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (test_cases[i].expected_fallback_sample == -1) { 3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci histogram_tester.ExpectTotalCount(kFallbackHistogramName, 0); 3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else { 3181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci histogram_tester.ExpectUniqueSample( 3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kFallbackHistogramName, test_cases[i].expected_fallback_sample, 1); 3201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 3231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(DataReductionProxyUsageStatsTest, RecordMissingViaHeaderBytes) { 3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string k4xxHistogramName = 3261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "DataReductionProxy.MissingViaHeader.Bytes.4xx"; 3271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string kOtherHistogramName = 3281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "DataReductionProxy.MissingViaHeader.Bytes.Other"; 3291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const int64 kResponseContentLength = 100; 3301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci struct TestCase { 3321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool was_proxy_used; 3331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char* headers; 3341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool is_4xx_sample_expected; 3351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool is_other_sample_expected; 3361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 3371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const TestCase test_cases[] = { 3381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Nothing should be recorded for requests that don't use the proxy. 3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 3401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false, 3411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "HTTP/1.1 404 Not Found\n", 3421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false, 3431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false 3441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }, 3451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 3461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false, 3471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "HTTP/1.1 200 OK\n", 3481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false, 3491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false 3501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }, 3511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Nothing should be recorded for responses that have the via header. 3521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 3531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci true, 3541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "HTTP/1.1 404 Not Found\n" 3551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "Via: 1.1 Chrome-Compression-Proxy\n", 3561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false, 3571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false 3581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }, 3591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci true, 3611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "HTTP/1.1 200 OK\n" 3621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "Via: 1.1 Chrome-Compression-Proxy\n", 3631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false, 3641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false 3651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }, 3661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // 4xx responses that used the proxy and don't have the via header should be 3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // recorded. 3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci true, 3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "HTTP/1.1 404 Not Found\n", 3711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci true, 3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false 3731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }, 3741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 3751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci true, 3761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "HTTP/1.1 400 Bad Request\n", 3771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci true, 3781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false 3791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }, 3801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci true, 3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "HTTP/1.1 499 Big Client Error Response Code\n", 3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci true, 3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false 3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }, 3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Non-4xx responses that used the proxy and don't have the via header 3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // should be recorded. 3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 3891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci true, 3901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "HTTP/1.1 200 OK\n", 3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false, 3921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci true 3931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }, 3941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci true, 3961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "HTTP/1.1 399 Big Redirection Response Code\n", 3971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false, 3981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci true 3991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }, 4001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci true, 4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "HTTP/1.1 500 Internal Server Error\n", 4031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false, 4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci true 4051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 4061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 4071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) { 4091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::HistogramTester histogram_tester; 4101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<DataReductionProxyUsageStats> usage_stats( 4111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new DataReductionProxyUsageStats(&mock_params_, loop_proxy_)); 4121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string raw_headers(test_cases[i].headers); 4141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HeadersToRaw(&raw_headers); 4151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<net::URLRequest> fake_request( 4171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateURLRequestWithResponseHeaders(GURL("http://www.google.com/"), 4181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci raw_headers)); 4191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fake_request->set_received_response_content_length(kResponseContentLength); 4201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(mock_params_, 4221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WasDataReductionProxyUsed(fake_request.get(), NULL)) 4231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .WillRepeatedly(Return(test_cases[i].was_proxy_used)); 4241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci usage_stats->RecordMissingViaHeaderBytes(fake_request.get()); 4261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (test_cases[i].is_4xx_sample_expected) { 4281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci histogram_tester.ExpectUniqueSample(k4xxHistogramName, 4291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kResponseContentLength, 1); 4301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else { 4311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci histogram_tester.ExpectTotalCount(k4xxHistogramName, 0); 4321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 4331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (test_cases[i].is_other_sample_expected) { 4351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci histogram_tester.ExpectUniqueSample(kOtherHistogramName, 4361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kResponseContentLength, 1); 4371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else { 4381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci histogram_tester.ExpectTotalCount(kOtherHistogramName, 0); 4391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 4401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 4411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 4421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 443116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace data_reduction_proxy 444