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

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

Issue 551903002: Adds ability to disable connection pooling in QUIC. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Nit addressed. Created 6 years, 3 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
« no previous file with comments | « net/quic/quic_stream_factory.cc ('k') | no next file » | 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 "net/quic/quic_stream_factory.h" 5 #include "net/quic/quic_stream_factory.h"
6 6
7 #include "base/run_loop.h" 7 #include "base/run_loop.h"
8 #include "base/strings/string_util.h" 8 #include "base/strings/string_util.h"
9 #include "net/base/test_data_directory.h" 9 #include "net/base/test_data_directory.h"
10 #include "net/cert/cert_verifier.h" 10 #include "net/cert/cert_verifier.h"
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
77 static bool IsLiveSession(QuicStreamFactory* factory, 77 static bool IsLiveSession(QuicStreamFactory* factory,
78 QuicClientSession* session) { 78 QuicClientSession* session) {
79 for (QuicStreamFactory::SessionIdMap::iterator it = 79 for (QuicStreamFactory::SessionIdMap::iterator it =
80 factory->all_sessions_.begin(); 80 factory->all_sessions_.begin();
81 it != factory->all_sessions_.end(); ++it) { 81 it != factory->all_sessions_.end(); ++it) {
82 if (it->first == session) 82 if (it->first == session)
83 return true; 83 return true;
84 } 84 }
85 return false; 85 return false;
86 } 86 }
87
88 static void DisableConnectionPooling(QuicStreamFactory* factory) {
89 factory->disable_connection_pooling_ = true;
90 }
87 }; 91 };
88 92
89 class QuicStreamFactoryTest : public ::testing::TestWithParam<QuicVersion> { 93 class QuicStreamFactoryTest : public ::testing::TestWithParam<QuicVersion> {
90 protected: 94 protected:
91 QuicStreamFactoryTest() 95 QuicStreamFactoryTest()
92 : random_generator_(0), 96 : random_generator_(0),
93 clock_(new MockClock()), 97 clock_(new MockClock()),
94 maker_(GetParam(), 0, clock_), 98 maker_(GetParam(), 0, clock_),
95 cert_verifier_(CertVerifier::CreateDefault()), 99 cert_verifier_(CertVerifier::CreateDefault()),
96 channel_id_service_( 100 channel_id_service_(
97 new ChannelIDService(new DefaultChannelIDStore(NULL), 101 new ChannelIDService(new DefaultChannelIDStore(NULL),
98 base::MessageLoopProxy::current())), 102 base::MessageLoopProxy::current())),
99 factory_(&host_resolver_, 103 factory_(&host_resolver_,
100 &socket_factory_, 104 &socket_factory_,
101 base::WeakPtr<HttpServerProperties>(), 105 base::WeakPtr<HttpServerProperties>(),
102 cert_verifier_.get(), 106 cert_verifier_.get(),
103 channel_id_service_.get(), 107 channel_id_service_.get(),
104 &transport_security_state_, 108 &transport_security_state_,
105 &crypto_client_stream_factory_, 109 &crypto_client_stream_factory_,
106 &random_generator_, 110 &random_generator_,
107 clock_, 111 clock_,
108 kDefaultMaxPacketSize, 112 kDefaultMaxPacketSize,
109 std::string(), 113 std::string(),
110 SupportedVersions(GetParam()), 114 SupportedVersions(GetParam()),
111 /*enable_port_selection=*/true, 115 /*enable_port_selection=*/true,
112 /*enable_time_based_loss_detection=*/true, 116 /*enable_time_based_loss_detection=*/true,
113 /*always_require_handshake_confirmation=*/true, 117 /*always_require_handshake_confirmation=*/false,
118 /*disable_connection_pooling=*/false,
114 QuicTagVector()), 119 QuicTagVector()),
115 host_port_pair_(kDefaultServerHostName, kDefaultServerPort), 120 host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
116 is_https_(false), 121 is_https_(false),
117 privacy_mode_(PRIVACY_MODE_DISABLED) { 122 privacy_mode_(PRIVACY_MODE_DISABLED) {
118 factory_.set_require_confirmation(false); 123 factory_.set_require_confirmation(false);
119 clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1)); 124 clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
120 } 125 }
121 126
122 scoped_ptr<QuicHttpStream> CreateIfSessionExists( 127 scoped_ptr<QuicHttpStream> CreateIfSessionExists(
123 const HostPortPair& host_port_pair, 128 const HostPortPair& host_port_pair,
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after
411 416
412 EXPECT_EQ( 417 EXPECT_EQ(
413 QuicStreamFactoryPeer::GetActiveSession( 418 QuicStreamFactoryPeer::GetActiveSession(
414 &factory_, host_port_pair_, is_https_), 419 &factory_, host_port_pair_, is_https_),
415 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_)); 420 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_));
416 421
417 EXPECT_TRUE(socket_data.at_read_eof()); 422 EXPECT_TRUE(socket_data.at_read_eof());
418 EXPECT_TRUE(socket_data.at_write_eof()); 423 EXPECT_TRUE(socket_data.at_write_eof());
419 } 424 }
420 425
426 TEST_P(QuicStreamFactoryTest, NoPoolingIfDisabled) {
427 MockRead reads[] = {
428 MockRead(ASYNC, OK, 0) // EOF
429 };
430 DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0);
431 DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0);
432 socket_factory_.AddSocketDataProvider(&socket_data1);
433 socket_factory_.AddSocketDataProvider(&socket_data2);
434 socket_data1.StopAfter(1);
435 socket_data2.StopAfter(1);
436
437 HostPortPair server2("mail.google.com", kDefaultServerPort);
438 host_resolver_.set_synchronous_mode(true);
439 host_resolver_.rules()->AddIPLiteralRule(
440 kDefaultServerHostName, "192.168.0.1", "");
441 host_resolver_.rules()->AddIPLiteralRule(
442 "mail.google.com", "192.168.0.1", "");
443
444 // Disable connection pooling.
445 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
446
447 QuicStreamRequest request(&factory_);
448 EXPECT_EQ(OK,
449 request.Request(host_port_pair_,
450 is_https_,
451 privacy_mode_,
452 "GET",
453 net_log_,
454 callback_.callback()));
455 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
456 EXPECT_TRUE(stream.get());
457
458 TestCompletionCallback callback;
459 QuicStreamRequest request2(&factory_);
460 EXPECT_EQ(OK,
461 request2.Request(server2,
462 is_https_,
463 privacy_mode_,
464 "GET",
465 net_log_,
466 callback.callback()));
467 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
468 EXPECT_TRUE(stream2.get());
469
470 EXPECT_NE(
471 QuicStreamFactoryPeer::GetActiveSession(
472 &factory_, host_port_pair_, is_https_),
473 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_));
474
475 EXPECT_TRUE(socket_data1.at_read_eof());
476 EXPECT_TRUE(socket_data1.at_write_eof());
477 EXPECT_TRUE(socket_data2.at_read_eof());
478 EXPECT_TRUE(socket_data2.at_write_eof());
479 }
480
421 TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) { 481 TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
422 MockRead reads[] = { 482 MockRead reads[] = {
423 MockRead(ASYNC, OK, 0) // EOF 483 MockRead(ASYNC, OK, 0) // EOF
424 }; 484 };
425 DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0); 485 DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0);
426 DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0); 486 DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0);
427 socket_factory_.AddSocketDataProvider(&socket_data1); 487 socket_factory_.AddSocketDataProvider(&socket_data1);
428 socket_factory_.AddSocketDataProvider(&socket_data2); 488 socket_factory_.AddSocketDataProvider(&socket_data2);
429 socket_data1.StopAfter(1); 489 socket_data1.StopAfter(1);
430 socket_data2.StopAfter(1); 490 socket_data2.StopAfter(1);
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
541 601
542 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession( 602 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(
543 &factory_, server1, is_https_), 603 &factory_, server1, is_https_),
544 QuicStreamFactoryPeer::GetActiveSession( 604 QuicStreamFactoryPeer::GetActiveSession(
545 &factory_, server2, is_https_)); 605 &factory_, server2, is_https_));
546 606
547 EXPECT_TRUE(socket_data.at_read_eof()); 607 EXPECT_TRUE(socket_data.at_read_eof());
548 EXPECT_TRUE(socket_data.at_write_eof()); 608 EXPECT_TRUE(socket_data.at_write_eof());
549 } 609 }
550 610
611 TEST_P(QuicStreamFactoryTest, NoHttpsPoolingIfDisabled) {
612 MockRead reads[] = {
613 MockRead(ASYNC, OK, 0) // EOF
614 };
615 DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0);
616 DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0);
617 socket_factory_.AddSocketDataProvider(&socket_data1);
618 socket_factory_.AddSocketDataProvider(&socket_data2);
619 socket_data1.StopAfter(1);
620 socket_data2.StopAfter(1);
621
622 HostPortPair server1("www.example.org", 443);
623 HostPortPair server2("mail.example.org", 443);
624
625 // Load a cert that is valid for:
626 // www.example.org (server1)
627 // mail.example.org (server2)
628 // www.example.com
629 base::FilePath certs_dir = GetTestCertsDirectory();
630 scoped_refptr<X509Certificate> test_cert(
631 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
632 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get());
633 ProofVerifyDetailsChromium verify_details;
634 verify_details.cert_verify_result.verified_cert = test_cert;
635 verify_details.cert_verify_result.is_issued_by_known_root = true;
636 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
637
638 host_resolver_.set_synchronous_mode(true);
639 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
640 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
641
642 // Disable connection pooling.
643 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
644
645 QuicStreamRequest request(&factory_);
646 is_https_ = true;
647 EXPECT_EQ(OK,
648 request.Request(server1,
649 is_https_,
650 privacy_mode_,
651 "GET",
652 net_log_,
653 callback_.callback()));
654 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
655 EXPECT_TRUE(stream.get());
656
657 TestCompletionCallback callback;
658 QuicStreamRequest request2(&factory_);
659 EXPECT_EQ(OK,
660 request2.Request(server2,
661 is_https_,
662 privacy_mode_,
663 "GET",
664 net_log_,
665 callback_.callback()));
666 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
667 EXPECT_TRUE(stream2.get());
668
669 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
670 &factory_, server1, is_https_),
671 QuicStreamFactoryPeer::GetActiveSession(
672 &factory_, server2, is_https_));
673
674 EXPECT_TRUE(socket_data1.at_read_eof());
675 EXPECT_TRUE(socket_data1.at_write_eof());
676 EXPECT_TRUE(socket_data2.at_read_eof());
677 EXPECT_TRUE(socket_data2.at_write_eof());
678 }
679
551 TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithCertMismatch) { 680 TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithCertMismatch) {
552 MockRead reads[] = { 681 MockRead reads[] = {
553 MockRead(ASYNC, OK, 0) // EOF 682 MockRead(ASYNC, OK, 0) // EOF
554 }; 683 };
555 DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0); 684 DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0);
556 DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0); 685 DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0);
557 socket_factory_.AddSocketDataProvider(&socket_data1); 686 socket_factory_.AddSocketDataProvider(&socket_data1);
558 socket_factory_.AddSocketDataProvider(&socket_data2); 687 socket_factory_.AddSocketDataProvider(&socket_data2);
559 socket_data1.StopAfter(1); 688 socket_data1.StopAfter(1);
560 socket_data2.StopAfter(1); 689 socket_data2.StopAfter(1);
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 804
676 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession( 805 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(
677 &factory_, server1, is_https_), 806 &factory_, server1, is_https_),
678 QuicStreamFactoryPeer::GetActiveSession( 807 QuicStreamFactoryPeer::GetActiveSession(
679 &factory_, server2, is_https_)); 808 &factory_, server2, is_https_));
680 809
681 EXPECT_TRUE(socket_data.at_read_eof()); 810 EXPECT_TRUE(socket_data.at_read_eof());
682 EXPECT_TRUE(socket_data.at_write_eof()); 811 EXPECT_TRUE(socket_data.at_write_eof());
683 } 812 }
684 813
814 TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithMatchingPinsIfDisabled) {
815 MockRead reads[] = {
816 MockRead(ASYNC, OK, 0) // EOF
817 };
818 DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0);
819 DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0);
820 socket_factory_.AddSocketDataProvider(&socket_data1);
821 socket_factory_.AddSocketDataProvider(&socket_data2);
822 socket_data1.StopAfter(1);
823 socket_data2.StopAfter(1);
824
825 HostPortPair server1("www.example.org", 443);
826 HostPortPair server2("mail.example.org", 443);
827 uint8 primary_pin = 1;
828 uint8 backup_pin = 2;
829 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
830 backup_pin);
831
832 // Load a cert that is valid for:
833 // www.example.org (server1)
834 // mail.example.org (server2)
835 base::FilePath certs_dir = GetTestCertsDirectory();
836 scoped_refptr<X509Certificate> test_cert(
837 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
838 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get());
839 ProofVerifyDetailsChromium verify_details;
840 verify_details.cert_verify_result.verified_cert = test_cert;
841 verify_details.cert_verify_result.is_issued_by_known_root = true;
842 verify_details.cert_verify_result.public_key_hashes.push_back(
843 test::GetTestHashValue(primary_pin));
844 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
845
846
847 host_resolver_.set_synchronous_mode(true);
848 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
849 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
850
851 // Disable connection pooling.
852 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
853
854 QuicStreamRequest request(&factory_);
855 is_https_ = true;
856 EXPECT_EQ(OK,
857 request.Request(server1,
858 is_https_,
859 privacy_mode_,
860 "GET",
861 net_log_,
862 callback_.callback()));
863 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
864 EXPECT_TRUE(stream.get());
865
866 TestCompletionCallback callback;
867 QuicStreamRequest request2(&factory_);
868 EXPECT_EQ(OK,
869 request2.Request(server2,
870 is_https_,
871 privacy_mode_,
872 "GET",
873 net_log_,
874 callback_.callback()));
875 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
876 EXPECT_TRUE(stream2.get());
877
878 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
879 &factory_, server1, is_https_),
880 QuicStreamFactoryPeer::GetActiveSession(
881 &factory_, server2, is_https_));
882
883 EXPECT_TRUE(socket_data1.at_read_eof());
884 EXPECT_TRUE(socket_data1.at_write_eof());
885 EXPECT_TRUE(socket_data2.at_read_eof());
886 EXPECT_TRUE(socket_data2.at_write_eof());
887 }
888
685 TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithDifferentPins) { 889 TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithDifferentPins) {
686 MockRead reads[] = { 890 MockRead reads[] = {
687 MockRead(ASYNC, OK, 0) // EOF 891 MockRead(ASYNC, OK, 0) // EOF
688 }; 892 };
689 DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0); 893 DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0);
690 DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0); 894 DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0);
691 socket_factory_.AddSocketDataProvider(&socket_data1); 895 socket_factory_.AddSocketDataProvider(&socket_data1);
692 socket_factory_.AddSocketDataProvider(&socket_data2); 896 socket_factory_.AddSocketDataProvider(&socket_data2);
693 socket_data1.StopAfter(1); 897 socket_data1.StopAfter(1);
694 socket_data2.StopAfter(1); 898 socket_data2.StopAfter(1);
(...skipping 606 matching lines...) Expand 10 before | Expand all | Expand 10 after
1301 QuicCryptoClientConfig::CachedState* cached2 = 1505 QuicCryptoClientConfig::CachedState* cached2 =
1302 crypto_config->LookupOrCreate(server_id2); 1506 crypto_config->LookupOrCreate(server_id2);
1303 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token()); 1507 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
1304 EXPECT_TRUE(cached2->source_address_token().empty()); 1508 EXPECT_TRUE(cached2->source_address_token().empty());
1305 EXPECT_FALSE(cached2->proof_valid()); 1509 EXPECT_FALSE(cached2->proof_valid());
1306 } 1510 }
1307 } 1511 }
1308 1512
1309 } // namespace test 1513 } // namespace test
1310 } // namespace net 1514 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_stream_factory.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698