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 <vector> | 5 #include <vector> |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
127 base::MessageLoop::current()->RunUntilIdle(); | 127 base::MessageLoop::current()->RunUntilIdle(); |
128 } | 128 } |
129 | 129 |
130 virtual void TearDown() { | 130 virtual void TearDown() { |
131 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); | 131 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); |
132 // Empty the current queue. | 132 // Empty the current queue. |
133 base::MessageLoop::current()->RunUntilIdle(); | 133 base::MessageLoop::current()->RunUntilIdle(); |
134 PlatformTest::TearDown(); | 134 PlatformTest::TearDown(); |
135 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); | 135 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); |
136 base::MessageLoop::current()->RunUntilIdle(); | 136 base::MessageLoop::current()->RunUntilIdle(); |
137 HttpStreamFactory::set_use_alternate_protocols(false); | |
138 HttpStreamFactory::SetNextProtos(std::vector<NextProto>()); | |
139 } | 137 } |
140 | 138 |
141 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket( | 139 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket( |
142 QuicPacketSequenceNumber num) { | 140 QuicPacketSequenceNumber num) { |
143 return maker_.MakeConnectionClosePacket(num); | 141 return maker_.MakeConnectionClosePacket(num); |
144 } | 142 } |
145 | 143 |
146 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket( | 144 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket( |
147 QuicPacketSequenceNumber largest_received, | 145 QuicPacketSequenceNumber largest_received, |
148 QuicPacketSequenceNumber least_unacked) { | 146 QuicPacketSequenceNumber least_unacked) { |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 QuicPacketSequenceNumber sequence_number, | 182 QuicPacketSequenceNumber sequence_number, |
185 QuicStreamId stream_id, | 183 QuicStreamId stream_id, |
186 bool should_include_version, | 184 bool should_include_version, |
187 bool fin, | 185 bool fin, |
188 const SpdyHeaderBlock& headers) { | 186 const SpdyHeaderBlock& headers) { |
189 return maker_.MakeResponseHeadersPacket( | 187 return maker_.MakeResponseHeadersPacket( |
190 sequence_number, stream_id, should_include_version, fin, headers); | 188 sequence_number, stream_id, should_include_version, fin, headers); |
191 } | 189 } |
192 | 190 |
193 void CreateSession() { | 191 void CreateSession() { |
194 CreateSessionWithFactory(&socket_factory_); | 192 CreateSessionWithFactory(&socket_factory_, false); |
195 } | 193 } |
196 | 194 |
197 void CreateSessionWithFactory(ClientSocketFactory* socket_factory) { | 195 void CreateSessionWithNextProtos() { |
| 196 CreateSessionWithFactory(&socket_factory_, true); |
| 197 } |
| 198 |
| 199 // If |use_next_protos| is true, enables SPDY and QUIC. |
| 200 void CreateSessionWithFactory(ClientSocketFactory* socket_factory, |
| 201 bool use_next_protos) { |
198 params_.enable_quic = true; | 202 params_.enable_quic = true; |
199 params_.quic_clock = clock_; | 203 params_.quic_clock = clock_; |
200 params_.quic_random = &random_generator_; | 204 params_.quic_random = &random_generator_; |
201 params_.client_socket_factory = socket_factory; | 205 params_.client_socket_factory = socket_factory; |
202 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_; | 206 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_; |
203 params_.host_resolver = &host_resolver_; | 207 params_.host_resolver = &host_resolver_; |
204 params_.cert_verifier = &cert_verifier_; | 208 params_.cert_verifier = &cert_verifier_; |
205 params_.transport_security_state = &transport_security_state_; | 209 params_.transport_security_state = &transport_security_state_; |
206 params_.proxy_service = proxy_service_.get(); | 210 params_.proxy_service = proxy_service_.get(); |
207 params_.ssl_config_service = ssl_config_service_.get(); | 211 params_.ssl_config_service = ssl_config_service_.get(); |
208 params_.http_auth_handler_factory = auth_handler_factory_.get(); | 212 params_.http_auth_handler_factory = auth_handler_factory_.get(); |
209 params_.http_server_properties = http_server_properties.GetWeakPtr(); | 213 params_.http_server_properties = http_server_properties.GetWeakPtr(); |
210 params_.quic_supported_versions = SupportedVersions(GetParam()); | 214 params_.quic_supported_versions = SupportedVersions(GetParam()); |
211 | 215 |
| 216 if (use_next_protos) { |
| 217 params_.use_alternate_protocols = true; |
| 218 params_.next_protos = NextProtosSpdy3(); |
| 219 } |
| 220 |
212 session_ = new HttpNetworkSession(params_); | 221 session_ = new HttpNetworkSession(params_); |
213 session_->quic_stream_factory()->set_require_confirmation(false); | 222 session_->quic_stream_factory()->set_require_confirmation(false); |
214 } | 223 } |
215 | 224 |
216 void CheckWasQuicResponse(const scoped_ptr<HttpNetworkTransaction>& trans) { | 225 void CheckWasQuicResponse(const scoped_ptr<HttpNetworkTransaction>& trans) { |
217 const HttpResponseInfo* response = trans->GetResponseInfo(); | 226 const HttpResponseInfo* response = trans->GetResponseInfo(); |
218 ASSERT_TRUE(response != NULL); | 227 ASSERT_TRUE(response != NULL); |
219 ASSERT_TRUE(response->headers.get() != NULL); | 228 ASSERT_TRUE(response->headers.get() != NULL); |
220 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); | 229 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
221 EXPECT_TRUE(response->was_fetched_via_spdy); | 230 EXPECT_TRUE(response->was_fetched_via_spdy); |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
441 socket_factory_.AddSocketDataProvider(&data); | 450 socket_factory_.AddSocketDataProvider(&data); |
442 SSLSocketDataProvider ssl(ASYNC, OK); | 451 SSLSocketDataProvider ssl(ASYNC, OK); |
443 socket_factory_.AddSSLSocketDataProvider(&ssl); | 452 socket_factory_.AddSSLSocketDataProvider(&ssl); |
444 | 453 |
445 CreateSession(); | 454 CreateSession(); |
446 | 455 |
447 SendRequestAndExpectHttpResponse("hello world"); | 456 SendRequestAndExpectHttpResponse("hello world"); |
448 } | 457 } |
449 | 458 |
450 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) { | 459 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) { |
451 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | |
452 | |
453 MockRead http_reads[] = { | 460 MockRead http_reads[] = { |
454 MockRead("HTTP/1.1 200 OK\r\n"), | 461 MockRead("HTTP/1.1 200 OK\r\n"), |
455 MockRead(kQuicAlternateProtocolHttpHeader), | 462 MockRead(kQuicAlternateProtocolHttpHeader), |
456 MockRead("hello world"), | 463 MockRead("hello world"), |
457 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 464 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
458 MockRead(ASYNC, OK) | 465 MockRead(ASYNC, OK) |
459 }; | 466 }; |
460 | 467 |
461 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 468 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
462 NULL, 0); | 469 NULL, 0); |
(...skipping 10 matching lines...) Expand all Loading... |
473 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!")); | 480 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!")); |
474 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 481 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
475 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | 482 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
476 | 483 |
477 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); | 484 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); |
478 | 485 |
479 // The non-alternate protocol job needs to hang in order to guarantee that | 486 // The non-alternate protocol job needs to hang in order to guarantee that |
480 // the alternate-protocol job will "win". | 487 // the alternate-protocol job will "win". |
481 AddHangingNonAlternateProtocolSocketData(); | 488 AddHangingNonAlternateProtocolSocketData(); |
482 | 489 |
483 CreateSession(); | 490 CreateSessionWithNextProtos(); |
484 | 491 |
485 SendRequestAndExpectHttpResponse("hello world"); | 492 SendRequestAndExpectHttpResponse("hello world"); |
486 SendRequestAndExpectQuicResponse("hello!"); | 493 SendRequestAndExpectQuicResponse("hello!"); |
487 } | 494 } |
488 | 495 |
489 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) { | 496 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) { |
490 params_.origin_to_force_quic_on = | 497 params_.origin_to_force_quic_on = |
491 HostPortPair::FromString("www.google.com:443"); | 498 HostPortPair::FromString("www.google.com:443"); |
492 params_.enable_quic_https = true; | 499 params_.enable_quic_https = true; |
493 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | |
494 | 500 |
495 MockRead http_reads[] = { | 501 MockRead http_reads[] = { |
496 MockRead("HTTP/1.1 200 OK\r\n"), | 502 MockRead("HTTP/1.1 200 OK\r\n"), |
497 MockRead(kQuicAlternateProtocolHttpsHeader), | 503 MockRead(kQuicAlternateProtocolHttpsHeader), |
498 MockRead("hello world"), | 504 MockRead("hello world"), |
499 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 505 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
500 MockRead(ASYNC, OK) | 506 MockRead(ASYNC, OK) |
501 }; | 507 }; |
502 | 508 |
503 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 509 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
(...skipping 11 matching lines...) Expand all Loading... |
515 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!")); | 521 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!")); |
516 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 522 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
517 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | 523 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
518 | 524 |
519 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); | 525 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); |
520 | 526 |
521 // The non-alternate protocol job needs to hang in order to guarantee that | 527 // The non-alternate protocol job needs to hang in order to guarantee that |
522 // the alternate-protocol job will "win". | 528 // the alternate-protocol job will "win". |
523 AddHangingNonAlternateProtocolSocketData(); | 529 AddHangingNonAlternateProtocolSocketData(); |
524 | 530 |
525 CreateSession(); | 531 CreateSessionWithNextProtos(); |
526 | 532 |
527 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo(). | 533 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo(). |
528 SendRequestAndExpectHttpResponse("hello world"); | 534 SendRequestAndExpectHttpResponse("hello world"); |
529 } | 535 } |
530 | 536 |
531 TEST_P(QuicNetworkTransactionTest, HungAlternateProtocol) { | 537 TEST_P(QuicNetworkTransactionTest, HungAlternateProtocol) { |
532 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | |
533 crypto_client_stream_factory_.set_handshake_mode( | 538 crypto_client_stream_factory_.set_handshake_mode( |
534 MockCryptoClientStream::COLD_START); | 539 MockCryptoClientStream::COLD_START); |
535 | 540 |
536 MockWrite http_writes[] = { | 541 MockWrite http_writes[] = { |
537 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"), | 542 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"), |
538 MockWrite(SYNCHRONOUS, 1, "Host: www.google.com\r\n"), | 543 MockWrite(SYNCHRONOUS, 1, "Host: www.google.com\r\n"), |
539 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n") | 544 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n") |
540 }; | 545 }; |
541 | 546 |
542 MockRead http_reads[] = { | 547 MockRead http_reads[] = { |
(...skipping 18 matching lines...) Expand all Loading... |
561 }; | 566 }; |
562 DeterministicSocketData quic_data(quic_reads, arraysize(quic_reads), | 567 DeterministicSocketData quic_data(quic_reads, arraysize(quic_reads), |
563 quic_writes, arraysize(quic_writes)); | 568 quic_writes, arraysize(quic_writes)); |
564 socket_factory.AddSocketDataProvider(&quic_data); | 569 socket_factory.AddSocketDataProvider(&quic_data); |
565 | 570 |
566 // The HTTP transaction will complete. | 571 // The HTTP transaction will complete. |
567 DeterministicSocketData http_data2(http_reads, arraysize(http_reads), | 572 DeterministicSocketData http_data2(http_reads, arraysize(http_reads), |
568 http_writes, arraysize(http_writes)); | 573 http_writes, arraysize(http_writes)); |
569 socket_factory.AddSocketDataProvider(&http_data2); | 574 socket_factory.AddSocketDataProvider(&http_data2); |
570 | 575 |
571 CreateSessionWithFactory(&socket_factory); | 576 CreateSessionWithFactory(&socket_factory, true); |
572 | 577 |
573 // Run the first request. | 578 // Run the first request. |
574 http_data.StopAfter(arraysize(http_reads) + arraysize(http_writes)); | 579 http_data.StopAfter(arraysize(http_reads) + arraysize(http_writes)); |
575 SendRequestAndExpectHttpResponse("hello world"); | 580 SendRequestAndExpectHttpResponse("hello world"); |
576 ASSERT_TRUE(http_data.at_read_eof()); | 581 ASSERT_TRUE(http_data.at_read_eof()); |
577 ASSERT_TRUE(http_data.at_write_eof()); | 582 ASSERT_TRUE(http_data.at_write_eof()); |
578 | 583 |
579 // Now run the second request in which the QUIC socket hangs, | 584 // Now run the second request in which the QUIC socket hangs, |
580 // and verify the the transaction continues over HTTP. | 585 // and verify the the transaction continues over HTTP. |
581 http_data2.StopAfter(arraysize(http_reads) + arraysize(http_writes)); | 586 http_data2.StopAfter(arraysize(http_reads) + arraysize(http_writes)); |
582 SendRequestAndExpectHttpResponse("hello world"); | 587 SendRequestAndExpectHttpResponse("hello world"); |
583 | 588 |
584 ASSERT_TRUE(http_data2.at_read_eof()); | 589 ASSERT_TRUE(http_data2.at_read_eof()); |
585 ASSERT_TRUE(http_data2.at_write_eof()); | 590 ASSERT_TRUE(http_data2.at_write_eof()); |
586 ASSERT_TRUE(!quic_data.at_read_eof()); | 591 ASSERT_TRUE(!quic_data.at_read_eof()); |
587 ASSERT_TRUE(!quic_data.at_write_eof()); | 592 ASSERT_TRUE(!quic_data.at_write_eof()); |
588 } | 593 } |
589 | 594 |
590 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) { | 595 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) { |
591 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | |
592 | |
593 MockQuicData mock_quic_data; | 596 MockQuicData mock_quic_data; |
594 mock_quic_data.AddWrite( | 597 mock_quic_data.AddWrite( |
595 ConstructRequestHeadersPacket(1, kStreamId5, true, true, | 598 ConstructRequestHeadersPacket(1, kStreamId5, true, true, |
596 GetRequestHeaders("GET", "http", "/"))); | 599 GetRequestHeaders("GET", "http", "/"))); |
597 mock_quic_data.AddRead( | 600 mock_quic_data.AddRead( |
598 ConstructResponseHeadersPacket(1, kStreamId5, false, false, | 601 ConstructResponseHeadersPacket(1, kStreamId5, false, false, |
599 GetResponseHeaders("200 OK"))); | 602 GetResponseHeaders("200 OK"))); |
600 mock_quic_data.AddRead( | 603 mock_quic_data.AddRead( |
601 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!")); | 604 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!")); |
602 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 605 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
603 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | 606 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
604 | 607 |
605 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); | 608 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); |
606 | 609 |
607 // The non-alternate protocol job needs to hang in order to guarantee that | 610 // The non-alternate protocol job needs to hang in order to guarantee that |
608 // the alternate-protocol job will "win". | 611 // the alternate-protocol job will "win". |
609 AddHangingNonAlternateProtocolSocketData(); | 612 AddHangingNonAlternateProtocolSocketData(); |
610 | 613 |
611 CreateSession(); | 614 CreateSessionWithNextProtos(); |
612 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 615 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
613 SendRequestAndExpectQuicResponse("hello!"); | 616 SendRequestAndExpectQuicResponse("hello!"); |
614 } | 617 } |
615 | 618 |
616 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) { | 619 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) { |
617 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | |
618 | |
619 MockQuicData mock_quic_data; | 620 MockQuicData mock_quic_data; |
620 mock_quic_data.AddWrite( | 621 mock_quic_data.AddWrite( |
621 ConstructRequestHeadersPacket(1, kStreamId5, true, true, | 622 ConstructRequestHeadersPacket(1, kStreamId5, true, true, |
622 GetRequestHeaders("GET", "http", "/"))); | 623 GetRequestHeaders("GET", "http", "/"))); |
623 mock_quic_data.AddRead( | 624 mock_quic_data.AddRead( |
624 ConstructResponseHeadersPacket(1, kStreamId5, false, false, | 625 ConstructResponseHeadersPacket(1, kStreamId5, false, false, |
625 GetResponseHeaders("200 OK"))); | 626 GetResponseHeaders("200 OK"))); |
626 mock_quic_data.AddRead( | 627 mock_quic_data.AddRead( |
627 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!")); | 628 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!")); |
628 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 629 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
629 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | 630 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
630 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); | 631 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); |
631 | 632 |
632 // In order for a new QUIC session to be established via alternate-protocol | 633 // In order for a new QUIC session to be established via alternate-protocol |
633 // without racing an HTTP connection, we need the host resolution to happen | 634 // without racing an HTTP connection, we need the host resolution to happen |
634 // synchronously. | 635 // synchronously. |
635 host_resolver_.set_synchronous_mode(true); | 636 host_resolver_.set_synchronous_mode(true); |
636 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); | 637 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); |
637 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); | 638 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); |
638 AddressList address; | 639 AddressList address; |
639 host_resolver_.Resolve(info, | 640 host_resolver_.Resolve(info, |
640 DEFAULT_PRIORITY, | 641 DEFAULT_PRIORITY, |
641 &address, | 642 &address, |
642 CompletionCallback(), | 643 CompletionCallback(), |
643 NULL, | 644 NULL, |
644 net_log_.bound()); | 645 net_log_.bound()); |
645 | 646 |
646 CreateSession(); | 647 CreateSessionWithNextProtos(); |
647 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 648 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
648 SendRequestAndExpectQuicResponse("hello!"); | 649 SendRequestAndExpectQuicResponse("hello!"); |
649 } | 650 } |
650 | 651 |
651 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) { | 652 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) { |
652 proxy_service_.reset( | 653 proxy_service_.reset( |
653 ProxyService::CreateFixedFromPacResult("PROXY myproxy:70")); | 654 ProxyService::CreateFixedFromPacResult("PROXY myproxy:70")); |
654 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | |
655 | 655 |
656 // Since we are using a proxy, the QUIC job will not succeed. | 656 // Since we are using a proxy, the QUIC job will not succeed. |
657 MockWrite http_writes[] = { | 657 MockWrite http_writes[] = { |
658 MockWrite(SYNCHRONOUS, 0, "GET http://www.google.com/ HTTP/1.1\r\n"), | 658 MockWrite(SYNCHRONOUS, 0, "GET http://www.google.com/ HTTP/1.1\r\n"), |
659 MockWrite(SYNCHRONOUS, 1, "Host: www.google.com\r\n"), | 659 MockWrite(SYNCHRONOUS, 1, "Host: www.google.com\r\n"), |
660 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n") | 660 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n") |
661 }; | 661 }; |
662 | 662 |
663 MockRead http_reads[] = { | 663 MockRead http_reads[] = { |
664 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"), | 664 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"), |
(...skipping 13 matching lines...) Expand all Loading... |
678 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); | 678 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); |
679 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); | 679 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); |
680 AddressList address; | 680 AddressList address; |
681 host_resolver_.Resolve(info, | 681 host_resolver_.Resolve(info, |
682 DEFAULT_PRIORITY, | 682 DEFAULT_PRIORITY, |
683 &address, | 683 &address, |
684 CompletionCallback(), | 684 CompletionCallback(), |
685 NULL, | 685 NULL, |
686 net_log_.bound()); | 686 net_log_.bound()); |
687 | 687 |
688 CreateSession(); | 688 CreateSessionWithNextProtos(); |
689 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 689 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
690 SendRequestAndExpectHttpResponse("hello world"); | 690 SendRequestAndExpectHttpResponse("hello world"); |
691 } | 691 } |
692 | 692 |
693 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) { | 693 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) { |
694 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | |
695 | |
696 MockQuicData mock_quic_data; | 694 MockQuicData mock_quic_data; |
697 mock_quic_data.AddWrite( | 695 mock_quic_data.AddWrite( |
698 ConstructRequestHeadersPacket(1, kStreamId5, true, true, | 696 ConstructRequestHeadersPacket(1, kStreamId5, true, true, |
699 GetRequestHeaders("GET", "http", "/"))); | 697 GetRequestHeaders("GET", "http", "/"))); |
700 mock_quic_data.AddRead( | 698 mock_quic_data.AddRead( |
701 ConstructResponseHeadersPacket(1, kStreamId5, false, false, | 699 ConstructResponseHeadersPacket(1, kStreamId5, false, false, |
702 GetResponseHeaders("200 OK"))); | 700 GetResponseHeaders("200 OK"))); |
703 mock_quic_data.AddRead( | 701 mock_quic_data.AddRead( |
704 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!")); | 702 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!")); |
705 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 703 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
706 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | 704 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
707 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); | 705 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); |
708 | 706 |
709 // The non-alternate protocol job needs to hang in order to guarantee that | 707 // The non-alternate protocol job needs to hang in order to guarantee that |
710 // the alternate-protocol job will "win". | 708 // the alternate-protocol job will "win". |
711 AddHangingNonAlternateProtocolSocketData(); | 709 AddHangingNonAlternateProtocolSocketData(); |
712 | 710 |
713 // In order for a new QUIC session to be established via alternate-protocol | 711 // In order for a new QUIC session to be established via alternate-protocol |
714 // without racing an HTTP connection, we need the host resolution to happen | 712 // without racing an HTTP connection, we need the host resolution to happen |
715 // synchronously. Of course, even though QUIC *could* perform a 0-RTT | 713 // synchronously. Of course, even though QUIC *could* perform a 0-RTT |
716 // connection to the the server, in this test we require confirmation | 714 // connection to the the server, in this test we require confirmation |
717 // before encrypting so the HTTP job will still start. | 715 // before encrypting so the HTTP job will still start. |
718 host_resolver_.set_synchronous_mode(true); | 716 host_resolver_.set_synchronous_mode(true); |
719 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); | 717 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); |
720 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); | 718 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); |
721 AddressList address; | 719 AddressList address; |
722 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, | 720 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, |
723 CompletionCallback(), NULL, net_log_.bound()); | 721 CompletionCallback(), NULL, net_log_.bound()); |
724 | 722 |
725 CreateSession(); | 723 CreateSessionWithNextProtos(); |
726 session_->quic_stream_factory()->set_require_confirmation(true); | 724 session_->quic_stream_factory()->set_require_confirmation(true); |
727 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 725 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
728 | 726 |
729 scoped_ptr<HttpNetworkTransaction> trans( | 727 scoped_ptr<HttpNetworkTransaction> trans( |
730 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); | 728 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); |
731 TestCompletionCallback callback; | 729 TestCompletionCallback callback; |
732 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); | 730 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); |
733 EXPECT_EQ(ERR_IO_PENDING, rv); | 731 EXPECT_EQ(ERR_IO_PENDING, rv); |
734 | 732 |
735 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent( | 733 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent( |
736 QuicSession::HANDSHAKE_CONFIRMED); | 734 QuicSession::HANDSHAKE_CONFIRMED); |
737 EXPECT_EQ(OK, callback.WaitForResult()); | 735 EXPECT_EQ(OK, callback.WaitForResult()); |
738 } | 736 } |
739 | 737 |
740 TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) { | 738 TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) { |
741 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | |
742 | |
743 // Alternate-protocol job | 739 // Alternate-protocol job |
744 scoped_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1)); | 740 scoped_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1)); |
745 MockRead quic_reads[] = { | 741 MockRead quic_reads[] = { |
746 MockRead(ASYNC, close->data(), close->length()), | 742 MockRead(ASYNC, close->data(), close->length()), |
747 MockRead(ASYNC, OK), // EOF | 743 MockRead(ASYNC, OK), // EOF |
748 }; | 744 }; |
749 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), | 745 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), |
750 NULL, 0); | 746 NULL, 0); |
751 socket_factory_.AddSocketDataProvider(&quic_data); | 747 socket_factory_.AddSocketDataProvider(&quic_data); |
752 | 748 |
753 // Main job which will succeed even though the alternate job fails. | 749 // Main job which will succeed even though the alternate job fails. |
754 MockRead http_reads[] = { | 750 MockRead http_reads[] = { |
755 MockRead("HTTP/1.1 200 OK\r\n\r\n"), | 751 MockRead("HTTP/1.1 200 OK\r\n\r\n"), |
756 MockRead("hello from http"), | 752 MockRead("hello from http"), |
757 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 753 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
758 MockRead(ASYNC, OK) | 754 MockRead(ASYNC, OK) |
759 }; | 755 }; |
760 | 756 |
761 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 757 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
762 NULL, 0); | 758 NULL, 0); |
763 socket_factory_.AddSocketDataProvider(&http_data); | 759 socket_factory_.AddSocketDataProvider(&http_data); |
764 | 760 |
765 CreateSession(); | 761 CreateSessionWithNextProtos(); |
766 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); | 762 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); |
767 SendRequestAndExpectHttpResponse("hello from http"); | 763 SendRequestAndExpectHttpResponse("hello from http"); |
768 ExpectBrokenAlternateProtocolMapping(); | 764 ExpectBrokenAlternateProtocolMapping(); |
769 } | 765 } |
770 | 766 |
771 TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) { | 767 TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) { |
772 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | |
773 | |
774 // Alternate-protocol job | 768 // Alternate-protocol job |
775 MockRead quic_reads[] = { | 769 MockRead quic_reads[] = { |
776 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED), | 770 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED), |
777 }; | 771 }; |
778 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), | 772 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), |
779 NULL, 0); | 773 NULL, 0); |
780 socket_factory_.AddSocketDataProvider(&quic_data); | 774 socket_factory_.AddSocketDataProvider(&quic_data); |
781 | 775 |
782 // Main job which will succeed even though the alternate job fails. | 776 // Main job which will succeed even though the alternate job fails. |
783 MockRead http_reads[] = { | 777 MockRead http_reads[] = { |
784 MockRead("HTTP/1.1 200 OK\r\n\r\n"), | 778 MockRead("HTTP/1.1 200 OK\r\n\r\n"), |
785 MockRead("hello from http"), | 779 MockRead("hello from http"), |
786 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 780 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
787 MockRead(ASYNC, OK) | 781 MockRead(ASYNC, OK) |
788 }; | 782 }; |
789 | 783 |
790 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 784 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
791 NULL, 0); | 785 NULL, 0); |
792 socket_factory_.AddSocketDataProvider(&http_data); | 786 socket_factory_.AddSocketDataProvider(&http_data); |
793 | 787 |
794 CreateSession(); | 788 CreateSessionWithNextProtos(); |
795 | 789 |
796 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); | 790 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); |
797 SendRequestAndExpectHttpResponse("hello from http"); | 791 SendRequestAndExpectHttpResponse("hello from http"); |
798 ExpectBrokenAlternateProtocolMapping(); | 792 ExpectBrokenAlternateProtocolMapping(); |
799 } | 793 } |
800 | 794 |
801 TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) { | 795 TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) { |
802 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | |
803 | |
804 // Alternate-protocol job | 796 // Alternate-protocol job |
805 MockRead quic_reads[] = { | 797 MockRead quic_reads[] = { |
806 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED), | 798 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED), |
807 }; | 799 }; |
808 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), | 800 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), |
809 NULL, 0); | 801 NULL, 0); |
810 socket_factory_.AddSocketDataProvider(&quic_data); | 802 socket_factory_.AddSocketDataProvider(&quic_data); |
811 | 803 |
812 AddHangingNonAlternateProtocolSocketData(); | 804 AddHangingNonAlternateProtocolSocketData(); |
813 | 805 |
814 // Final job that will proceed when the QUIC job fails. | 806 // Final job that will proceed when the QUIC job fails. |
815 MockRead http_reads[] = { | 807 MockRead http_reads[] = { |
816 MockRead("HTTP/1.1 200 OK\r\n\r\n"), | 808 MockRead("HTTP/1.1 200 OK\r\n\r\n"), |
817 MockRead("hello from http"), | 809 MockRead("hello from http"), |
818 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 810 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
819 MockRead(ASYNC, OK) | 811 MockRead(ASYNC, OK) |
820 }; | 812 }; |
821 | 813 |
822 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 814 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
823 NULL, 0); | 815 NULL, 0); |
824 socket_factory_.AddSocketDataProvider(&http_data); | 816 socket_factory_.AddSocketDataProvider(&http_data); |
825 | 817 |
826 CreateSession(); | 818 CreateSessionWithNextProtos(); |
827 | 819 |
828 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 820 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
829 | 821 |
830 SendRequestAndExpectHttpResponse("hello from http"); | 822 SendRequestAndExpectHttpResponse("hello from http"); |
831 | 823 |
832 ExpectBrokenAlternateProtocolMapping(); | 824 ExpectBrokenAlternateProtocolMapping(); |
833 | 825 |
834 EXPECT_TRUE(quic_data.at_read_eof()); | 826 EXPECT_TRUE(quic_data.at_read_eof()); |
835 EXPECT_TRUE(quic_data.at_write_eof()); | 827 EXPECT_TRUE(quic_data.at_write_eof()); |
836 } | 828 } |
837 | 829 |
838 TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolOnConnectFailure) { | 830 TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolOnConnectFailure) { |
839 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | |
840 | |
841 // Alternate-protocol job will fail before creating a QUIC session. | 831 // Alternate-protocol job will fail before creating a QUIC session. |
842 StaticSocketDataProvider quic_data(NULL, 0, NULL, 0); | 832 StaticSocketDataProvider quic_data(NULL, 0, NULL, 0); |
843 quic_data.set_connect_data(MockConnect(SYNCHRONOUS, | 833 quic_data.set_connect_data(MockConnect(SYNCHRONOUS, |
844 ERR_INTERNET_DISCONNECTED)); | 834 ERR_INTERNET_DISCONNECTED)); |
845 socket_factory_.AddSocketDataProvider(&quic_data); | 835 socket_factory_.AddSocketDataProvider(&quic_data); |
846 | 836 |
847 // Main job which will succeed even though the alternate job fails. | 837 // Main job which will succeed even though the alternate job fails. |
848 MockRead http_reads[] = { | 838 MockRead http_reads[] = { |
849 MockRead("HTTP/1.1 200 OK\r\n\r\n"), | 839 MockRead("HTTP/1.1 200 OK\r\n\r\n"), |
850 MockRead("hello from http"), | 840 MockRead("hello from http"), |
851 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 841 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
852 MockRead(ASYNC, OK) | 842 MockRead(ASYNC, OK) |
853 }; | 843 }; |
854 | 844 |
855 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 845 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
856 NULL, 0); | 846 NULL, 0); |
857 socket_factory_.AddSocketDataProvider(&http_data); | 847 socket_factory_.AddSocketDataProvider(&http_data); |
858 | 848 |
859 CreateSession(); | 849 CreateSessionWithNextProtos(); |
860 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); | 850 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); |
861 SendRequestAndExpectHttpResponse("hello from http"); | 851 SendRequestAndExpectHttpResponse("hello from http"); |
862 ExpectQuicAlternateProtocolMapping(); | 852 ExpectQuicAlternateProtocolMapping(); |
863 } | 853 } |
864 | 854 |
865 TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) { | 855 TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) { |
866 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | |
867 | |
868 MockQuicData mock_quic_data; | 856 MockQuicData mock_quic_data; |
869 mock_quic_data.AddRead(ConstructConnectionClosePacket(1)); | 857 mock_quic_data.AddRead(ConstructConnectionClosePacket(1)); |
870 mock_quic_data.AddWrite( | 858 mock_quic_data.AddWrite( |
871 ConstructRequestHeadersPacket(1, kStreamId5, true, true, | 859 ConstructRequestHeadersPacket(1, kStreamId5, true, true, |
872 GetRequestHeaders("GET", "http", "/"))); | 860 GetRequestHeaders("GET", "http", "/"))); |
873 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 861 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
874 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 0); | 862 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 0); |
875 | 863 |
876 // When the QUIC connection fails, we will try the request again over HTTP. | 864 // When the QUIC connection fails, we will try the request again over HTTP. |
877 MockRead http_reads[] = { | 865 MockRead http_reads[] = { |
(...skipping 15 matching lines...) Expand all Loading... |
893 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); | 881 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); |
894 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); | 882 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); |
895 AddressList address; | 883 AddressList address; |
896 host_resolver_.Resolve(info, | 884 host_resolver_.Resolve(info, |
897 DEFAULT_PRIORITY, | 885 DEFAULT_PRIORITY, |
898 &address, | 886 &address, |
899 CompletionCallback(), | 887 CompletionCallback(), |
900 NULL, | 888 NULL, |
901 net_log_.bound()); | 889 net_log_.bound()); |
902 | 890 |
903 CreateSession(); | 891 CreateSessionWithNextProtos(); |
904 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 892 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
905 SendRequestAndExpectHttpResponse("hello world"); | 893 SendRequestAndExpectHttpResponse("hello world"); |
906 } | 894 } |
907 | 895 |
908 } // namespace test | 896 } // namespace test |
909 } // namespace net | 897 } // namespace net |
OLD | NEW |