| 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 16 matching lines...) Expand all Loading... |
| 27 #include "net/quic/test_tools/quic_test_utils.h" | 27 #include "net/quic/test_tools/quic_test_utils.h" |
| 28 #include "net/quic/test_tools/test_task_runner.h" | 28 #include "net/quic/test_tools/test_task_runner.h" |
| 29 #include "net/socket/socket_test_util.h" | 29 #include "net/socket/socket_test_util.h" |
| 30 #include "net/spdy/spdy_test_utils.h" | 30 #include "net/spdy/spdy_test_utils.h" |
| 31 #include "net/ssl/channel_id_service.h" | 31 #include "net/ssl/channel_id_service.h" |
| 32 #include "net/ssl/default_channel_id_store.h" | 32 #include "net/ssl/default_channel_id_store.h" |
| 33 #include "net/test/cert_test_util.h" | 33 #include "net/test/cert_test_util.h" |
| 34 #include "testing/gtest/include/gtest/gtest.h" | 34 #include "testing/gtest/include/gtest/gtest.h" |
| 35 | 35 |
| 36 using base::StringPiece; | 36 using base::StringPiece; |
| 37 using std::ostream; |
| 37 using std::string; | 38 using std::string; |
| 38 using std::vector; | 39 using std::vector; |
| 39 | 40 |
| 40 namespace net { | 41 namespace net { |
| 41 namespace test { | 42 namespace test { |
| 42 | 43 |
| 43 namespace { | 44 namespace { |
| 44 const char kDefaultServerHostName[] = "www.google.com"; | 45 const char kDefaultServerHostName[] = "www.google.com"; |
| 45 const int kDefaultServerPort = 443; | 46 const int kDefaultServerPort = 443; |
| 47 |
| 48 // Run all tests with all the combinations of versions and |
| 49 // enable_connection_racing. |
| 50 struct TestParams { |
| 51 TestParams(const QuicVersion version, bool enable_connection_racing) |
| 52 : version(version), enable_connection_racing(enable_connection_racing) {} |
| 53 |
| 54 friend ostream& operator<<(ostream& os, const TestParams& p) { |
| 55 os << "{ version: " << QuicVersionToString(p.version); |
| 56 os << " enable_connection_racing: " << p.enable_connection_racing << " }"; |
| 57 return os; |
| 58 } |
| 59 |
| 60 QuicVersion version; |
| 61 bool enable_connection_racing; |
| 62 }; |
| 63 |
| 64 // Constructs various test permutations. |
| 65 vector<TestParams> GetTestParams() { |
| 66 vector<TestParams> params; |
| 67 QuicVersionVector all_supported_versions = QuicSupportedVersions(); |
| 68 for (const QuicVersion version : all_supported_versions) { |
| 69 params.push_back(TestParams(version, false)); |
| 70 params.push_back(TestParams(version, true)); |
| 71 } |
| 72 return params; |
| 73 } |
| 74 |
| 46 } // namespace anonymous | 75 } // namespace anonymous |
| 47 | 76 |
| 48 class QuicStreamFactoryPeer { | 77 class QuicStreamFactoryPeer { |
| 49 public: | 78 public: |
| 50 static QuicCryptoClientConfig* GetCryptoConfig(QuicStreamFactory* factory) { | 79 static QuicCryptoClientConfig* GetCryptoConfig(QuicStreamFactory* factory) { |
| 51 return &factory->crypto_config_; | 80 return &factory->crypto_config_; |
| 52 } | 81 } |
| 53 | 82 |
| 54 static bool HasActiveSession(QuicStreamFactory* factory, | 83 static bool HasActiveSession(QuicStreamFactory* factory, |
| 55 const HostPortPair& host_port_pair, | 84 const HostPortPair& host_port_pair, |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 | 122 |
| 94 static void SetTaskRunner(QuicStreamFactory* factory, | 123 static void SetTaskRunner(QuicStreamFactory* factory, |
| 95 base::TaskRunner* task_runner) { | 124 base::TaskRunner* task_runner) { |
| 96 factory->task_runner_ = task_runner; | 125 factory->task_runner_ = task_runner; |
| 97 } | 126 } |
| 98 | 127 |
| 99 static void SetLoadServerInfoTimeout(QuicStreamFactory* factory, | 128 static void SetLoadServerInfoTimeout(QuicStreamFactory* factory, |
| 100 size_t load_server_info_timeout) { | 129 size_t load_server_info_timeout) { |
| 101 factory->load_server_info_timeout_ms_ = load_server_info_timeout; | 130 factory->load_server_info_timeout_ms_ = load_server_info_timeout; |
| 102 } | 131 } |
| 132 |
| 133 static void SetEnableConnectionRacing(QuicStreamFactory* factory, |
| 134 bool enable_connection_racing) { |
| 135 factory->enable_connection_racing_ = enable_connection_racing; |
| 136 } |
| 103 }; | 137 }; |
| 104 | 138 |
| 105 class MockQuicServerInfo : public QuicServerInfo { | 139 class MockQuicServerInfo : public QuicServerInfo { |
| 106 public: | 140 public: |
| 107 MockQuicServerInfo(const QuicServerId& server_id) | 141 MockQuicServerInfo(const QuicServerId& server_id) |
| 108 : QuicServerInfo(server_id) {} | 142 : QuicServerInfo(server_id) {} |
| 109 ~MockQuicServerInfo() override {} | 143 ~MockQuicServerInfo() override {} |
| 110 | 144 |
| 111 void Start() override {} | 145 void Start() override {} |
| 112 | 146 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 128 class MockQuicServerInfoFactory : public QuicServerInfoFactory { | 162 class MockQuicServerInfoFactory : public QuicServerInfoFactory { |
| 129 public: | 163 public: |
| 130 MockQuicServerInfoFactory() {} | 164 MockQuicServerInfoFactory() {} |
| 131 ~MockQuicServerInfoFactory() override {} | 165 ~MockQuicServerInfoFactory() override {} |
| 132 | 166 |
| 133 QuicServerInfo* GetForServer(const QuicServerId& server_id) override { | 167 QuicServerInfo* GetForServer(const QuicServerId& server_id) override { |
| 134 return new MockQuicServerInfo(server_id); | 168 return new MockQuicServerInfo(server_id); |
| 135 } | 169 } |
| 136 }; | 170 }; |
| 137 | 171 |
| 138 | 172 class QuicStreamFactoryTest : public ::testing::TestWithParam<TestParams> { |
| 139 class QuicStreamFactoryTest : public ::testing::TestWithParam<QuicVersion> { | |
| 140 protected: | 173 protected: |
| 141 QuicStreamFactoryTest() | 174 QuicStreamFactoryTest() |
| 142 : random_generator_(0), | 175 : random_generator_(0), |
| 143 clock_(new MockClock()), | 176 clock_(new MockClock()), |
| 144 runner_(new TestTaskRunner(clock_)), | 177 runner_(new TestTaskRunner(clock_)), |
| 145 maker_(GetParam(), 0, clock_), | 178 maker_(GetParam().version, 0, clock_), |
| 146 cert_verifier_(CertVerifier::CreateDefault()), | 179 cert_verifier_(CertVerifier::CreateDefault()), |
| 147 channel_id_service_( | 180 channel_id_service_( |
| 148 new ChannelIDService(new DefaultChannelIDStore(nullptr), | 181 new ChannelIDService(new DefaultChannelIDStore(nullptr), |
| 149 base::MessageLoopProxy::current())), | 182 base::MessageLoopProxy::current())), |
| 150 factory_(&host_resolver_, | 183 factory_(&host_resolver_, |
| 151 &socket_factory_, | 184 &socket_factory_, |
| 152 base::WeakPtr<HttpServerProperties>(), | 185 base::WeakPtr<HttpServerProperties>(), |
| 153 cert_verifier_.get(), | 186 cert_verifier_.get(), |
| 154 channel_id_service_.get(), | 187 channel_id_service_.get(), |
| 155 &transport_security_state_, | 188 &transport_security_state_, |
| 156 &crypto_client_stream_factory_, | 189 &crypto_client_stream_factory_, |
| 157 &random_generator_, | 190 &random_generator_, |
| 158 clock_, | 191 clock_, |
| 159 kDefaultMaxPacketSize, | 192 kDefaultMaxPacketSize, |
| 160 std::string(), | 193 std::string(), |
| 161 SupportedVersions(GetParam()), | 194 SupportedVersions(GetParam().version), |
| 162 /*enable_port_selection=*/true, | 195 /*enable_port_selection=*/true, |
| 163 /*always_require_handshake_confirmation=*/false, | 196 /*always_require_handshake_confirmation=*/false, |
| 164 /*disable_connection_pooling=*/false, | 197 /*disable_connection_pooling=*/false, |
| 165 /*load_server_info_timeout=*/0u, | 198 /*load_server_info_timeout=*/0u, |
| 166 /*load_server_info_timeout_srtt_multiplier=*/0.0f, | 199 /*load_server_info_timeout_srtt_multiplier=*/0.0f, |
| 167 /*enable_truncated_connection_ids=*/true, | 200 /*enable_truncated_connection_ids=*/true, |
| 168 QuicTagVector()), | 201 QuicTagVector()), |
| 169 host_port_pair_(kDefaultServerHostName, kDefaultServerPort), | 202 host_port_pair_(kDefaultServerHostName, kDefaultServerPort), |
| 170 is_https_(false), | 203 is_https_(false), |
| 171 privacy_mode_(PRIVACY_MODE_DISABLED) { | 204 privacy_mode_(PRIVACY_MODE_DISABLED) { |
| 172 factory_.set_require_confirmation(false); | 205 factory_.set_require_confirmation(false); |
| 173 clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1)); | 206 clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1)); |
| 207 QuicStreamFactoryPeer::SetEnableConnectionRacing( |
| 208 &factory_, GetParam().enable_connection_racing); |
| 174 } | 209 } |
| 175 | 210 |
| 176 scoped_ptr<QuicHttpStream> CreateIfSessionExists( | 211 scoped_ptr<QuicHttpStream> CreateIfSessionExists( |
| 177 const HostPortPair& host_port_pair, | 212 const HostPortPair& host_port_pair, |
| 178 const BoundNetLog& net_log) { | 213 const BoundNetLog& net_log) { |
| 179 return QuicStreamFactoryPeer::CreateIfSessionExists( | 214 return QuicStreamFactoryPeer::CreateIfSessionExists( |
| 180 &factory_, host_port_pair, false, net_log_); | 215 &factory_, host_port_pair, false, net_log_); |
| 181 } | 216 } |
| 182 | 217 |
| 183 int GetSourcePortForNewSession(const HostPortPair& destination) { | 218 int GetSourcePortForNewSession(const HostPortPair& destination) { |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 237 EXPECT_EQ(nullptr, CreateIfSessionExists(destination, net_log_).get()); | 272 EXPECT_EQ(nullptr, CreateIfSessionExists(destination, net_log_).get()); |
| 238 EXPECT_TRUE(socket_data.at_read_eof()); | 273 EXPECT_TRUE(socket_data.at_read_eof()); |
| 239 EXPECT_TRUE(socket_data.at_write_eof()); | 274 EXPECT_TRUE(socket_data.at_write_eof()); |
| 240 return port; | 275 return port; |
| 241 } | 276 } |
| 242 | 277 |
| 243 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket() { | 278 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket() { |
| 244 QuicStreamId stream_id = kClientDataStreamId1; | 279 QuicStreamId stream_id = kClientDataStreamId1; |
| 245 return maker_.MakeRstPacket( | 280 return maker_.MakeRstPacket( |
| 246 1, true, stream_id, | 281 1, true, stream_id, |
| 247 AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT, GetParam())); | 282 AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT, GetParam().version)); |
| 248 } | 283 } |
| 249 | 284 |
| 250 MockQuicServerInfoFactory quic_server_info_factory_; | 285 MockQuicServerInfoFactory quic_server_info_factory_; |
| 251 MockHostResolver host_resolver_; | 286 MockHostResolver host_resolver_; |
| 252 DeterministicMockClientSocketFactory socket_factory_; | 287 DeterministicMockClientSocketFactory socket_factory_; |
| 253 MockCryptoClientStreamFactory crypto_client_stream_factory_; | 288 MockCryptoClientStreamFactory crypto_client_stream_factory_; |
| 254 MockRandom random_generator_; | 289 MockRandom random_generator_; |
| 255 MockClock* clock_; // Owned by factory_. | 290 MockClock* clock_; // Owned by factory_. |
| 256 scoped_refptr<TestTaskRunner> runner_; | 291 scoped_refptr<TestTaskRunner> runner_; |
| 257 QuicTestPacketMaker maker_; | 292 QuicTestPacketMaker maker_; |
| 258 scoped_ptr<CertVerifier> cert_verifier_; | 293 scoped_ptr<CertVerifier> cert_verifier_; |
| 259 scoped_ptr<ChannelIDService> channel_id_service_; | 294 scoped_ptr<ChannelIDService> channel_id_service_; |
| 260 TransportSecurityState transport_security_state_; | 295 TransportSecurityState transport_security_state_; |
| 261 QuicStreamFactory factory_; | 296 QuicStreamFactory factory_; |
| 262 HostPortPair host_port_pair_; | 297 HostPortPair host_port_pair_; |
| 263 bool is_https_; | 298 bool is_https_; |
| 264 PrivacyMode privacy_mode_; | 299 PrivacyMode privacy_mode_; |
| 265 BoundNetLog net_log_; | 300 BoundNetLog net_log_; |
| 266 TestCompletionCallback callback_; | 301 TestCompletionCallback callback_; |
| 267 }; | 302 }; |
| 268 | 303 |
| 269 INSTANTIATE_TEST_CASE_P(Version, QuicStreamFactoryTest, | 304 INSTANTIATE_TEST_CASE_P(Version, |
| 270 ::testing::ValuesIn(QuicSupportedVersions())); | 305 QuicStreamFactoryTest, |
| 306 ::testing::ValuesIn(GetTestParams())); |
| 271 | 307 |
| 272 TEST_P(QuicStreamFactoryTest, CreateIfSessionExists) { | 308 TEST_P(QuicStreamFactoryTest, CreateIfSessionExists) { |
| 273 EXPECT_EQ(nullptr, CreateIfSessionExists(host_port_pair_, net_log_).get()); | 309 EXPECT_EQ(nullptr, CreateIfSessionExists(host_port_pair_, net_log_).get()); |
| 274 } | 310 } |
| 275 | 311 |
| 276 TEST_P(QuicStreamFactoryTest, Create) { | 312 TEST_P(QuicStreamFactoryTest, Create) { |
| 277 MockRead reads[] = { | 313 MockRead reads[] = { |
| 278 MockRead(ASYNC, OK, 0) // EOF | 314 MockRead(ASYNC, OK, 0) // EOF |
| 279 }; | 315 }; |
| 280 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0); | 316 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0); |
| (...skipping 1274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1555 QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_); | 1591 QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_); |
| 1556 QuicCryptoClientConfig::CachedState* cached2 = | 1592 QuicCryptoClientConfig::CachedState* cached2 = |
| 1557 crypto_config->LookupOrCreate(server_id2); | 1593 crypto_config->LookupOrCreate(server_id2); |
| 1558 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token()); | 1594 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token()); |
| 1559 EXPECT_TRUE(cached2->source_address_token().empty()); | 1595 EXPECT_TRUE(cached2->source_address_token().empty()); |
| 1560 EXPECT_FALSE(cached2->proof_valid()); | 1596 EXPECT_FALSE(cached2->proof_valid()); |
| 1561 } | 1597 } |
| 1562 } | 1598 } |
| 1563 | 1599 |
| 1564 TEST_P(QuicStreamFactoryTest, CancelWaitForDataReady) { | 1600 TEST_P(QuicStreamFactoryTest, CancelWaitForDataReady) { |
| 1601 // Don't race quic connections when testing cancel reading of server config |
| 1602 // from disk cache. |
| 1603 if (GetParam().enable_connection_racing) |
| 1604 return; |
| 1565 factory_.set_quic_server_info_factory(&quic_server_info_factory_); | 1605 factory_.set_quic_server_info_factory(&quic_server_info_factory_); |
| 1566 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get()); | 1606 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get()); |
| 1567 const size_t kLoadServerInfoTimeoutMs = 50; | 1607 const size_t kLoadServerInfoTimeoutMs = 50; |
| 1568 QuicStreamFactoryPeer::SetLoadServerInfoTimeout( | 1608 QuicStreamFactoryPeer::SetLoadServerInfoTimeout( |
| 1569 &factory_, kLoadServerInfoTimeoutMs); | 1609 &factory_, kLoadServerInfoTimeoutMs); |
| 1570 | 1610 |
| 1571 MockRead reads[] = { | 1611 MockRead reads[] = { |
| 1572 MockRead(ASYNC, OK, 0) // EOF | 1612 MockRead(ASYNC, OK, 0) // EOF |
| 1573 }; | 1613 }; |
| 1574 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0); | 1614 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1599 ASSERT_EQ(0u, runner_->GetPostedTasks().size()); | 1639 ASSERT_EQ(0u, runner_->GetPostedTasks().size()); |
| 1600 | 1640 |
| 1601 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | 1641 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); |
| 1602 EXPECT_TRUE(stream.get()); | 1642 EXPECT_TRUE(stream.get()); |
| 1603 EXPECT_TRUE(socket_data.at_read_eof()); | 1643 EXPECT_TRUE(socket_data.at_read_eof()); |
| 1604 EXPECT_TRUE(socket_data.at_write_eof()); | 1644 EXPECT_TRUE(socket_data.at_write_eof()); |
| 1605 } | 1645 } |
| 1606 | 1646 |
| 1607 } // namespace test | 1647 } // namespace test |
| 1608 } // namespace net | 1648 } // namespace net |
| OLD | NEW |