Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(151)

Side by Side Diff: net/quic/quic_stream_factory_test.cc

Issue 935333002: Update from https://crrev.com/316786 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/quic/quic_stream_factory.cc ('k') | net/quic/quic_stream_sequencer.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/quic/quic_stream_factory.cc ('k') | net/quic/quic_stream_sequencer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698