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