| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/basictypes.h" | 5 #include "base/basictypes.h" |
| 6 #include "base/compiler_specific.h" | 6 #include "base/compiler_specific.h" |
| 7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
| 8 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
| 9 #include "base/strings/string_number_conversions.h" | 9 #include "base/strings/string_number_conversions.h" |
| 10 #include "net/base/test_completion_callback.h" | 10 #include "net/base/test_completion_callback.h" |
| (...skipping 28 matching lines...) Expand all Loading... |
| 39 namespace { | 39 namespace { |
| 40 | 40 |
| 41 const char kResponseBody[] = "some arbitrary response body"; | 41 const char kResponseBody[] = "some arbitrary response body"; |
| 42 | 42 |
| 43 // Factory for creating HttpTransactions, used by TestTransactionConsumer. | 43 // Factory for creating HttpTransactions, used by TestTransactionConsumer. |
| 44 class TestTransactionFactory : public HttpTransactionFactory { | 44 class TestTransactionFactory : public HttpTransactionFactory { |
| 45 public: | 45 public: |
| 46 TestTransactionFactory(const HttpNetworkSession::Params& params) | 46 TestTransactionFactory(const HttpNetworkSession::Params& params) |
| 47 : session_(new HttpNetworkSession(params)) {} | 47 : session_(new HttpNetworkSession(params)) {} |
| 48 | 48 |
| 49 virtual ~TestTransactionFactory() { | 49 virtual ~TestTransactionFactory() {} |
| 50 } | |
| 51 | 50 |
| 52 // HttpTransactionFactory methods | 51 // HttpTransactionFactory methods |
| 53 virtual int CreateTransaction(RequestPriority priority, | 52 virtual int CreateTransaction(RequestPriority priority, |
| 54 scoped_ptr<HttpTransaction>* trans) OVERRIDE { | 53 scoped_ptr<HttpTransaction>* trans) OVERRIDE { |
| 55 trans->reset(new HttpNetworkTransaction(priority, session_)); | 54 trans->reset(new HttpNetworkTransaction(priority, session_)); |
| 56 return OK; | 55 return OK; |
| 57 } | 56 } |
| 58 | 57 |
| 59 virtual HttpCache* GetCache() OVERRIDE { | 58 virtual HttpCache* GetCache() OVERRIDE { return NULL; } |
| 60 return NULL; | |
| 61 } | |
| 62 | 59 |
| 63 virtual HttpNetworkSession* GetSession() OVERRIDE { | 60 virtual HttpNetworkSession* GetSession() OVERRIDE { |
| 64 return session_; | 61 return session_; |
| 65 }; | 62 }; |
| 66 | 63 |
| 67 private: | 64 private: |
| 68 scoped_refptr<HttpNetworkSession> session_; | 65 scoped_refptr<HttpNetworkSession> session_; |
| 69 }; | 66 }; |
| 70 | 67 |
| 71 } // namespace | 68 } // namespace |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 104 return resolver; | 101 return resolver; |
| 105 } | 102 } |
| 106 | 103 |
| 107 virtual void SetUp() { | 104 virtual void SetUp() { |
| 108 QuicInMemoryCachePeer::ResetForTests(); | 105 QuicInMemoryCachePeer::ResetForTests(); |
| 109 StartServer(); | 106 StartServer(); |
| 110 | 107 |
| 111 // Use a mapped host resolver so that request for www.google.com (port 80) | 108 // Use a mapped host resolver so that request for www.google.com (port 80) |
| 112 // reach the server running on localhost. | 109 // reach the server running on localhost. |
| 113 std::string map_rule = "MAP www.google.com www.google.com:" + | 110 std::string map_rule = "MAP www.google.com www.google.com:" + |
| 114 base::IntToString(server_thread_->GetPort()); | 111 base::IntToString(server_thread_->GetPort()); |
| 115 EXPECT_TRUE(host_resolver_.AddRuleFromString(map_rule)); | 112 EXPECT_TRUE(host_resolver_.AddRuleFromString(map_rule)); |
| 116 | 113 |
| 117 // To simplify the test, and avoid the race with the HTTP request, we force | 114 // To simplify the test, and avoid the race with the HTTP request, we force |
| 118 // QUIC for these requests. | 115 // QUIC for these requests. |
| 119 params_.origin_to_force_quic_on = | 116 params_.origin_to_force_quic_on = |
| 120 HostPortPair::FromString("www.google.com:80"); | 117 HostPortPair::FromString("www.google.com:80"); |
| 121 | 118 |
| 122 transaction_factory_.reset(new TestTransactionFactory(params_)); | 119 transaction_factory_.reset(new TestTransactionFactory(params_)); |
| 123 } | 120 } |
| 124 | 121 |
| 125 virtual void TearDown() { | 122 virtual void TearDown() { |
| 126 StopServer(); | 123 StopServer(); |
| 127 QuicInMemoryCachePeer::ResetForTests(); | 124 QuicInMemoryCachePeer::ResetForTests(); |
| 128 } | 125 } |
| 129 | 126 |
| 130 // Starts the QUIC server listening on a random port. | 127 // Starts the QUIC server listening on a random port. |
| 131 void StartServer() { | 128 void StartServer() { |
| 132 net::IPAddressNumber ip; | 129 net::IPAddressNumber ip; |
| 133 CHECK(net::ParseIPLiteralToNumber("127.0.0.1", &ip)); | 130 CHECK(net::ParseIPLiteralToNumber("127.0.0.1", &ip)); |
| 134 server_address_ = IPEndPoint(ip, 0); | 131 server_address_ = IPEndPoint(ip, 0); |
| 135 server_config_.SetDefaults(); | 132 server_config_.SetDefaults(); |
| 136 server_thread_.reset(new ServerThread(server_address_, server_config_, | 133 server_thread_.reset(new ServerThread(server_address_, |
| 134 server_config_, |
| 137 QuicSupportedVersions(), | 135 QuicSupportedVersions(), |
| 138 strike_register_no_startup_period_, | 136 strike_register_no_startup_period_, |
| 139 kInitialFlowControlWindowForTest)); | 137 kInitialFlowControlWindowForTest)); |
| 140 server_thread_->Initialize(); | 138 server_thread_->Initialize(); |
| 141 server_address_ = IPEndPoint(server_address_.address(), | 139 server_address_ = |
| 142 server_thread_->GetPort()); | 140 IPEndPoint(server_address_.address(), server_thread_->GetPort()); |
| 143 server_thread_->Start(); | 141 server_thread_->Start(); |
| 144 server_started_ = true; | 142 server_started_ = true; |
| 145 } | 143 } |
| 146 | 144 |
| 147 // Stops the QUIC server. | 145 // Stops the QUIC server. |
| 148 void StopServer() { | 146 void StopServer() { |
| 149 if (!server_started_) { | 147 if (!server_started_) { |
| 150 return; | 148 return; |
| 151 } | 149 } |
| 152 if (server_thread_.get()) { | 150 if (server_thread_.get()) { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 173 request_body_.reserve(length); | 171 request_body_.reserve(length); |
| 174 for (size_t i = 0; i < length; ++i) { | 172 for (size_t i = 0; i < length; ++i) { |
| 175 request_body_.append(1, static_cast<char>(32 + i % (126 - 32))); | 173 request_body_.append(1, static_cast<char>(32 + i % (126 - 32))); |
| 176 } | 174 } |
| 177 } | 175 } |
| 178 | 176 |
| 179 // Initializes |request_| for a post of |length| bytes. | 177 // Initializes |request_| for a post of |length| bytes. |
| 180 void InitializePostRequest(size_t length) { | 178 void InitializePostRequest(size_t length) { |
| 181 GenerateBody(length); | 179 GenerateBody(length); |
| 182 ScopedVector<UploadElementReader> element_readers; | 180 ScopedVector<UploadElementReader> element_readers; |
| 183 element_readers.push_back( | 181 element_readers.push_back(new UploadBytesElementReader( |
| 184 new UploadBytesElementReader(request_body_.data(), | 182 request_body_.data(), request_body_.length())); |
| 185 request_body_.length())); | |
| 186 upload_data_stream_.reset(new UploadDataStream(element_readers.Pass(), 0)); | 183 upload_data_stream_.reset(new UploadDataStream(element_readers.Pass(), 0)); |
| 187 request_.method = "POST"; | 184 request_.method = "POST"; |
| 188 request_.url = GURL("http://www.google.com/"); | 185 request_.url = GURL("http://www.google.com/"); |
| 189 request_.upload_data_stream = upload_data_stream_.get(); | 186 request_.upload_data_stream = upload_data_stream_.get(); |
| 190 ASSERT_EQ(OK, request_.upload_data_stream->Init(CompletionCallback())); | 187 ASSERT_EQ(OK, request_.upload_data_stream->Init(CompletionCallback())); |
| 191 } | 188 } |
| 192 | 189 |
| 193 // Checks that |consumer| completed and received |status_line| and |body|. | 190 // Checks that |consumer| completed and received |status_line| and |body|. |
| 194 void CheckResponse(const TestTransactionConsumer& consumer, | 191 void CheckResponse(const TestTransactionConsumer& consumer, |
| 195 const std::string& status_line, | 192 const std::string& status_line, |
| 196 const std::string& body) { | 193 const std::string& body) { |
| 197 ASSERT_TRUE(consumer.is_done()); | 194 ASSERT_TRUE(consumer.is_done()); |
| 198 EXPECT_EQ(OK, consumer.error()); | 195 EXPECT_EQ(OK, consumer.error()); |
| 199 EXPECT_EQ(status_line, | 196 EXPECT_EQ(status_line, consumer.response_info()->headers->GetStatusLine()); |
| 200 consumer.response_info()->headers->GetStatusLine()); | |
| 201 EXPECT_EQ(body, consumer.content()); | 197 EXPECT_EQ(body, consumer.content()); |
| 202 } | 198 } |
| 203 | 199 |
| 204 scoped_ptr<MockHostResolver> host_resolver_impl_; | 200 scoped_ptr<MockHostResolver> host_resolver_impl_; |
| 205 MappedHostResolver host_resolver_; | 201 MappedHostResolver host_resolver_; |
| 206 MockCertVerifier cert_verifier_; | 202 MockCertVerifier cert_verifier_; |
| 207 TransportSecurityState transport_security_state_; | 203 TransportSecurityState transport_security_state_; |
| 208 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_; | 204 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_; |
| 209 scoped_ptr<ProxyService> proxy_service_; | 205 scoped_ptr<ProxyService> proxy_service_; |
| 210 scoped_ptr<HttpAuthHandlerFactory> auth_handler_factory_; | 206 scoped_ptr<HttpAuthHandlerFactory> auth_handler_factory_; |
| 211 HttpServerPropertiesImpl http_server_properties; | 207 HttpServerPropertiesImpl http_server_properties; |
| 212 HttpNetworkSession::Params params_; | 208 HttpNetworkSession::Params params_; |
| 213 scoped_ptr<TestTransactionFactory> transaction_factory_; | 209 scoped_ptr<TestTransactionFactory> transaction_factory_; |
| 214 HttpRequestInfo request_; | 210 HttpRequestInfo request_; |
| 215 std::string request_body_; | 211 std::string request_body_; |
| 216 scoped_ptr<UploadDataStream> upload_data_stream_; | 212 scoped_ptr<UploadDataStream> upload_data_stream_; |
| 217 scoped_ptr<ServerThread> server_thread_; | 213 scoped_ptr<ServerThread> server_thread_; |
| 218 IPEndPoint server_address_; | 214 IPEndPoint server_address_; |
| 219 std::string server_hostname_; | 215 std::string server_hostname_; |
| 220 QuicConfig server_config_; | 216 QuicConfig server_config_; |
| 221 bool server_started_; | 217 bool server_started_; |
| 222 bool strike_register_no_startup_period_; | 218 bool strike_register_no_startup_period_; |
| 223 }; | 219 }; |
| 224 | 220 |
| 225 TEST_F(QuicEndToEndTest, LargeGetWithNoPacketLoss) { | 221 TEST_F(QuicEndToEndTest, LargeGetWithNoPacketLoss) { |
| 226 std::string response(10 * 1024, 'x'); | 222 std::string response(10 * 1024, 'x'); |
| 227 | 223 |
| 228 AddToCache("GET", request_.url.spec(), | 224 AddToCache("GET", request_.url.spec(), "HTTP/1.1", "200", "OK", response); |
| 229 "HTTP/1.1", "200", "OK", | |
| 230 response); | |
| 231 | 225 |
| 232 TestTransactionConsumer consumer(DEFAULT_PRIORITY, | 226 TestTransactionConsumer consumer(DEFAULT_PRIORITY, |
| 233 transaction_factory_.get()); | 227 transaction_factory_.get()); |
| 234 consumer.Start(&request_, BoundNetLog()); | 228 consumer.Start(&request_, BoundNetLog()); |
| 235 | 229 |
| 236 // Will terminate when the last consumer completes. | 230 // Will terminate when the last consumer completes. |
| 237 base::MessageLoop::current()->Run(); | 231 base::MessageLoop::current()->Run(); |
| 238 | 232 |
| 239 CheckResponse(consumer, "HTTP/1.1 200 OK", response); | 233 CheckResponse(consumer, "HTTP/1.1 200 OK", response); |
| 240 } | 234 } |
| 241 | 235 |
| 242 // http://crbug.com/307284 | 236 // http://crbug.com/307284 |
| 243 TEST_F(QuicEndToEndTest, DISABLED_LargePostWithNoPacketLoss) { | 237 TEST_F(QuicEndToEndTest, DISABLED_LargePostWithNoPacketLoss) { |
| 244 InitializePostRequest(10 * 1024 * 1024); | 238 InitializePostRequest(10 * 1024 * 1024); |
| 245 | 239 |
| 246 AddToCache("POST", request_.url.spec(), | 240 AddToCache( |
| 247 "HTTP/1.1", "200", "OK", | 241 "POST", request_.url.spec(), "HTTP/1.1", "200", "OK", kResponseBody); |
| 248 kResponseBody); | |
| 249 | 242 |
| 250 TestTransactionConsumer consumer(DEFAULT_PRIORITY, | 243 TestTransactionConsumer consumer(DEFAULT_PRIORITY, |
| 251 transaction_factory_.get()); | 244 transaction_factory_.get()); |
| 252 consumer.Start(&request_, BoundNetLog()); | 245 consumer.Start(&request_, BoundNetLog()); |
| 253 | 246 |
| 254 // Will terminate when the last consumer completes. | 247 // Will terminate when the last consumer completes. |
| 255 base::MessageLoop::current()->Run(); | 248 base::MessageLoop::current()->Run(); |
| 256 | 249 |
| 257 CheckResponse(consumer, "HTTP/1.1 200 OK", kResponseBody); | 250 CheckResponse(consumer, "HTTP/1.1 200 OK", kResponseBody); |
| 258 } | 251 } |
| 259 | 252 |
| 260 TEST_F(QuicEndToEndTest, LargePostWithPacketLoss) { | 253 TEST_F(QuicEndToEndTest, LargePostWithPacketLoss) { |
| 261 // FLAGS_fake_packet_loss_percentage = 30; | 254 // FLAGS_fake_packet_loss_percentage = 30; |
| 262 InitializePostRequest(1024 * 1024); | 255 InitializePostRequest(1024 * 1024); |
| 263 | 256 |
| 264 const char kResponseBody[] = "some really big response body"; | 257 const char kResponseBody[] = "some really big response body"; |
| 265 AddToCache("POST", request_.url.spec(), | 258 AddToCache( |
| 266 "HTTP/1.1", "200", "OK", | 259 "POST", request_.url.spec(), "HTTP/1.1", "200", "OK", kResponseBody); |
| 267 kResponseBody); | |
| 268 | 260 |
| 269 TestTransactionConsumer consumer(DEFAULT_PRIORITY, | 261 TestTransactionConsumer consumer(DEFAULT_PRIORITY, |
| 270 transaction_factory_.get()); | 262 transaction_factory_.get()); |
| 271 consumer.Start(&request_, BoundNetLog()); | 263 consumer.Start(&request_, BoundNetLog()); |
| 272 | 264 |
| 273 // Will terminate when the last consumer completes. | 265 // Will terminate when the last consumer completes. |
| 274 base::MessageLoop::current()->Run(); | 266 base::MessageLoop::current()->Run(); |
| 275 | 267 |
| 276 CheckResponse(consumer, "HTTP/1.1 200 OK", kResponseBody); | 268 CheckResponse(consumer, "HTTP/1.1 200 OK", kResponseBody); |
| 277 } | 269 } |
| 278 | 270 |
| 279 TEST_F(QuicEndToEndTest, UberTest) { | 271 TEST_F(QuicEndToEndTest, UberTest) { |
| 280 // FLAGS_fake_packet_loss_percentage = 30; | 272 // FLAGS_fake_packet_loss_percentage = 30; |
| 281 | 273 |
| 282 const char kResponseBody[] = "some really big response body"; | 274 const char kResponseBody[] = "some really big response body"; |
| 283 AddToCache("GET", request_.url.spec(), | 275 AddToCache( |
| 284 "HTTP/1.1", "200", "OK", | 276 "GET", request_.url.spec(), "HTTP/1.1", "200", "OK", kResponseBody); |
| 285 kResponseBody); | |
| 286 | 277 |
| 287 std::vector<TestTransactionConsumer*> consumers; | 278 std::vector<TestTransactionConsumer*> consumers; |
| 288 size_t num_requests = 100; | 279 size_t num_requests = 100; |
| 289 for (size_t i = 0; i < num_requests; ++i) { | 280 for (size_t i = 0; i < num_requests; ++i) { |
| 290 TestTransactionConsumer* consumer = | 281 TestTransactionConsumer* consumer = new TestTransactionConsumer( |
| 291 new TestTransactionConsumer(DEFAULT_PRIORITY, | 282 DEFAULT_PRIORITY, transaction_factory_.get()); |
| 292 transaction_factory_.get()); | 283 consumers.push_back(consumer); |
| 293 consumers.push_back(consumer); | 284 consumer->Start(&request_, BoundNetLog()); |
| 294 consumer->Start(&request_, BoundNetLog()); | |
| 295 } | 285 } |
| 296 | 286 |
| 297 // Will terminate when the last consumer completes. | 287 // Will terminate when the last consumer completes. |
| 298 base::MessageLoop::current()->Run(); | 288 base::MessageLoop::current()->Run(); |
| 299 | 289 |
| 300 for (size_t i = 0; i < num_requests; ++i) { | 290 for (size_t i = 0; i < num_requests; ++i) { |
| 301 CheckResponse(*consumers[i], "HTTP/1.1 200 OK", kResponseBody); | 291 CheckResponse(*consumers[i], "HTTP/1.1 200 OK", kResponseBody); |
| 302 } | 292 } |
| 303 STLDeleteElements(&consumers); | 293 STLDeleteElements(&consumers); |
| 304 } | 294 } |
| 305 | 295 |
| 306 } // namespace test | 296 } // namespace test |
| 307 } // namespace net | 297 } // namespace net |
| OLD | NEW |