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 } |
| 137 |
| 138 static size_t GetNumberOfActiveJobs(QuicStreamFactory* factory, |
| 139 const QuicServerId& server_id) { |
| 140 return (factory->active_jobs_[server_id]).size(); |
| 141 } |
103 }; | 142 }; |
104 | 143 |
105 class MockQuicServerInfo : public QuicServerInfo { | 144 class MockQuicServerInfo : public QuicServerInfo { |
106 public: | 145 public: |
107 MockQuicServerInfo(const QuicServerId& server_id) | 146 MockQuicServerInfo(const QuicServerId& server_id) |
108 : QuicServerInfo(server_id) {} | 147 : QuicServerInfo(server_id) {} |
109 ~MockQuicServerInfo() override {} | 148 ~MockQuicServerInfo() override {} |
110 | 149 |
111 void Start() override {} | 150 void Start() override {} |
112 | 151 |
(...skipping 15 matching lines...) Expand all Loading... |
128 class MockQuicServerInfoFactory : public QuicServerInfoFactory { | 167 class MockQuicServerInfoFactory : public QuicServerInfoFactory { |
129 public: | 168 public: |
130 MockQuicServerInfoFactory() {} | 169 MockQuicServerInfoFactory() {} |
131 ~MockQuicServerInfoFactory() override {} | 170 ~MockQuicServerInfoFactory() override {} |
132 | 171 |
133 QuicServerInfo* GetForServer(const QuicServerId& server_id) override { | 172 QuicServerInfo* GetForServer(const QuicServerId& server_id) override { |
134 return new MockQuicServerInfo(server_id); | 173 return new MockQuicServerInfo(server_id); |
135 } | 174 } |
136 }; | 175 }; |
137 | 176 |
138 | 177 class QuicStreamFactoryTest : public ::testing::TestWithParam<TestParams> { |
139 class QuicStreamFactoryTest : public ::testing::TestWithParam<QuicVersion> { | |
140 protected: | 178 protected: |
141 QuicStreamFactoryTest() | 179 QuicStreamFactoryTest() |
142 : random_generator_(0), | 180 : random_generator_(0), |
143 clock_(new MockClock()), | 181 clock_(new MockClock()), |
144 runner_(new TestTaskRunner(clock_)), | 182 runner_(new TestTaskRunner(clock_)), |
145 maker_(GetParam(), 0, clock_), | 183 maker_(GetParam().version, 0, clock_), |
146 cert_verifier_(CertVerifier::CreateDefault()), | 184 cert_verifier_(CertVerifier::CreateDefault()), |
147 channel_id_service_( | 185 channel_id_service_( |
148 new ChannelIDService(new DefaultChannelIDStore(nullptr), | 186 new ChannelIDService(new DefaultChannelIDStore(nullptr), |
149 base::MessageLoopProxy::current())), | 187 base::MessageLoopProxy::current())), |
150 factory_(&host_resolver_, | 188 factory_(&host_resolver_, |
151 &socket_factory_, | 189 &socket_factory_, |
152 base::WeakPtr<HttpServerProperties>(), | 190 base::WeakPtr<HttpServerProperties>(), |
153 cert_verifier_.get(), | 191 cert_verifier_.get(), |
154 channel_id_service_.get(), | 192 channel_id_service_.get(), |
155 &transport_security_state_, | 193 &transport_security_state_, |
156 &crypto_client_stream_factory_, | 194 &crypto_client_stream_factory_, |
157 &random_generator_, | 195 &random_generator_, |
158 clock_, | 196 clock_, |
159 kDefaultMaxPacketSize, | 197 kDefaultMaxPacketSize, |
160 std::string(), | 198 std::string(), |
161 SupportedVersions(GetParam()), | 199 SupportedVersions(GetParam().version), |
162 /*enable_port_selection=*/true, | 200 /*enable_port_selection=*/true, |
163 /*always_require_handshake_confirmation=*/false, | 201 /*always_require_handshake_confirmation=*/false, |
164 /*disable_connection_pooling=*/false, | 202 /*disable_connection_pooling=*/false, |
165 /*load_server_info_timeout=*/0u, | 203 /*load_server_info_timeout=*/0u, |
166 /*load_server_info_timeout_srtt_multiplier=*/0.0f, | 204 /*load_server_info_timeout_srtt_multiplier=*/0.0f, |
167 /*enable_truncated_connection_ids=*/true, | 205 /*enable_truncated_connection_ids=*/true, |
168 QuicTagVector()), | 206 QuicTagVector()), |
169 host_port_pair_(kDefaultServerHostName, kDefaultServerPort), | 207 host_port_pair_(kDefaultServerHostName, kDefaultServerPort), |
170 is_https_(false), | 208 is_https_(false), |
171 privacy_mode_(PRIVACY_MODE_DISABLED) { | 209 privacy_mode_(PRIVACY_MODE_DISABLED) { |
172 factory_.set_require_confirmation(false); | 210 factory_.set_require_confirmation(false); |
173 clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1)); | 211 clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1)); |
| 212 QuicStreamFactoryPeer::SetEnableConnectionRacing( |
| 213 &factory_, GetParam().enable_connection_racing); |
174 } | 214 } |
175 | 215 |
176 scoped_ptr<QuicHttpStream> CreateIfSessionExists( | 216 scoped_ptr<QuicHttpStream> CreateIfSessionExists( |
177 const HostPortPair& host_port_pair, | 217 const HostPortPair& host_port_pair, |
178 const BoundNetLog& net_log) { | 218 const BoundNetLog& net_log) { |
179 return QuicStreamFactoryPeer::CreateIfSessionExists( | 219 return QuicStreamFactoryPeer::CreateIfSessionExists( |
180 &factory_, host_port_pair, false, net_log_); | 220 &factory_, host_port_pair, false, net_log_); |
181 } | 221 } |
182 | 222 |
183 int GetSourcePortForNewSession(const HostPortPair& destination) { | 223 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()); | 277 EXPECT_EQ(nullptr, CreateIfSessionExists(destination, net_log_).get()); |
238 EXPECT_TRUE(socket_data.at_read_eof()); | 278 EXPECT_TRUE(socket_data.at_read_eof()); |
239 EXPECT_TRUE(socket_data.at_write_eof()); | 279 EXPECT_TRUE(socket_data.at_write_eof()); |
240 return port; | 280 return port; |
241 } | 281 } |
242 | 282 |
243 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket() { | 283 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket() { |
244 QuicStreamId stream_id = kClientDataStreamId1; | 284 QuicStreamId stream_id = kClientDataStreamId1; |
245 return maker_.MakeRstPacket( | 285 return maker_.MakeRstPacket( |
246 1, true, stream_id, | 286 1, true, stream_id, |
247 AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT, GetParam())); | 287 AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT, GetParam().version)); |
248 } | 288 } |
249 | 289 |
250 MockQuicServerInfoFactory quic_server_info_factory_; | 290 MockQuicServerInfoFactory quic_server_info_factory_; |
251 MockHostResolver host_resolver_; | 291 MockHostResolver host_resolver_; |
252 DeterministicMockClientSocketFactory socket_factory_; | 292 DeterministicMockClientSocketFactory socket_factory_; |
253 MockCryptoClientStreamFactory crypto_client_stream_factory_; | 293 MockCryptoClientStreamFactory crypto_client_stream_factory_; |
254 MockRandom random_generator_; | 294 MockRandom random_generator_; |
255 MockClock* clock_; // Owned by factory_. | 295 MockClock* clock_; // Owned by factory_. |
256 scoped_refptr<TestTaskRunner> runner_; | 296 scoped_refptr<TestTaskRunner> runner_; |
257 QuicTestPacketMaker maker_; | 297 QuicTestPacketMaker maker_; |
258 scoped_ptr<CertVerifier> cert_verifier_; | 298 scoped_ptr<CertVerifier> cert_verifier_; |
259 scoped_ptr<ChannelIDService> channel_id_service_; | 299 scoped_ptr<ChannelIDService> channel_id_service_; |
260 TransportSecurityState transport_security_state_; | 300 TransportSecurityState transport_security_state_; |
261 QuicStreamFactory factory_; | 301 QuicStreamFactory factory_; |
262 HostPortPair host_port_pair_; | 302 HostPortPair host_port_pair_; |
263 bool is_https_; | 303 bool is_https_; |
264 PrivacyMode privacy_mode_; | 304 PrivacyMode privacy_mode_; |
265 BoundNetLog net_log_; | 305 BoundNetLog net_log_; |
266 TestCompletionCallback callback_; | 306 TestCompletionCallback callback_; |
267 }; | 307 }; |
268 | 308 |
269 INSTANTIATE_TEST_CASE_P(Version, QuicStreamFactoryTest, | 309 INSTANTIATE_TEST_CASE_P(Version, |
270 ::testing::ValuesIn(QuicSupportedVersions())); | 310 QuicStreamFactoryTest, |
| 311 ::testing::ValuesIn(GetTestParams())); |
271 | 312 |
272 TEST_P(QuicStreamFactoryTest, CreateIfSessionExists) { | 313 TEST_P(QuicStreamFactoryTest, CreateIfSessionExists) { |
273 EXPECT_EQ(nullptr, CreateIfSessionExists(host_port_pair_, net_log_).get()); | 314 EXPECT_EQ(nullptr, CreateIfSessionExists(host_port_pair_, net_log_).get()); |
274 } | 315 } |
275 | 316 |
276 TEST_P(QuicStreamFactoryTest, Create) { | 317 TEST_P(QuicStreamFactoryTest, Create) { |
277 MockRead reads[] = { | 318 MockRead reads[] = { |
278 MockRead(ASYNC, OK, 0) // EOF | 319 MockRead(ASYNC, OK, 0) // EOF |
279 }; | 320 }; |
280 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0); | 321 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_); | 1596 QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_); |
1556 QuicCryptoClientConfig::CachedState* cached2 = | 1597 QuicCryptoClientConfig::CachedState* cached2 = |
1557 crypto_config->LookupOrCreate(server_id2); | 1598 crypto_config->LookupOrCreate(server_id2); |
1558 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token()); | 1599 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token()); |
1559 EXPECT_TRUE(cached2->source_address_token().empty()); | 1600 EXPECT_TRUE(cached2->source_address_token().empty()); |
1560 EXPECT_FALSE(cached2->proof_valid()); | 1601 EXPECT_FALSE(cached2->proof_valid()); |
1561 } | 1602 } |
1562 } | 1603 } |
1563 | 1604 |
1564 TEST_P(QuicStreamFactoryTest, CancelWaitForDataReady) { | 1605 TEST_P(QuicStreamFactoryTest, CancelWaitForDataReady) { |
| 1606 // Don't race quic connections when testing cancel reading of server config |
| 1607 // from disk cache. |
| 1608 if (GetParam().enable_connection_racing) |
| 1609 return; |
1565 factory_.set_quic_server_info_factory(&quic_server_info_factory_); | 1610 factory_.set_quic_server_info_factory(&quic_server_info_factory_); |
1566 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get()); | 1611 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get()); |
1567 const size_t kLoadServerInfoTimeoutMs = 50; | 1612 const size_t kLoadServerInfoTimeoutMs = 50; |
1568 QuicStreamFactoryPeer::SetLoadServerInfoTimeout( | 1613 QuicStreamFactoryPeer::SetLoadServerInfoTimeout( |
1569 &factory_, kLoadServerInfoTimeoutMs); | 1614 &factory_, kLoadServerInfoTimeoutMs); |
1570 | 1615 |
1571 MockRead reads[] = { | 1616 MockRead reads[] = { |
1572 MockRead(ASYNC, OK, 0) // EOF | 1617 MockRead(ASYNC, OK, 0) // EOF |
1573 }; | 1618 }; |
1574 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0); | 1619 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0); |
(...skipping 22 matching lines...) Expand all Loading... |
1597 | 1642 |
1598 runner_->RunNextTask(); | 1643 runner_->RunNextTask(); |
1599 ASSERT_EQ(0u, runner_->GetPostedTasks().size()); | 1644 ASSERT_EQ(0u, runner_->GetPostedTasks().size()); |
1600 | 1645 |
1601 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | 1646 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); |
1602 EXPECT_TRUE(stream.get()); | 1647 EXPECT_TRUE(stream.get()); |
1603 EXPECT_TRUE(socket_data.at_read_eof()); | 1648 EXPECT_TRUE(socket_data.at_read_eof()); |
1604 EXPECT_TRUE(socket_data.at_write_eof()); | 1649 EXPECT_TRUE(socket_data.at_write_eof()); |
1605 } | 1650 } |
1606 | 1651 |
| 1652 TEST_P(QuicStreamFactoryTest, RacingConnections) { |
| 1653 if (!GetParam().enable_connection_racing) |
| 1654 return; |
| 1655 factory_.set_quic_server_info_factory(&quic_server_info_factory_); |
| 1656 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get()); |
| 1657 const size_t kLoadServerInfoTimeoutMs = 50; |
| 1658 QuicStreamFactoryPeer::SetLoadServerInfoTimeout(&factory_, |
| 1659 kLoadServerInfoTimeoutMs); |
| 1660 |
| 1661 MockRead reads[] = { |
| 1662 MockRead(ASYNC, OK, 0) // EOF |
| 1663 }; |
| 1664 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0); |
| 1665 socket_factory_.AddSocketDataProvider(&socket_data); |
| 1666 socket_data.StopAfter(1); |
| 1667 |
| 1668 MockRead reads2[] = { |
| 1669 MockRead(ASYNC, 0, 0) // EOF |
| 1670 }; |
| 1671 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0); |
| 1672 socket_factory_.AddSocketDataProvider(&socket_data2); |
| 1673 socket_data2.StopAfter(1); |
| 1674 |
| 1675 crypto_client_stream_factory_.set_handshake_mode( |
| 1676 MockCryptoClientStream::ZERO_RTT); |
| 1677 host_resolver_.set_synchronous_mode(true); |
| 1678 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(), |
| 1679 "192.168.0.1", ""); |
| 1680 |
| 1681 QuicStreamRequest request(&factory_); |
| 1682 QuicServerId server_id(host_port_pair_, is_https_, privacy_mode_); |
| 1683 EXPECT_EQ(ERR_IO_PENDING, |
| 1684 request.Request(host_port_pair_, is_https_, privacy_mode_, "GET", |
| 1685 net_log_, callback_.callback())); |
| 1686 EXPECT_EQ(2u, |
| 1687 QuicStreamFactoryPeer::GetNumberOfActiveJobs(&factory_, server_id)); |
| 1688 |
| 1689 runner_->RunNextTask(); |
| 1690 |
| 1691 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); |
| 1692 EXPECT_TRUE(stream.get()); |
| 1693 EXPECT_TRUE(socket_data.at_read_eof()); |
| 1694 EXPECT_TRUE(socket_data.at_write_eof()); |
| 1695 EXPECT_EQ(0u, |
| 1696 QuicStreamFactoryPeer::GetNumberOfActiveJobs(&factory_, server_id)); |
| 1697 } |
| 1698 |
1607 } // namespace test | 1699 } // namespace test |
1608 } // namespace net | 1700 } // namespace net |
OLD | NEW |