| 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 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 host_port_proxy_pair_(HostPortPair(kDefaultServerHostName, | 84 host_port_proxy_pair_(HostPortPair(kDefaultServerHostName, |
| 85 kDefaultServerPort), | 85 kDefaultServerPort), |
| 86 ProxyServer::Direct()), | 86 ProxyServer::Direct()), |
| 87 is_https_(false), | 87 is_https_(false), |
| 88 cert_verifier_(CertVerifier::CreateDefault()) { | 88 cert_verifier_(CertVerifier::CreateDefault()) { |
| 89 factory_.set_require_confirmation(false); | 89 factory_.set_require_confirmation(false); |
| 90 } | 90 } |
| 91 | 91 |
| 92 | 92 |
| 93 int GetSourcePortForNewSession(const HostPortProxyPair& destination) { | 93 int GetSourcePortForNewSession(const HostPortProxyPair& destination) { |
| 94 return GetSourcePortForNewSessionInner(destination, false); |
| 95 } |
| 96 |
| 97 int GetSourcePortForNewSessionAndGoAway( |
| 98 const HostPortProxyPair& destination) { |
| 99 return GetSourcePortForNewSessionInner(destination, true); |
| 100 } |
| 101 |
| 102 int GetSourcePortForNewSessionInner(const HostPortProxyPair& destination, |
| 103 bool goaway_received) { |
| 94 // Should only be called if there is no active session for this destination. | 104 // Should only be called if there is no active session for this destination. |
| 95 EXPECT_EQ(NULL, factory_.CreateIfSessionExists(destination, | 105 EXPECT_EQ(NULL, factory_.CreateIfSessionExists(destination, |
| 96 net_log_).get()); | 106 net_log_).get()); |
| 97 size_t socket_count = socket_factory_.udp_client_sockets().size(); | 107 size_t socket_count = socket_factory_.udp_client_sockets().size(); |
| 98 | 108 |
| 99 MockRead reads[] = { | 109 MockRead reads[] = { |
| 100 MockRead(ASYNC, OK, 0) // EOF | 110 MockRead(ASYNC, OK, 0) // EOF |
| 101 }; | 111 }; |
| 102 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); | 112 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); |
| 103 socket_data.StopAfter(1); | 113 socket_data.StopAfter(1); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 122 | 132 |
| 123 if (socket_count + 1 != socket_factory_.udp_client_sockets().size()) { | 133 if (socket_count + 1 != socket_factory_.udp_client_sockets().size()) { |
| 124 EXPECT_TRUE(false); | 134 EXPECT_TRUE(false); |
| 125 return 0; | 135 return 0; |
| 126 } | 136 } |
| 127 | 137 |
| 128 IPEndPoint endpoint; | 138 IPEndPoint endpoint; |
| 129 socket_factory_. | 139 socket_factory_. |
| 130 udp_client_sockets()[socket_count]->GetLocalAddress(&endpoint); | 140 udp_client_sockets()[socket_count]->GetLocalAddress(&endpoint); |
| 131 int port = endpoint.port(); | 141 int port = endpoint.port(); |
| 142 if (goaway_received) { |
| 143 QuicGoAwayFrame goaway(QUIC_NO_ERROR, 1, ""); |
| 144 session->OnGoAway(goaway); |
| 145 } |
| 132 | 146 |
| 133 factory_.OnSessionClosed(session); | 147 factory_.OnSessionClosed(session); |
| 134 EXPECT_EQ(NULL, factory_.CreateIfSessionExists(destination, | 148 EXPECT_EQ(NULL, factory_.CreateIfSessionExists(destination, |
| 135 net_log_).get()); | 149 net_log_).get()); |
| 136 EXPECT_TRUE(socket_data.at_read_eof()); | 150 EXPECT_TRUE(socket_data.at_read_eof()); |
| 137 EXPECT_TRUE(socket_data.at_write_eof()); | 151 EXPECT_TRUE(socket_data.at_write_eof()); |
| 138 return port; | 152 return port; |
| 139 } | 153 } |
| 140 | 154 |
| 141 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket() { | 155 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket() { |
| (...skipping 527 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 669 EXPECT_NE(kDefaultServerHostName, other_server_name); | 683 EXPECT_NE(kDefaultServerHostName, other_server_name); |
| 670 HostPortPair host_port_pair2(other_server_name, kDefaultServerPort); | 684 HostPortPair host_port_pair2(other_server_name, kDefaultServerPort); |
| 671 HostPortProxyPair host_port_proxy_pair2(host_port_pair2, | 685 HostPortProxyPair host_port_proxy_pair2(host_port_pair2, |
| 672 host_port_proxy_pair_.second); | 686 host_port_proxy_pair_.second); |
| 673 | 687 |
| 674 int original_port = GetSourcePortForNewSession(host_port_proxy_pair_); | 688 int original_port = GetSourcePortForNewSession(host_port_proxy_pair_); |
| 675 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_proxy_pair2)); | 689 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_proxy_pair2)); |
| 676 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_proxy_pair_)); | 690 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_proxy_pair_)); |
| 677 } | 691 } |
| 678 | 692 |
| 693 TEST_P(QuicStreamFactoryTest, GoAwayDisablesConsistentEphemeralPort) { |
| 694 // Get a session to the host using the port suggester. |
| 695 int original_port = |
| 696 GetSourcePortForNewSessionAndGoAway(host_port_proxy_pair_); |
| 697 // Verify that the port is different after the goaway. |
| 698 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_proxy_pair_)); |
| 699 // Since the previous session did not goaway we should see the original port. |
| 700 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_proxy_pair_)); |
| 701 } |
| 702 |
| 679 TEST_P(QuicStreamFactoryTest, CloseAllSessions) { | 703 TEST_P(QuicStreamFactoryTest, CloseAllSessions) { |
| 680 MockRead reads[] = { | 704 MockRead reads[] = { |
| 681 MockRead(ASYNC, 0, 0) // EOF | 705 MockRead(ASYNC, 0, 0) // EOF |
| 682 }; | 706 }; |
| 683 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket()); | 707 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket()); |
| 684 std::vector<MockWrite> writes; | 708 std::vector<MockWrite> writes; |
| 685 if (GetParam() > QUIC_VERSION_13) | 709 if (GetParam() > QUIC_VERSION_13) |
| 686 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1)); | 710 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1)); |
| 687 DeterministicSocketData socket_data(reads, arraysize(reads), | 711 DeterministicSocketData socket_data(reads, arraysize(reads), |
| 688 writes.empty() ? NULL : &writes[0], | 712 writes.empty() ? NULL : &writes[0], |
| (...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1013 QuicCryptoClientConfig::CachedState* cached2 = | 1037 QuicCryptoClientConfig::CachedState* cached2 = |
| 1014 crypto_config2->LookupOrCreate(host_port_proxy_pair2.first.host()); | 1038 crypto_config2->LookupOrCreate(host_port_proxy_pair2.first.host()); |
| 1015 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token()); | 1039 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token()); |
| 1016 EXPECT_TRUE(cached2->source_address_token().empty()); | 1040 EXPECT_TRUE(cached2->source_address_token().empty()); |
| 1017 EXPECT_FALSE(cached2->proof_valid()); | 1041 EXPECT_FALSE(cached2->proof_valid()); |
| 1018 } | 1042 } |
| 1019 } | 1043 } |
| 1020 | 1044 |
| 1021 } // namespace test | 1045 } // namespace test |
| 1022 } // namespace net | 1046 } // namespace net |
| OLD | NEW |