OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "net/base/capturing_net_log.h" | 9 #include "net/base/capturing_net_log.h" |
10 #include "net/base/net_log_unittest.h" | 10 #include "net/base/net_log_unittest.h" |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
54 namespace test { | 54 namespace test { |
55 | 55 |
56 class QuicNetworkTransactionTest : public PlatformTest { | 56 class QuicNetworkTransactionTest : public PlatformTest { |
57 protected: | 57 protected: |
58 QuicNetworkTransactionTest() | 58 QuicNetworkTransactionTest() |
59 : clock_(new MockClock), | 59 : clock_(new MockClock), |
60 ssl_config_service_(new SSLConfigServiceDefaults), | 60 ssl_config_service_(new SSLConfigServiceDefaults), |
61 proxy_service_(ProxyService::CreateDirect()), | 61 proxy_service_(ProxyService::CreateDirect()), |
62 compressor_(new QuicSpdyCompressor()), | 62 compressor_(new QuicSpdyCompressor()), |
63 auth_handler_factory_( | 63 auth_handler_factory_( |
64 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)) { | 64 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)), |
| 65 hanging_data_(NULL, 0, NULL, 0) { |
65 request_.method = "GET"; | 66 request_.method = "GET"; |
66 request_.url = GURL("http://www.google.com/"); | 67 request_.url = GURL("http://www.google.com/"); |
67 request_.load_flags = 0; | 68 request_.load_flags = 0; |
68 } | 69 } |
69 | 70 |
70 virtual void SetUp() { | 71 virtual void SetUp() { |
71 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); | 72 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); |
72 base::MessageLoop::current()->RunUntilIdle(); | 73 base::MessageLoop::current()->RunUntilIdle(); |
73 } | 74 } |
74 | 75 |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
204 header_.public_header.guid = random_generator_.RandUint64(); | 205 header_.public_header.guid = random_generator_.RandUint64(); |
205 header_.public_header.reset_flag = false; | 206 header_.public_header.reset_flag = false; |
206 header_.public_header.version_flag = should_include_version; | 207 header_.public_header.version_flag = should_include_version; |
207 header_.packet_sequence_number = sequence_number; | 208 header_.packet_sequence_number = sequence_number; |
208 header_.fec_group = 0; | 209 header_.fec_group = 0; |
209 header_.entropy_flag = false; | 210 header_.entropy_flag = false; |
210 header_.fec_flag = false; | 211 header_.fec_flag = false; |
211 } | 212 } |
212 | 213 |
213 void CreateSession() { | 214 void CreateSession() { |
| 215 CreateSessionWithFactory(&socket_factory_); |
| 216 } |
| 217 |
| 218 void CreateSessionWithFactory(ClientSocketFactory* socket_factory) { |
214 params_.enable_quic = true; | 219 params_.enable_quic = true; |
215 params_.quic_clock = clock_; | 220 params_.quic_clock = clock_; |
216 params_.quic_random = &random_generator_; | 221 params_.quic_random = &random_generator_; |
217 params_.client_socket_factory = &socket_factory_; | 222 params_.client_socket_factory = socket_factory; |
218 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_; | 223 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_; |
219 params_.host_resolver = &host_resolver_; | 224 params_.host_resolver = &host_resolver_; |
220 params_.cert_verifier = &cert_verifier_; | 225 params_.cert_verifier = &cert_verifier_; |
221 params_.transport_security_state = &transport_security_state_; | 226 params_.transport_security_state = &transport_security_state_; |
222 params_.proxy_service = proxy_service_.get(); | 227 params_.proxy_service = proxy_service_.get(); |
223 params_.ssl_config_service = ssl_config_service_.get(); | 228 params_.ssl_config_service = ssl_config_service_.get(); |
224 params_.http_auth_handler_factory = auth_handler_factory_.get(); | 229 params_.http_auth_handler_factory = auth_handler_factory_.get(); |
225 params_.http_server_properties = &http_server_properties; | 230 params_.http_server_properties = &http_server_properties; |
226 | 231 |
227 session_ = new HttpNetworkSession(params_); | 232 session_ = new HttpNetworkSession(params_); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
289 void ExpectBrokenAlternateProtocolMapping() { | 294 void ExpectBrokenAlternateProtocolMapping() { |
290 ASSERT_TRUE(session_->http_server_properties()->HasAlternateProtocol( | 295 ASSERT_TRUE(session_->http_server_properties()->HasAlternateProtocol( |
291 HostPortPair::FromURL(request_.url))); | 296 HostPortPair::FromURL(request_.url))); |
292 const PortAlternateProtocolPair alternate = | 297 const PortAlternateProtocolPair alternate = |
293 session_->http_server_properties()->GetAlternateProtocol( | 298 session_->http_server_properties()->GetAlternateProtocol( |
294 HostPortPair::FromURL(request_.url)); | 299 HostPortPair::FromURL(request_.url)); |
295 EXPECT_EQ(ALTERNATE_PROTOCOL_BROKEN, alternate.protocol); | 300 EXPECT_EQ(ALTERNATE_PROTOCOL_BROKEN, alternate.protocol); |
296 } | 301 } |
297 | 302 |
298 void AddHangingNonAlternateProtocolSocketData() { | 303 void AddHangingNonAlternateProtocolSocketData() { |
299 MockConnect never_finishing_connect(SYNCHRONOUS, ERR_IO_PENDING); | 304 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING); |
300 StaticSocketDataProvider data(NULL, 0, NULL, 0); | 305 hanging_data_.set_connect_data(hanging_connect); |
301 data.set_connect_data(never_finishing_connect); | 306 socket_factory_.AddSocketDataProvider(&hanging_data_); |
302 socket_factory_.AddSocketDataProvider(&data); | |
303 } | 307 } |
304 | 308 |
305 QuicPacketHeader header_; | 309 QuicPacketHeader header_; |
306 scoped_refptr<HttpNetworkSession> session_; | 310 scoped_refptr<HttpNetworkSession> session_; |
307 MockClientSocketFactory socket_factory_; | 311 MockClientSocketFactory socket_factory_; |
308 MockCryptoClientStreamFactory crypto_client_stream_factory_; | 312 MockCryptoClientStreamFactory crypto_client_stream_factory_; |
309 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession. | 313 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession. |
310 MockHostResolver host_resolver_; | 314 MockHostResolver host_resolver_; |
311 MockCertVerifier cert_verifier_; | 315 MockCertVerifier cert_verifier_; |
312 TransportSecurityState transport_security_state_; | 316 TransportSecurityState transport_security_state_; |
313 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_; | 317 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_; |
314 scoped_ptr<ProxyService> proxy_service_; | 318 scoped_ptr<ProxyService> proxy_service_; |
315 scoped_ptr<QuicSpdyCompressor> compressor_; | 319 scoped_ptr<QuicSpdyCompressor> compressor_; |
316 scoped_ptr<HttpAuthHandlerFactory> auth_handler_factory_; | 320 scoped_ptr<HttpAuthHandlerFactory> auth_handler_factory_; |
317 MockRandom random_generator_; | 321 MockRandom random_generator_; |
318 HttpServerPropertiesImpl http_server_properties; | 322 HttpServerPropertiesImpl http_server_properties; |
319 HttpNetworkSession::Params params_; | 323 HttpNetworkSession::Params params_; |
320 HttpRequestInfo request_; | 324 HttpRequestInfo request_; |
321 CapturingBoundNetLog net_log_; | 325 CapturingBoundNetLog net_log_; |
| 326 StaticSocketDataProvider hanging_data_; |
322 }; | 327 }; |
323 | 328 |
324 TEST_F(QuicNetworkTransactionTest, ForceQuic) { | 329 TEST_F(QuicNetworkTransactionTest, ForceQuic) { |
325 params_.origin_to_force_quic_on = | 330 params_.origin_to_force_quic_on = |
326 HostPortPair::FromString("www.google.com:80"); | 331 HostPortPair::FromString("www.google.com:80"); |
327 | 332 |
328 QuicStreamId stream_id = 3; | 333 QuicStreamId stream_id = 3; |
329 scoped_ptr<QuicEncryptedPacket> req( | 334 scoped_ptr<QuicEncryptedPacket> req( |
330 ConstructDataPacket(1, stream_id, true, true, 0, | 335 ConstructDataPacket(1, stream_id, true, true, 0, |
331 GetRequestString("GET", "/"))); | 336 GetRequestString("GET", "/"))); |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
480 // The non-alternate protocol job needs to hang in order to guarantee that | 485 // The non-alternate protocol job needs to hang in order to guarantee that |
481 // the alternate-protocol job will "win". | 486 // the alternate-protocol job will "win". |
482 AddHangingNonAlternateProtocolSocketData(); | 487 AddHangingNonAlternateProtocolSocketData(); |
483 | 488 |
484 CreateSession(); | 489 CreateSession(); |
485 | 490 |
486 SendRequestAndExpectHttpResponse("hello world"); | 491 SendRequestAndExpectHttpResponse("hello world"); |
487 SendRequestAndExpectQuicResponse("hello!"); | 492 SendRequestAndExpectQuicResponse("hello!"); |
488 } | 493 } |
489 | 494 |
| 495 TEST_F(QuicNetworkTransactionTest, HungAlternateProtocol) { |
| 496 HttpStreamFactory::EnableNpnSpdy(); // Enables QUIC too. |
| 497 crypto_client_stream_factory_.set_handshake_mode( |
| 498 MockCryptoClientStream::COLD_START); |
| 499 |
| 500 MockWrite http_writes[] = { |
| 501 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"), |
| 502 MockWrite(SYNCHRONOUS, 1, "Host: www.google.com\r\n"), |
| 503 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n") |
| 504 }; |
| 505 |
| 506 MockRead http_reads[] = { |
| 507 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"), |
| 508 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHttpHeader), |
| 509 MockRead(SYNCHRONOUS, 5, "hello world"), |
| 510 MockRead(SYNCHRONOUS, OK, 6) |
| 511 }; |
| 512 |
| 513 DeterministicMockClientSocketFactory socket_factory; |
| 514 |
| 515 DeterministicSocketData http_data(http_reads, arraysize(http_reads), |
| 516 http_writes, arraysize(http_writes)); |
| 517 socket_factory.AddSocketDataProvider(&http_data); |
| 518 |
| 519 // The QUIC transaction will not be allowed to complete. |
| 520 MockWrite quic_writes[] = { |
| 521 MockWrite(ASYNC, ERR_IO_PENDING, 0) |
| 522 }; |
| 523 MockRead quic_reads[] = { |
| 524 MockRead(ASYNC, ERR_IO_PENDING, 1), |
| 525 }; |
| 526 DeterministicSocketData quic_data(quic_reads, arraysize(quic_reads), |
| 527 quic_writes, arraysize(quic_writes)); |
| 528 socket_factory.AddSocketDataProvider(&quic_data); |
| 529 |
| 530 // The HTTP transaction will complete. |
| 531 DeterministicSocketData http_data2(http_reads, arraysize(http_reads), |
| 532 http_writes, arraysize(http_writes)); |
| 533 socket_factory.AddSocketDataProvider(&http_data2); |
| 534 |
| 535 CreateSessionWithFactory(&socket_factory); |
| 536 |
| 537 // Run the first request. |
| 538 http_data.StopAfter(arraysize(http_reads) + arraysize(http_writes)); |
| 539 SendRequestAndExpectHttpResponse("hello world"); |
| 540 ASSERT_TRUE(http_data.at_read_eof()); |
| 541 ASSERT_TRUE(http_data.at_write_eof()); |
| 542 |
| 543 // Now run the second request in which the QUIC socket hangs, |
| 544 // and verify the the transaction continues over HTTP. |
| 545 http_data2.StopAfter(arraysize(http_reads) + arraysize(http_writes)); |
| 546 SendRequestAndExpectHttpResponse("hello world"); |
| 547 |
| 548 ASSERT_TRUE(http_data2.at_read_eof()); |
| 549 ASSERT_TRUE(http_data2.at_write_eof()); |
| 550 ASSERT_TRUE(!quic_data.at_read_eof()); |
| 551 ASSERT_TRUE(!quic_data.at_write_eof()); |
| 552 } |
| 553 |
490 TEST_F(QuicNetworkTransactionTest, DontUseAlternateProtocolForQuicHttps) { | 554 TEST_F(QuicNetworkTransactionTest, DontUseAlternateProtocolForQuicHttps) { |
491 HttpStreamFactory::EnableNpnSpdy(); // Enables QUIC too. | 555 HttpStreamFactory::EnableNpnSpdy(); // Enables QUIC too. |
492 | 556 |
493 MockRead http_reads[] = { | 557 MockRead http_reads[] = { |
494 MockRead("HTTP/1.1 200 OK\r\n"), | 558 MockRead("HTTP/1.1 200 OK\r\n"), |
495 MockRead("Content-length: 11\r\n"), | 559 MockRead("Content-length: 11\r\n"), |
496 MockRead(kQuicAlternateProtocolHttpHeader), | 560 MockRead(kQuicAlternateProtocolHttpHeader), |
497 MockRead("hello world"), | 561 MockRead("hello world"), |
498 | 562 |
499 MockRead("HTTP/1.1 200 OK\r\n"), | 563 MockRead("HTTP/1.1 200 OK\r\n"), |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
535 MockRead(ASYNC, OK), // EOF | 599 MockRead(ASYNC, OK), // EOF |
536 }; | 600 }; |
537 | 601 |
538 DelayedSocketData quic_data( | 602 DelayedSocketData quic_data( |
539 1, // wait for one write to finish before reading. | 603 1, // wait for one write to finish before reading. |
540 quic_reads, arraysize(quic_reads), | 604 quic_reads, arraysize(quic_reads), |
541 quic_writes, arraysize(quic_writes)); | 605 quic_writes, arraysize(quic_writes)); |
542 | 606 |
543 socket_factory_.AddSocketDataProvider(&quic_data); | 607 socket_factory_.AddSocketDataProvider(&quic_data); |
544 | 608 |
| 609 // TODO(rch): Ideally, we would not need this, but since we have to do a DNS |
| 610 // lookup, it's not synchronous. Perhaps we can configure the HostResolver |
| 611 // to return immediately. |
| 612 AddHangingNonAlternateProtocolSocketData(); |
| 613 |
545 CreateSession(); | 614 CreateSession(); |
546 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 615 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
547 SendRequestAndExpectQuicResponse("hello!"); | 616 SendRequestAndExpectQuicResponse("hello!"); |
548 } | 617 } |
549 | 618 |
550 TEST_F(QuicNetworkTransactionTest, BrokenAlternateProtocol) { | 619 TEST_F(QuicNetworkTransactionTest, BrokenAlternateProtocol) { |
551 HttpStreamFactory::EnableNpnSpdy(); // Enables QUIC too. | 620 HttpStreamFactory::EnableNpnSpdy(); // Enables QUIC too. |
552 | 621 |
553 // Alternate-protocol job | 622 // Alternate-protocol job |
554 scoped_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1)); | 623 scoped_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1)); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
603 | 672 |
604 CreateSession(); | 673 CreateSession(); |
605 | 674 |
606 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); | 675 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); |
607 SendRequestAndExpectHttpResponse("hello from http"); | 676 SendRequestAndExpectHttpResponse("hello from http"); |
608 ExpectBrokenAlternateProtocolMapping(); | 677 ExpectBrokenAlternateProtocolMapping(); |
609 } | 678 } |
610 | 679 |
611 } // namespace test | 680 } // namespace test |
612 } // namespace net | 681 } // namespace net |
OLD | NEW |