OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |