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