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