14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file.
44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/basictypes.h"
64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/compiler_specific.h"
74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/stl_util.h"
94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/base/test_completion_callback.h"
114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/base/upload_bytes_element_reader.h"
124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/base/upload_data_stream.h"
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/cert/mock_cert_verifier.h"
144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/dns/mapped_host_resolver.h"
154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/dns/mock_host_resolver.h"
164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/http/http_auth_handler_factory.h"
174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/http/http_network_session.h"
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/http/http_network_transaction.h"
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/http/http_server_properties_impl.h"
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "net/http/http_transaction_test_util.h"
214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/http/transport_security_state.h"
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/proxy/proxy_service.h"
23e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "net/quic/test_tools/quic_test_utils.h"
244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/ssl/ssl_config_service_defaults.h"
254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/tools/quic/quic_in_memory_cache.h"
26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "net/tools/quic/quic_server.h"
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/tools/quic/test_tools/quic_in_memory_cache_peer.h"
284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/tools/quic/test_tools/server_thread.h"
294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "testing/platform_test.h"
314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using base::StringPiece;
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using net::tools::QuicInMemoryCache;
34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)using net::tools::QuicServer;
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using net::tools::test::QuicInMemoryCachePeer;
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using net::tools::test::ServerThread;
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace net {
394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace test {
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace {
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char kResponseBody[] = "some arbitrary response body";
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Factory for creating HttpTransactions, used by TestTransactionConsumer.
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class TestTransactionFactory : public HttpTransactionFactory {
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  TestTransactionFactory(const HttpNetworkSession::Params& params)
494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      : session_(new HttpNetworkSession(params)) {}
504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual ~TestTransactionFactory() {
524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // HttpTransactionFactory methods
554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual int CreateTransaction(RequestPriority priority,
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                scoped_ptr<HttpTransaction>* trans) OVERRIDE {
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    trans->reset(new HttpNetworkTransaction(priority, session_.get()));
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return OK;
594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual HttpCache* GetCache() OVERRIDE {
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return NULL;
634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual HttpNetworkSession* GetSession() OVERRIDE { return session_.get(); };
664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<HttpNetworkSession> session_;
694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}  // namespace
724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class QuicEndToEndTest : public PlatformTest {
744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) protected:
754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  QuicEndToEndTest()
764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      : host_resolver_impl_(CreateResolverImpl()),
774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        host_resolver_(host_resolver_impl_.PassAs<HostResolver>()),
784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        ssl_config_service_(new SSLConfigServiceDefaults),
794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        proxy_service_(ProxyService::CreateDirect()),
804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        auth_handler_factory_(
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        strike_register_no_startup_period_(false) {
834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    request_.method = "GET";
844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    request_.url = GURL("http://www.google.com/");
854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    request_.load_flags = 0;
864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    params_.enable_quic = true;
884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    params_.quic_clock = NULL;
894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    params_.quic_random = NULL;
904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    params_.host_resolver = &host_resolver_;
914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    params_.cert_verifier = &cert_verifier_;
924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    params_.transport_security_state = &transport_security_state_;
934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    params_.proxy_service = proxy_service_.get();
944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    params_.ssl_config_service = ssl_config_service_.get();
954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    params_.http_auth_handler_factory = auth_handler_factory_.get();
964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    params_.http_server_properties = http_server_properties.GetWeakPtr();
974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Creates a mock host resolver in which www.google.com
1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // resolves to localhost.
1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  static MockHostResolver* CreateResolverImpl() {
1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    MockHostResolver* resolver = new MockHostResolver();
1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    resolver->rules()->AddRule("www.google.com", "127.0.0.1");
1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return resolver;
1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SetUp() {
1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    QuicInMemoryCachePeer::ResetForTests();
1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    StartServer();
1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Use a mapped host resolver so that request for www.google.com (port 80)
1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // reach the server running on localhost.
1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    std::string map_rule = "MAP www.google.com www.google.com:" +
1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        base::IntToString(server_thread_->GetPort());
1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_TRUE(host_resolver_.AddRuleFromString(map_rule));
1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // To simplify the test, and avoid the race with the HTTP request, we force
1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // QUIC for these requests.
1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    params_.origin_to_force_quic_on =
1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        HostPortPair::FromString("www.google.com:80");
1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    transaction_factory_.reset(new TestTransactionFactory(params_));
1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void TearDown() {
1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    StopServer();
1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    QuicInMemoryCachePeer::ResetForTests();
1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Starts the QUIC server listening on a random port.
1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void StartServer() {
1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    net::IPAddressNumber ip;
1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    CHECK(net::ParseIPLiteralToNumber("127.0.0.1", &ip));
1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    server_address_ = IPEndPoint(ip, 0);
1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    server_config_.SetDefaults();
136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    server_config_.SetInitialFlowControlWindowToSend(
1376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        kInitialSessionFlowControlWindowForTest);
1386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    server_config_.SetInitialStreamFlowControlWindowToSend(
1396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        kInitialStreamFlowControlWindowForTest);
1406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    server_config_.SetInitialSessionFlowControlWindowToSend(
1416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        kInitialSessionFlowControlWindowForTest);
142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    server_thread_.reset(new ServerThread(
143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)         new QuicServer(server_config_, QuicSupportedVersions()),
144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)         server_address_,
145f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)         strike_register_no_startup_period_));
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    server_thread_->Initialize();
1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    server_address_ = IPEndPoint(server_address_.address(),
1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                 server_thread_->GetPort());
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    server_thread_->Start();
1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    server_started_ = true;
1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Stops the QUIC server.
1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void StopServer() {
1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (!server_started_) {
1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return;
1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (server_thread_.get()) {
159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      server_thread_->Quit();
1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      server_thread_->Join();
1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Adds an entry to the cache used by the QUIC server to serve
1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // responses.
1664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void AddToCache(const StringPiece& method,
1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  const StringPiece& path,
1684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  const StringPiece& version,
1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  const StringPiece& response_code,
1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  const StringPiece& response_detail,
1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  const StringPiece& body) {
1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    QuicInMemoryCache::GetInstance()->AddSimpleResponse(
1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        method, path, version, response_code, response_detail, body);
1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Populates |request_body_| with |length_| ASCII bytes.
1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void GenerateBody(size_t length) {
1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    request_body_.clear();
1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    request_body_.reserve(length);
1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    for (size_t i = 0; i < length; ++i) {
1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      request_body_.append(1, static_cast<char>(32 + i % (126 - 32)));
1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Initializes |request_| for a post of |length| bytes.
1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void InitializePostRequest(size_t length) {
1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    GenerateBody(length);
1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ScopedVector<UploadElementReader> element_readers;
1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    element_readers.push_back(
1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        new UploadBytesElementReader(request_body_.data(),
1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                     request_body_.length()));
1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    upload_data_stream_.reset(new UploadDataStream(element_readers.Pass(), 0));
1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    request_.method = "POST";
1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    request_.url = GURL("http://www.google.com/");
1954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    request_.upload_data_stream = upload_data_stream_.get();
1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ASSERT_EQ(OK, request_.upload_data_stream->Init(CompletionCallback()));
1974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Checks that |consumer| completed and received |status_line| and |body|.
2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void CheckResponse(const TestTransactionConsumer& consumer,
2014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     const std::string& status_line,
2024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     const std::string& body) {
2034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ASSERT_TRUE(consumer.is_done());
2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(OK, consumer.error());
2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(status_line,
2064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              consumer.response_info()->headers->GetStatusLine());
2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(body, consumer.content());
2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<MockHostResolver> host_resolver_impl_;
2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  MappedHostResolver host_resolver_;
2124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  MockCertVerifier cert_verifier_;
2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  TransportSecurityState transport_security_state_;
2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
2154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<ProxyService> proxy_service_;
2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  HttpServerPropertiesImpl http_server_properties;
2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  HttpNetworkSession::Params params_;
2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<TestTransactionFactory> transaction_factory_;
2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  HttpRequestInfo request_;
2214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::string request_body_;
2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<UploadDataStream> upload_data_stream_;
2234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<ServerThread> server_thread_;
2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  IPEndPoint server_address_;
2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::string server_hostname_;
2264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  QuicConfig server_config_;
2274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool server_started_;
2284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool strike_register_no_startup_period_;
2294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
2304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(QuicEndToEndTest, LargeGetWithNoPacketLoss) {
2324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::string response(10 * 1024, 'x');
2334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddToCache("GET", request_.url.spec(),
2354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)             "HTTP/1.1", "200", "OK",
2364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)             response);
2374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  TestTransactionConsumer consumer(DEFAULT_PRIORITY,
2394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   transaction_factory_.get());
2404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  consumer.Start(&request_, BoundNetLog());
2414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Will terminate when the last consumer completes.
2434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::MessageLoop::current()->Run();
2444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  CheckResponse(consumer, "HTTP/1.1 200 OK", response);
2464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// http://crbug.com/307284
2494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(QuicEndToEndTest, DISABLED_LargePostWithNoPacketLoss) {
2504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  InitializePostRequest(10 * 1024 * 1024);
2514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddToCache("POST", request_.url.spec(),
2534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)             "HTTP/1.1", "200", "OK",
2544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)             kResponseBody);
2554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  TestTransactionConsumer consumer(DEFAULT_PRIORITY,
2574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   transaction_factory_.get());
2584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  consumer.Start(&request_, BoundNetLog());
2594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Will terminate when the last consumer completes.
2614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::MessageLoop::current()->Run();
2624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  CheckResponse(consumer, "HTTP/1.1 200 OK", kResponseBody);
2644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(QuicEndToEndTest, LargePostWithPacketLoss) {
2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // FLAGS_fake_packet_loss_percentage = 30;
2684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  InitializePostRequest(1024 * 1024);
2694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const char kResponseBody[] = "some really big response body";
2714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddToCache("POST", request_.url.spec(),
2724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)             "HTTP/1.1", "200", "OK",
2734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)             kResponseBody);
2744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  TestTransactionConsumer consumer(DEFAULT_PRIORITY,
2764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   transaction_factory_.get());
2774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  consumer.Start(&request_, BoundNetLog());
2784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Will terminate when the last consumer completes.
2804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::MessageLoop::current()->Run();
2814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  CheckResponse(consumer, "HTTP/1.1 200 OK", kResponseBody);
2834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(QuicEndToEndTest, UberTest) {
2864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // FLAGS_fake_packet_loss_percentage = 30;
2874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const char kResponseBody[] = "some really big response body";
2894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddToCache("GET", request_.url.spec(),
2904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)             "HTTP/1.1", "200", "OK",
2914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)             kResponseBody);
2924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::vector<TestTransactionConsumer*> consumers;
2944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  size_t num_requests = 100;
2954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  for (size_t i = 0; i < num_requests; ++i) {
2964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      TestTransactionConsumer* consumer =
2974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          new TestTransactionConsumer(DEFAULT_PRIORITY,
2984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                      transaction_factory_.get());
2994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      consumers.push_back(consumer);
3004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      consumer->Start(&request_, BoundNetLog());
3014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
3024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Will terminate when the last consumer completes.
3044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::MessageLoop::current()->Run();
3054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  for (size_t i = 0; i < num_requests; ++i) {
3074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    CheckResponse(*consumers[i], "HTTP/1.1 200 OK", kResponseBody);
3084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
3094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  STLDeleteElements(&consumers);
3104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
3114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}  // namespace test
3134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}  // namespace net
314