Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(883)

Side by Side Diff: net/quic/quic_network_transaction_unittest.cc

Issue 284423002: Remove HttpStreamFactory's NPN/SPDY globals, except for spdy_enabled. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Move comment to avoid merge conflicts Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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
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
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
OLDNEW
« net/http/http_network_session.cc ('K') | « net/net.gypi ('k') | net/socket/next_proto.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698