15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/http_pipelining_compatibility_client.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram_samples.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/statistics_recorder.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/run_loop.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h" 18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/test_completion_callback.h" 23b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/test/spawned_test_server/spawned_test_server.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_test_util.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using base::HistogramBase; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::HistogramSamples; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome_browser_net { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char* const kHistogramNames[] = { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "NetConnectivity.Pipeline.CanarySuccess", 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "NetConnectivity.Pipeline.Depth", 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "NetConnectivity.Pipeline.AllHTTP11", 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "NetConnectivity.Pipeline.Success", 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "NetConnectivity.Pipeline.0.NetworkError", 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "NetConnectivity.Pipeline.0.ResponseCode", 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "NetConnectivity.Pipeline.0.Status", 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "NetConnectivity.Pipeline.1.NetworkError", 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "NetConnectivity.Pipeline.1.ResponseCode", 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "NetConnectivity.Pipeline.1.Status", 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "NetConnectivity.Pipeline.2.NetworkError", 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "NetConnectivity.Pipeline.2.ResponseCode", 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "NetConnectivity.Pipeline.2.Status", 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum HistogramField { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FIELD_CANARY, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FIELD_DEPTH, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FIELD_HTTP_1_1, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FIELD_NETWORK_ERROR, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FIELD_RESPONSE_CODE, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FIELD_STATUS, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FIELD_SUCCESS, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockFactory : public internal::PipelineTestRequest::Factory { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD6(NewRequest, internal::PipelineTestRequest*( 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int, const std::string&, const RequestInfo&, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::PipelineTestRequest::Delegate*, net::URLRequestContext*, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::PipelineTestRequest::Type)); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockRequest : public internal::PipelineTestRequest { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD0(Start, void()); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Field; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Invoke; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::StrEq; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpPipeliningCompatibilityClientTest : public testing::Test { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpPipeliningCompatibilityClientTest() 85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP), 86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) test_server_(net::SpawnedTestServer::TYPE_HTTP, 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::kLocalhost, 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL( 89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "chrome/test/data/http_pipelining"))) { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start up a histogram recorder. 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(rtenneti): Leaks StatisticsRecorder and will update suppressions. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StatisticsRecorder::Initialize(); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context_ = new net::TestURLRequestContextGetter( 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO)); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_->AddRef(); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(kHistogramNames); ++i) { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* name = kHistogramNames[i]; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HistogramSamples> samples = GetHistogram(name); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (samples.get() && samples->TotalCount() > 0) { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_samples_[name] = samples.release(); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::ReleaseSoon(BrowserThread::IO, FROM_HERE, context_); 113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STLDeleteValues(&original_samples_); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunTest( 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<RequestInfo> requests, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpPipeliningCompatibilityClient::Options options) { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpPipeliningCompatibilityClient client(NULL); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestCompletionCallback callback; 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) client.Start(test_server_.GetURL(std::string()).spec(), 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) requests, 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) options, 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback.callback(), 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_->GetURLRequestContext()); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.WaitForResult(); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExpectHistogramCount(int expected_count, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_value, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistogramField field) { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* name; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (field) { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FIELD_CANARY: 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name = "NetConnectivity.Pipeline.CanarySuccess"; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FIELD_DEPTH: 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name = "NetConnectivity.Pipeline.Depth"; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FIELD_HTTP_1_1: 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name = "NetConnectivity.Pipeline.AllHTTP11"; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FIELD_SUCCESS: 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name = "NetConnectivity.Pipeline.Success"; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FAIL() << "Unexpected field: " << field; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HistogramSamples> samples = GetHistogram(name); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!samples.get()) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ContainsKey(original_samples_, name)) { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) samples->Subtract((*original_samples_[name])); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_count, samples->TotalCount()) << name; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expected_count > 0) { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_count, samples->GetCount(expected_value)) << name; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExpectRequestHistogramCount(int expected_count, 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_value, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int request_id, 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistogramField field) { 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* field_str = ""; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (field) { 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FIELD_STATUS: 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_str = "Status"; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FIELD_NETWORK_ERROR: 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_str = "NetworkError"; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FIELD_RESPONSE_CODE: 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_str = "ResponseCode"; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FAIL() << "Unexpected field: " << field; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string name = base::StringPrintf("NetConnectivity.Pipeline.%d.%s", 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_id, field_str); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HistogramSamples> samples = GetHistogram(name.c_str()); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!samples.get()) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ContainsKey(original_samples_, name)) { 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) samples->Subtract(*(original_samples_[name])); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_count, samples->TotalCount()) << name; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expected_count > 0) { 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_count, samples->GetCount(expected_value)) << name; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::TestBrowserThreadBundle thread_bundle_; 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer test_server_; 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLRequestContextGetter* context_; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HistogramSamples> GetHistogram(const char* name) { 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HistogramSamples> samples; 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HistogramBase* cached_histogram = NULL; 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HistogramBase* current_histogram = 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StatisticsRecorder::FindHistogram(name); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ContainsKey(histograms_, name)) { 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cached_histogram = histograms_[name]; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is to work around the CACHE_HISTOGRAM_* macros caching the last used 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // histogram by name. So, even though we throw out the StatisticsRecorder 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // between tests, the CACHE_HISTOGRAM_* might still write into the old 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Histogram if it has the same name as the last run. We keep a cache of the 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // last used Histogram and then update the cache if it's different than the 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // current Histogram. 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cached_histogram && current_histogram) { 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) samples = cached_histogram->SnapshotSamples(); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cached_histogram != current_histogram) { 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) samples->Add(*(current_histogram->SnapshotSamples())); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) histograms_[name] = current_histogram; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (current_histogram) { 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) samples = current_histogram->SnapshotSamples(); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) histograms_[name] = current_histogram; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (cached_histogram) { 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) samples = cached_histogram->SnapshotSamples(); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return samples.Pass(); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static std::map<std::string, HistogramBase*> histograms_; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<std::string, HistogramSamples*> original_samples_; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::map<std::string, HistogramBase*> 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpPipeliningCompatibilityClientTest::histograms_; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpPipeliningCompatibilityClientTest, Success) { 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestInfo info; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info.filename = "files/alphabet.txt"; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info.expected_response = "abcdefghijklmnopqrstuvwxyz"; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<RequestInfo> requests; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requests.push_back(info); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest(requests, HttpPipeliningCompatibilityClient::PIPE_TEST_DEFAULTS); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHistogramCount(1, true, FIELD_SUCCESS); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHistogramCount(0, 0, FIELD_DEPTH); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHistogramCount(0, 0, FIELD_HTTP_1_1); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount( 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, internal::PipelineTestRequest::STATUS_SUCCESS, 0, FIELD_STATUS); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount(0, 0, 0, FIELD_NETWORK_ERROR); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount(1, 200, 0, FIELD_RESPONSE_CODE); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpPipeliningCompatibilityClientTest, TooSmall) { 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestInfo info; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info.filename = "files/alphabet.txt"; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info.expected_response = "abcdefghijklmnopqrstuvwxyz26"; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<RequestInfo> requests; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requests.push_back(info); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest(requests, HttpPipeliningCompatibilityClient::PIPE_TEST_DEFAULTS); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHistogramCount(1, false, FIELD_SUCCESS); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount( 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, internal::PipelineTestRequest::STATUS_TOO_SMALL, 0, FIELD_STATUS); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount(0, 0, 0, FIELD_NETWORK_ERROR); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount(1, 200, 0, FIELD_RESPONSE_CODE); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpPipeliningCompatibilityClientTest, TooLarge) { 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestInfo info; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info.filename = "files/alphabet.txt"; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info.expected_response = "abc"; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<RequestInfo> requests; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requests.push_back(info); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest(requests, HttpPipeliningCompatibilityClient::PIPE_TEST_DEFAULTS); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHistogramCount(1, false, FIELD_SUCCESS); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount( 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, internal::PipelineTestRequest::STATUS_TOO_LARGE, 0, FIELD_STATUS); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount(0, 0, 0, FIELD_NETWORK_ERROR); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount(1, 200, 0, FIELD_RESPONSE_CODE); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpPipeliningCompatibilityClientTest, Mismatch) { 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestInfo info; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info.filename = "files/alphabet.txt"; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info.expected_response = "zyxwvutsrqponmlkjihgfedcba"; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<RequestInfo> requests; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requests.push_back(info); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest(requests, HttpPipeliningCompatibilityClient::PIPE_TEST_DEFAULTS); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHistogramCount(1, false, FIELD_SUCCESS); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount( 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, internal::PipelineTestRequest::STATUS_CONTENT_MISMATCH, 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, FIELD_STATUS); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount(0, 0, 0, FIELD_NETWORK_ERROR); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount(1, 200, 0, FIELD_RESPONSE_CODE); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpPipeliningCompatibilityClientTest, Redirect) { 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestInfo info; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info.filename = "server-redirect?http://foo.bar/asdf"; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info.expected_response = "shouldn't matter"; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<RequestInfo> requests; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requests.push_back(info); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest(requests, HttpPipeliningCompatibilityClient::PIPE_TEST_DEFAULTS); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHistogramCount(1, false, FIELD_SUCCESS); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount( 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, internal::PipelineTestRequest::STATUS_REDIRECTED, 0, FIELD_STATUS); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount(0, 0, 0, FIELD_NETWORK_ERROR); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount(0, 0, 0, FIELD_RESPONSE_CODE); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpPipeliningCompatibilityClientTest, AuthRequired) { 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestInfo info; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info.filename = "auth-basic"; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info.expected_response = "shouldn't matter"; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<RequestInfo> requests; 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requests.push_back(info); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest(requests, HttpPipeliningCompatibilityClient::PIPE_TEST_DEFAULTS); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHistogramCount(1, false, FIELD_SUCCESS); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount( 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, internal::PipelineTestRequest::STATUS_BAD_RESPONSE_CODE, 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, FIELD_STATUS); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount(0, 0, 0, FIELD_NETWORK_ERROR); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount(1, 401, 0, FIELD_RESPONSE_CODE); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpPipeliningCompatibilityClientTest, NoContent) { 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestInfo info; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info.filename = "nocontent"; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info.expected_response = "shouldn't matter"; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<RequestInfo> requests; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requests.push_back(info); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest(requests, HttpPipeliningCompatibilityClient::PIPE_TEST_DEFAULTS); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHistogramCount(1, false, FIELD_SUCCESS); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount( 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, internal::PipelineTestRequest::STATUS_BAD_RESPONSE_CODE, 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, FIELD_STATUS); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount(0, 0, 0, FIELD_NETWORK_ERROR); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount(1, 204, 0, FIELD_RESPONSE_CODE); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpPipeliningCompatibilityClientTest, CloseSocket) { 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestInfo info; 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info.filename = "close-socket"; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info.expected_response = "shouldn't matter"; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<RequestInfo> requests; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requests.push_back(info); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest(requests, HttpPipeliningCompatibilityClient::PIPE_TEST_DEFAULTS); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHistogramCount(1, false, FIELD_SUCCESS); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount( 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, internal::PipelineTestRequest::STATUS_NETWORK_ERROR, 0, FIELD_STATUS); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount( 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, -net::ERR_EMPTY_RESPONSE, 0, FIELD_NETWORK_ERROR); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount(0, 0, 0, FIELD_RESPONSE_CODE); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpPipeliningCompatibilityClientTest, OldHttpVersion) { 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestInfo info; 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info.filename = "http-1.0"; 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info.expected_response = "abcdefghijklmnopqrstuvwxyz"; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<RequestInfo> requests; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requests.push_back(info); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest(requests, HttpPipeliningCompatibilityClient::PIPE_TEST_DEFAULTS); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHistogramCount(1, false, FIELD_SUCCESS); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount( 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, internal::PipelineTestRequest::STATUS_BAD_HTTP_VERSION, 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, FIELD_STATUS); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount(0, 0, 0, FIELD_NETWORK_ERROR); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount(1, 200, 0, FIELD_RESPONSE_CODE); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/147903: test fails on ChromeOS 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_MultipleRequests DISABLED_MultipleRequests 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_MultipleRequests MultipleRequests 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpPipeliningCompatibilityClientTest, MAYBE_MultipleRequests) { 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<RequestInfo> requests; 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestInfo info1; 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info1.filename = "files/alphabet.txt"; 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info1.expected_response = "abcdefghijklmnopqrstuvwxyz"; 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requests.push_back(info1); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestInfo info2; 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info2.filename = "close-socket"; 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info2.expected_response = "shouldn't matter"; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requests.push_back(info2); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestInfo info3; 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info3.filename = "auth-basic"; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info3.expected_response = "shouldn't matter"; 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requests.push_back(info3); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest(requests, 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpPipeliningCompatibilityClient::PIPE_TEST_COLLECT_SERVER_STATS); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHistogramCount(1, false, FIELD_SUCCESS); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount( 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, internal::PipelineTestRequest::STATUS_SUCCESS, 0, FIELD_STATUS); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount(0, 0, 0, FIELD_NETWORK_ERROR); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount(1, 200, 0, FIELD_RESPONSE_CODE); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount( 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, internal::PipelineTestRequest::STATUS_NETWORK_ERROR, 1, FIELD_STATUS); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount( 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, -net::ERR_PIPELINE_EVICTION, 1, FIELD_NETWORK_ERROR); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount(0, 0, 1, FIELD_RESPONSE_CODE); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount( 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, internal::PipelineTestRequest::STATUS_NETWORK_ERROR, 2, FIELD_STATUS); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount( 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, -net::ERR_PIPELINE_EVICTION, 2, FIELD_NETWORK_ERROR); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount(0, 0, 2, FIELD_RESPONSE_CODE); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount( 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, internal::PipelineTestRequest::STATUS_NETWORK_ERROR, 3, FIELD_STATUS); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount( 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, -net::ERR_PIPELINE_EVICTION, 3, FIELD_NETWORK_ERROR); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount(0, 0, 3, FIELD_RESPONSE_CODE); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpPipeliningCompatibilityClientTest, StatsOk) { 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(internal::PipelineTestRequest::STATUS_SUCCESS, 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::ProcessStatsResponse( 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "max_pipeline_depth:3,were_all_requests_http_1_1:0")); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHistogramCount(1, 3, FIELD_DEPTH); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHistogramCount(1, 0, FIELD_HTTP_1_1); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpPipeliningCompatibilityClientTest, StatsIndifferentToOrder) { 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(internal::PipelineTestRequest::STATUS_SUCCESS, 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::ProcessStatsResponse( 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "were_all_requests_http_1_1:1,max_pipeline_depth:2")); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHistogramCount(1, 2, FIELD_DEPTH); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHistogramCount(1, 1, FIELD_HTTP_1_1); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/147903: test fails on ChromeOS 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_StatsBadField DISABLED_StatsBadField 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_StatsBadField StatsBadField 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpPipeliningCompatibilityClientTest, MAYBE_StatsBadField) { 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(internal::PipelineTestRequest::STATUS_CORRUPT_STATS, 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::ProcessStatsResponse( 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "foo:3,were_all_requests_http_1_1:1")); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHistogramCount(0, 0, FIELD_DEPTH); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHistogramCount(0, 0, FIELD_HTTP_1_1); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpPipeliningCompatibilityClientTest, StatsTooShort) { 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(internal::PipelineTestRequest::STATUS_CORRUPT_STATS, 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::ProcessStatsResponse("were_all_requests_http_1_1:1")); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHistogramCount(0, 0, FIELD_DEPTH); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHistogramCount(0, 0, FIELD_HTTP_1_1); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpPipeliningCompatibilityClientTest, WaitForCanary) { 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockFactory* factory = new MockFactory; 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpPipeliningCompatibilityClient client(factory); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockRequest* request = new MockRequest; 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Closure request_cb = base::Bind( 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &internal::PipelineTestRequest::Delegate::OnRequestFinished, 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(&client), 0, 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::PipelineTestRequest::STATUS_SUCCESS); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockRequest* canary = new MockRequest; 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Closure canary_cb = base::Bind( 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &internal::PipelineTestRequest::Delegate::OnCanaryFinished, 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(&client), internal::PipelineTestRequest::STATUS_SUCCESS); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*factory, NewRequest( 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, _, Field(&RequestInfo::filename, StrEq("request.txt")), _, _, 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::PipelineTestRequest::TYPE_PIPELINED)) 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(request)); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*factory, NewRequest( 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 999, _, Field(&RequestInfo::filename, StrEq("index.html")), _, _, 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::PipelineTestRequest::TYPE_CANARY)) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(canary)); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*canary, Start()) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Invoke(&canary_cb, &base::Closure::Run)); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*request, Start()) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Invoke(&request_cb, &base::Closure::Run)); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<RequestInfo> requests; 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestInfo info1; 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info1.filename = "request.txt"; 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requests.push_back(info1); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestCompletionCallback callback; 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client.Start("http://base/", requests, 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpPipeliningCompatibilityClient::PIPE_TEST_RUN_CANARY_REQUEST, 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.callback(), context_->GetURLRequestContext()); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.WaitForResult(); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHistogramCount(1, true, FIELD_CANARY); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHistogramCount(1, true, FIELD_SUCCESS); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRequestHistogramCount( 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, internal::PipelineTestRequest::STATUS_SUCCESS, 0, FIELD_STATUS); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/147903: test fails on ChromeOS 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_CanaryFailure DISABLED_CanaryFailure 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_CanaryFailure CanaryFailure 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpPipeliningCompatibilityClientTest, MAYBE_CanaryFailure) { 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockFactory* factory = new MockFactory; 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpPipeliningCompatibilityClient client(factory); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockRequest* request = new MockRequest; 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockRequest* canary = new MockRequest; 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Closure canary_cb = base::Bind( 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &internal::PipelineTestRequest::Delegate::OnCanaryFinished, 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(&client), 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::PipelineTestRequest::STATUS_REDIRECTED); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*factory, NewRequest( 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, _, Field(&RequestInfo::filename, StrEq("request.txt")), _, _, 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::PipelineTestRequest::TYPE_PIPELINED)) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(request)); 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*factory, NewRequest( 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 999, _, Field(&RequestInfo::filename, StrEq("index.html")), _, _, 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::PipelineTestRequest::TYPE_CANARY)) 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(canary)); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*canary, Start()) 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Invoke(&canary_cb, &base::Closure::Run)); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*request, Start()) 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(0); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<RequestInfo> requests; 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestInfo info1; 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info1.filename = "request.txt"; 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requests.push_back(info1); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestCompletionCallback callback; 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client.Start("http://base/", requests, 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpPipeliningCompatibilityClient::PIPE_TEST_RUN_CANARY_REQUEST, 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.callback(), context_->GetURLRequestContext()); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.WaitForResult(); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHistogramCount(1, false, FIELD_CANARY); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHistogramCount(0, false, FIELD_SUCCESS); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHistogramCount(0, true, FIELD_SUCCESS); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // anonymous namespace 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chrome_browser_net 598