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

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: Fix merge 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
« no previous file with comments | « net/net.gypi ('k') | net/socket/next_proto.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/net.gypi ('k') | net/socket/next_proto.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698