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