OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "net/quic/quic_stream_factory.h" | |
6 | |
7 #include "base/run_loop.h" | |
8 #include "base/strings/string_util.h" | |
9 #include "net/base/test_data_directory.h" | |
10 #include "net/cert/cert_verifier.h" | |
11 #include "net/dns/mock_host_resolver.h" | |
12 #include "net/http/http_response_headers.h" | |
13 #include "net/http/http_response_info.h" | |
14 #include "net/http/http_util.h" | |
15 #include "net/http/transport_security_state.h" | |
16 #include "net/quic/crypto/crypto_handshake.h" | |
17 #include "net/quic/crypto/proof_verifier_chromium.h" | |
18 #include "net/quic/crypto/quic_decrypter.h" | |
19 #include "net/quic/crypto/quic_encrypter.h" | |
20 #include "net/quic/crypto/quic_server_info.h" | |
21 #include "net/quic/quic_http_stream.h" | |
22 #include "net/quic/quic_server_id.h" | |
23 #include "net/quic/test_tools/mock_clock.h" | |
24 #include "net/quic/test_tools/mock_crypto_client_stream_factory.h" | |
25 #include "net/quic/test_tools/mock_random.h" | |
26 #include "net/quic/test_tools/quic_test_packet_maker.h" | |
27 #include "net/quic/test_tools/quic_test_utils.h" | |
28 #include "net/quic/test_tools/test_task_runner.h" | |
29 #include "net/socket/socket_test_util.h" | |
30 #include "net/spdy/spdy_test_utils.h" | |
31 #include "net/ssl/channel_id_service.h" | |
32 #include "net/ssl/default_channel_id_store.h" | |
33 #include "net/test/cert_test_util.h" | |
34 #include "testing/gtest/include/gtest/gtest.h" | |
35 | |
36 using base::StringPiece; | |
37 using std::ostream; | |
38 using std::string; | |
39 using std::vector; | |
40 | |
41 namespace net { | |
42 namespace test { | |
43 | |
44 namespace { | |
45 const char kDefaultServerHostName[] = "www.google.com"; | |
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 | |
75 } // namespace anonymous | |
76 | |
77 class QuicStreamFactoryPeer { | |
78 public: | |
79 static QuicCryptoClientConfig* GetCryptoConfig(QuicStreamFactory* factory) { | |
80 return &factory->crypto_config_; | |
81 } | |
82 | |
83 static bool HasActiveSession(QuicStreamFactory* factory, | |
84 const HostPortPair& host_port_pair, | |
85 bool is_https) { | |
86 QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED); | |
87 return factory->HasActiveSession(server_id); | |
88 } | |
89 | |
90 static QuicClientSession* GetActiveSession( | |
91 QuicStreamFactory* factory, | |
92 const HostPortPair& host_port_pair, | |
93 bool is_https) { | |
94 QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED); | |
95 DCHECK(factory->HasActiveSession(server_id)); | |
96 return factory->active_sessions_[server_id]; | |
97 } | |
98 | |
99 static scoped_ptr<QuicHttpStream> CreateIfSessionExists( | |
100 QuicStreamFactory* factory, | |
101 const HostPortPair& host_port_pair, | |
102 bool is_https, | |
103 const BoundNetLog& net_log) { | |
104 QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED); | |
105 return factory->CreateIfSessionExists(server_id, net_log); | |
106 } | |
107 | |
108 static bool IsLiveSession(QuicStreamFactory* factory, | |
109 QuicClientSession* session) { | |
110 for (QuicStreamFactory::SessionIdMap::iterator it = | |
111 factory->all_sessions_.begin(); | |
112 it != factory->all_sessions_.end(); ++it) { | |
113 if (it->first == session) | |
114 return true; | |
115 } | |
116 return false; | |
117 } | |
118 | |
119 static void DisableConnectionPooling(QuicStreamFactory* factory) { | |
120 factory->disable_connection_pooling_ = true; | |
121 } | |
122 | |
123 static void SetTaskRunner(QuicStreamFactory* factory, | |
124 base::TaskRunner* task_runner) { | |
125 factory->task_runner_ = task_runner; | |
126 } | |
127 | |
128 static void SetLoadServerInfoTimeout(QuicStreamFactory* factory, | |
129 size_t load_server_info_timeout) { | |
130 factory->load_server_info_timeout_ms_ = load_server_info_timeout; | |
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 } | |
142 }; | |
143 | |
144 class MockQuicServerInfo : public QuicServerInfo { | |
145 public: | |
146 MockQuicServerInfo(const QuicServerId& server_id) | |
147 : QuicServerInfo(server_id) {} | |
148 ~MockQuicServerInfo() override {} | |
149 | |
150 void Start() override {} | |
151 | |
152 int WaitForDataReady(const CompletionCallback& callback) override { | |
153 return ERR_IO_PENDING; | |
154 } | |
155 | |
156 void ResetWaitForDataReadyCallback() override {} | |
157 | |
158 void CancelWaitForDataReadyCallback() override {} | |
159 | |
160 bool IsDataReady() override { return false; } | |
161 | |
162 bool IsReadyToPersist() override { return false; } | |
163 | |
164 void Persist() override {} | |
165 | |
166 void OnExternalCacheHit() override {} | |
167 }; | |
168 | |
169 class MockQuicServerInfoFactory : public QuicServerInfoFactory { | |
170 public: | |
171 MockQuicServerInfoFactory() {} | |
172 ~MockQuicServerInfoFactory() override {} | |
173 | |
174 QuicServerInfo* GetForServer(const QuicServerId& server_id) override { | |
175 return new MockQuicServerInfo(server_id); | |
176 } | |
177 }; | |
178 | |
179 class QuicStreamFactoryTest : public ::testing::TestWithParam<TestParams> { | |
180 protected: | |
181 QuicStreamFactoryTest() | |
182 : random_generator_(0), | |
183 clock_(new MockClock()), | |
184 runner_(new TestTaskRunner(clock_)), | |
185 maker_(GetParam().version, 0, clock_), | |
186 cert_verifier_(CertVerifier::CreateDefault()), | |
187 channel_id_service_( | |
188 new ChannelIDService(new DefaultChannelIDStore(nullptr), | |
189 base::MessageLoopProxy::current())), | |
190 factory_(&host_resolver_, | |
191 &socket_factory_, | |
192 base::WeakPtr<HttpServerProperties>(), | |
193 cert_verifier_.get(), | |
194 channel_id_service_.get(), | |
195 &transport_security_state_, | |
196 &crypto_client_stream_factory_, | |
197 &random_generator_, | |
198 clock_, | |
199 kDefaultMaxPacketSize, | |
200 std::string(), | |
201 SupportedVersions(GetParam().version), | |
202 /*enable_port_selection=*/true, | |
203 /*always_require_handshake_confirmation=*/false, | |
204 /*disable_connection_pooling=*/false, | |
205 /*load_server_info_timeout=*/0u, | |
206 /*load_server_info_timeout_srtt_multiplier=*/0.0f, | |
207 /*enable_truncated_connection_ids=*/true, | |
208 /*enable_connection_racing=*/false, | |
209 QuicTagVector()), | |
210 host_port_pair_(kDefaultServerHostName, kDefaultServerPort), | |
211 is_https_(false), | |
212 privacy_mode_(PRIVACY_MODE_DISABLED) { | |
213 factory_.set_require_confirmation(false); | |
214 clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1)); | |
215 QuicStreamFactoryPeer::SetEnableConnectionRacing( | |
216 &factory_, GetParam().enable_connection_racing); | |
217 } | |
218 | |
219 scoped_ptr<QuicHttpStream> CreateIfSessionExists( | |
220 const HostPortPair& host_port_pair, | |
221 const BoundNetLog& net_log) { | |
222 return QuicStreamFactoryPeer::CreateIfSessionExists( | |
223 &factory_, host_port_pair, false, net_log_); | |
224 } | |
225 | |
226 int GetSourcePortForNewSession(const HostPortPair& destination) { | |
227 return GetSourcePortForNewSessionInner(destination, false); | |
228 } | |
229 | |
230 int GetSourcePortForNewSessionAndGoAway( | |
231 const HostPortPair& destination) { | |
232 return GetSourcePortForNewSessionInner(destination, true); | |
233 } | |
234 | |
235 int GetSourcePortForNewSessionInner(const HostPortPair& destination, | |
236 bool goaway_received) { | |
237 // Should only be called if there is no active session for this destination. | |
238 EXPECT_EQ(nullptr, CreateIfSessionExists(destination, net_log_).get()); | |
239 size_t socket_count = socket_factory_.udp_client_sockets().size(); | |
240 | |
241 MockRead reads[] = { | |
242 MockRead(ASYNC, OK, 0) // EOF | |
243 }; | |
244 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0); | |
245 socket_data.StopAfter(1); | |
246 socket_factory_.AddSocketDataProvider(&socket_data); | |
247 | |
248 QuicStreamRequest request(&factory_); | |
249 EXPECT_EQ(ERR_IO_PENDING, | |
250 request.Request(destination, | |
251 is_https_, | |
252 privacy_mode_, | |
253 "GET", | |
254 net_log_, | |
255 callback_.callback())); | |
256 | |
257 EXPECT_EQ(OK, callback_.WaitForResult()); | |
258 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | |
259 EXPECT_TRUE(stream.get()); | |
260 stream.reset(); | |
261 | |
262 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession( | |
263 &factory_, destination, is_https_); | |
264 | |
265 if (socket_count + 1 != socket_factory_.udp_client_sockets().size()) { | |
266 EXPECT_TRUE(false); | |
267 return 0; | |
268 } | |
269 | |
270 IPEndPoint endpoint; | |
271 socket_factory_. | |
272 udp_client_sockets()[socket_count]->GetLocalAddress(&endpoint); | |
273 int port = endpoint.port(); | |
274 if (goaway_received) { | |
275 QuicGoAwayFrame goaway(QUIC_NO_ERROR, 1, ""); | |
276 session->OnGoAway(goaway); | |
277 } | |
278 | |
279 factory_.OnSessionClosed(session); | |
280 EXPECT_EQ(nullptr, CreateIfSessionExists(destination, net_log_).get()); | |
281 EXPECT_TRUE(socket_data.at_read_eof()); | |
282 EXPECT_TRUE(socket_data.at_write_eof()); | |
283 return port; | |
284 } | |
285 | |
286 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket() { | |
287 QuicStreamId stream_id = kClientDataStreamId1; | |
288 return maker_.MakeRstPacket( | |
289 1, true, stream_id, | |
290 AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT, GetParam().version)); | |
291 } | |
292 | |
293 MockQuicServerInfoFactory quic_server_info_factory_; | |
294 MockHostResolver host_resolver_; | |
295 DeterministicMockClientSocketFactory socket_factory_; | |
296 MockCryptoClientStreamFactory crypto_client_stream_factory_; | |
297 MockRandom random_generator_; | |
298 MockClock* clock_; // Owned by factory_. | |
299 scoped_refptr<TestTaskRunner> runner_; | |
300 QuicTestPacketMaker maker_; | |
301 scoped_ptr<CertVerifier> cert_verifier_; | |
302 scoped_ptr<ChannelIDService> channel_id_service_; | |
303 TransportSecurityState transport_security_state_; | |
304 QuicStreamFactory factory_; | |
305 HostPortPair host_port_pair_; | |
306 bool is_https_; | |
307 PrivacyMode privacy_mode_; | |
308 BoundNetLog net_log_; | |
309 TestCompletionCallback callback_; | |
310 }; | |
311 | |
312 INSTANTIATE_TEST_CASE_P(Version, | |
313 QuicStreamFactoryTest, | |
314 ::testing::ValuesIn(GetTestParams())); | |
315 | |
316 TEST_P(QuicStreamFactoryTest, CreateIfSessionExists) { | |
317 EXPECT_EQ(nullptr, CreateIfSessionExists(host_port_pair_, net_log_).get()); | |
318 } | |
319 | |
320 TEST_P(QuicStreamFactoryTest, Create) { | |
321 MockRead reads[] = { | |
322 MockRead(ASYNC, OK, 0) // EOF | |
323 }; | |
324 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0); | |
325 socket_factory_.AddSocketDataProvider(&socket_data); | |
326 socket_data.StopAfter(1); | |
327 | |
328 QuicStreamRequest request(&factory_); | |
329 EXPECT_EQ(ERR_IO_PENDING, | |
330 request.Request(host_port_pair_, | |
331 is_https_, | |
332 privacy_mode_, | |
333 "GET", | |
334 net_log_, | |
335 callback_.callback())); | |
336 | |
337 EXPECT_EQ(OK, callback_.WaitForResult()); | |
338 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | |
339 EXPECT_TRUE(stream.get()); | |
340 | |
341 // Will reset stream 3. | |
342 stream = CreateIfSessionExists(host_port_pair_, net_log_); | |
343 EXPECT_TRUE(stream.get()); | |
344 | |
345 // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result | |
346 // in streams on different sessions. | |
347 QuicStreamRequest request2(&factory_); | |
348 EXPECT_EQ(OK, | |
349 request2.Request(host_port_pair_, | |
350 is_https_, | |
351 privacy_mode_, | |
352 "GET", | |
353 net_log_, | |
354 callback_.callback())); | |
355 stream = request2.ReleaseStream(); // Will reset stream 5. | |
356 stream.reset(); // Will reset stream 7. | |
357 | |
358 EXPECT_TRUE(socket_data.at_read_eof()); | |
359 EXPECT_TRUE(socket_data.at_write_eof()); | |
360 } | |
361 | |
362 TEST_P(QuicStreamFactoryTest, CreateZeroRtt) { | |
363 MockRead reads[] = { | |
364 MockRead(ASYNC, OK, 0) // EOF | |
365 }; | |
366 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0); | |
367 socket_factory_.AddSocketDataProvider(&socket_data); | |
368 socket_data.StopAfter(1); | |
369 | |
370 crypto_client_stream_factory_.set_handshake_mode( | |
371 MockCryptoClientStream::ZERO_RTT); | |
372 host_resolver_.set_synchronous_mode(true); | |
373 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(), | |
374 "192.168.0.1", ""); | |
375 | |
376 QuicStreamRequest request(&factory_); | |
377 EXPECT_EQ(OK, | |
378 request.Request(host_port_pair_, | |
379 is_https_, | |
380 privacy_mode_, | |
381 "GET", | |
382 net_log_, | |
383 callback_.callback())); | |
384 | |
385 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | |
386 EXPECT_TRUE(stream.get()); | |
387 EXPECT_TRUE(socket_data.at_read_eof()); | |
388 EXPECT_TRUE(socket_data.at_write_eof()); | |
389 } | |
390 | |
391 TEST_P(QuicStreamFactoryTest, CreateZeroRttPost) { | |
392 MockRead reads[] = { | |
393 MockRead(ASYNC, OK, 0) // EOF | |
394 }; | |
395 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0); | |
396 socket_factory_.AddSocketDataProvider(&socket_data); | |
397 socket_data.StopAfter(1); | |
398 | |
399 crypto_client_stream_factory_.set_handshake_mode( | |
400 MockCryptoClientStream::ZERO_RTT); | |
401 host_resolver_.set_synchronous_mode(true); | |
402 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(), | |
403 "192.168.0.1", ""); | |
404 | |
405 QuicStreamRequest request(&factory_); | |
406 // Posts require handshake confirmation, so this will return asynchronously. | |
407 EXPECT_EQ(ERR_IO_PENDING, | |
408 request.Request(host_port_pair_, | |
409 is_https_, | |
410 privacy_mode_, | |
411 "POST", | |
412 net_log_, | |
413 callback_.callback())); | |
414 | |
415 // Confirm the handshake and verify that the stream is created. | |
416 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent( | |
417 QuicSession::HANDSHAKE_CONFIRMED); | |
418 | |
419 EXPECT_EQ(OK, callback_.WaitForResult()); | |
420 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | |
421 EXPECT_TRUE(stream.get()); | |
422 EXPECT_TRUE(socket_data.at_read_eof()); | |
423 EXPECT_TRUE(socket_data.at_write_eof()); | |
424 } | |
425 | |
426 TEST_P(QuicStreamFactoryTest, CreateHttpVsHttps) { | |
427 MockRead reads[] = { | |
428 MockRead(ASYNC, OK, 0) // EOF | |
429 }; | |
430 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0); | |
431 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0); | |
432 socket_factory_.AddSocketDataProvider(&socket_data1); | |
433 socket_factory_.AddSocketDataProvider(&socket_data2); | |
434 socket_data1.StopAfter(1); | |
435 socket_data2.StopAfter(1); | |
436 | |
437 QuicStreamRequest request(&factory_); | |
438 EXPECT_EQ(ERR_IO_PENDING, | |
439 request.Request(host_port_pair_, | |
440 is_https_, | |
441 privacy_mode_, | |
442 "GET", | |
443 net_log_, | |
444 callback_.callback())); | |
445 | |
446 EXPECT_EQ(OK, callback_.WaitForResult()); | |
447 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | |
448 EXPECT_TRUE(stream.get()); | |
449 | |
450 QuicStreamRequest request2(&factory_); | |
451 EXPECT_EQ(ERR_IO_PENDING, | |
452 request2.Request(host_port_pair_, | |
453 !is_https_, | |
454 privacy_mode_, | |
455 "GET", | |
456 net_log_, | |
457 callback_.callback())); | |
458 EXPECT_EQ(OK, callback_.WaitForResult()); | |
459 stream = request2.ReleaseStream(); | |
460 EXPECT_TRUE(stream.get()); | |
461 stream.reset(); | |
462 | |
463 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession( | |
464 &factory_, host_port_pair_, is_https_), | |
465 QuicStreamFactoryPeer::GetActiveSession( | |
466 &factory_, host_port_pair_, !is_https_)); | |
467 | |
468 EXPECT_TRUE(socket_data1.at_read_eof()); | |
469 EXPECT_TRUE(socket_data1.at_write_eof()); | |
470 EXPECT_TRUE(socket_data2.at_read_eof()); | |
471 EXPECT_TRUE(socket_data2.at_write_eof()); | |
472 } | |
473 | |
474 TEST_P(QuicStreamFactoryTest, Pooling) { | |
475 MockRead reads[] = { | |
476 MockRead(ASYNC, OK, 0) // EOF | |
477 }; | |
478 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0); | |
479 socket_factory_.AddSocketDataProvider(&socket_data); | |
480 socket_data.StopAfter(1); | |
481 | |
482 HostPortPair server2("mail.google.com", kDefaultServerPort); | |
483 host_resolver_.set_synchronous_mode(true); | |
484 host_resolver_.rules()->AddIPLiteralRule( | |
485 kDefaultServerHostName, "192.168.0.1", ""); | |
486 host_resolver_.rules()->AddIPLiteralRule( | |
487 "mail.google.com", "192.168.0.1", ""); | |
488 | |
489 QuicStreamRequest request(&factory_); | |
490 EXPECT_EQ(OK, | |
491 request.Request(host_port_pair_, | |
492 is_https_, | |
493 privacy_mode_, | |
494 "GET", | |
495 net_log_, | |
496 callback_.callback())); | |
497 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | |
498 EXPECT_TRUE(stream.get()); | |
499 | |
500 TestCompletionCallback callback; | |
501 QuicStreamRequest request2(&factory_); | |
502 EXPECT_EQ(OK, | |
503 request2.Request(server2, | |
504 is_https_, | |
505 privacy_mode_, | |
506 "GET", | |
507 net_log_, | |
508 callback.callback())); | |
509 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); | |
510 EXPECT_TRUE(stream2.get()); | |
511 | |
512 EXPECT_EQ( | |
513 QuicStreamFactoryPeer::GetActiveSession( | |
514 &factory_, host_port_pair_, is_https_), | |
515 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_)); | |
516 | |
517 EXPECT_TRUE(socket_data.at_read_eof()); | |
518 EXPECT_TRUE(socket_data.at_write_eof()); | |
519 } | |
520 | |
521 TEST_P(QuicStreamFactoryTest, NoPoolingIfDisabled) { | |
522 MockRead reads[] = { | |
523 MockRead(ASYNC, OK, 0) // EOF | |
524 }; | |
525 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0); | |
526 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0); | |
527 socket_factory_.AddSocketDataProvider(&socket_data1); | |
528 socket_factory_.AddSocketDataProvider(&socket_data2); | |
529 socket_data1.StopAfter(1); | |
530 socket_data2.StopAfter(1); | |
531 | |
532 HostPortPair server2("mail.google.com", kDefaultServerPort); | |
533 host_resolver_.set_synchronous_mode(true); | |
534 host_resolver_.rules()->AddIPLiteralRule( | |
535 kDefaultServerHostName, "192.168.0.1", ""); | |
536 host_resolver_.rules()->AddIPLiteralRule( | |
537 "mail.google.com", "192.168.0.1", ""); | |
538 | |
539 // Disable connection pooling. | |
540 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_); | |
541 | |
542 QuicStreamRequest request(&factory_); | |
543 EXPECT_EQ(OK, | |
544 request.Request(host_port_pair_, | |
545 is_https_, | |
546 privacy_mode_, | |
547 "GET", | |
548 net_log_, | |
549 callback_.callback())); | |
550 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | |
551 EXPECT_TRUE(stream.get()); | |
552 | |
553 TestCompletionCallback callback; | |
554 QuicStreamRequest request2(&factory_); | |
555 EXPECT_EQ(OK, | |
556 request2.Request(server2, | |
557 is_https_, | |
558 privacy_mode_, | |
559 "GET", | |
560 net_log_, | |
561 callback.callback())); | |
562 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); | |
563 EXPECT_TRUE(stream2.get()); | |
564 | |
565 EXPECT_NE( | |
566 QuicStreamFactoryPeer::GetActiveSession( | |
567 &factory_, host_port_pair_, is_https_), | |
568 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_)); | |
569 | |
570 EXPECT_TRUE(socket_data1.at_read_eof()); | |
571 EXPECT_TRUE(socket_data1.at_write_eof()); | |
572 EXPECT_TRUE(socket_data2.at_read_eof()); | |
573 EXPECT_TRUE(socket_data2.at_write_eof()); | |
574 } | |
575 | |
576 TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) { | |
577 MockRead reads[] = { | |
578 MockRead(ASYNC, OK, 0) // EOF | |
579 }; | |
580 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0); | |
581 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0); | |
582 socket_factory_.AddSocketDataProvider(&socket_data1); | |
583 socket_factory_.AddSocketDataProvider(&socket_data2); | |
584 socket_data1.StopAfter(1); | |
585 socket_data2.StopAfter(1); | |
586 | |
587 HostPortPair server2("mail.google.com", kDefaultServerPort); | |
588 host_resolver_.set_synchronous_mode(true); | |
589 host_resolver_.rules()->AddIPLiteralRule( | |
590 kDefaultServerHostName, "192.168.0.1", ""); | |
591 host_resolver_.rules()->AddIPLiteralRule( | |
592 "mail.google.com", "192.168.0.1", ""); | |
593 | |
594 QuicStreamRequest request(&factory_); | |
595 EXPECT_EQ(OK, | |
596 request.Request(host_port_pair_, | |
597 is_https_, | |
598 privacy_mode_, | |
599 "GET", | |
600 net_log_, | |
601 callback_.callback())); | |
602 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | |
603 EXPECT_TRUE(stream.get()); | |
604 | |
605 TestCompletionCallback callback; | |
606 QuicStreamRequest request2(&factory_); | |
607 EXPECT_EQ(OK, | |
608 request2.Request(server2, | |
609 is_https_, | |
610 privacy_mode_, | |
611 "GET", | |
612 net_log_, | |
613 callback.callback())); | |
614 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); | |
615 EXPECT_TRUE(stream2.get()); | |
616 | |
617 factory_.OnSessionGoingAway(QuicStreamFactoryPeer::GetActiveSession( | |
618 &factory_, host_port_pair_, is_https_)); | |
619 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession( | |
620 &factory_, host_port_pair_, is_https_)); | |
621 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession( | |
622 &factory_, server2, is_https_)); | |
623 | |
624 TestCompletionCallback callback3; | |
625 QuicStreamRequest request3(&factory_); | |
626 EXPECT_EQ(OK, | |
627 request3.Request(server2, | |
628 is_https_, | |
629 privacy_mode_, | |
630 "GET", | |
631 net_log_, | |
632 callback3.callback())); | |
633 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream(); | |
634 EXPECT_TRUE(stream3.get()); | |
635 | |
636 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession( | |
637 &factory_, server2, is_https_)); | |
638 | |
639 EXPECT_TRUE(socket_data1.at_read_eof()); | |
640 EXPECT_TRUE(socket_data1.at_write_eof()); | |
641 EXPECT_TRUE(socket_data2.at_read_eof()); | |
642 EXPECT_TRUE(socket_data2.at_write_eof()); | |
643 } | |
644 | |
645 TEST_P(QuicStreamFactoryTest, HttpsPooling) { | |
646 MockRead reads[] = { | |
647 MockRead(ASYNC, OK, 0) // EOF | |
648 }; | |
649 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0); | |
650 socket_factory_.AddSocketDataProvider(&socket_data); | |
651 socket_data.StopAfter(1); | |
652 | |
653 HostPortPair server1("www.example.org", 443); | |
654 HostPortPair server2("mail.example.org", 443); | |
655 | |
656 // Load a cert that is valid for: | |
657 // www.example.org (server1) | |
658 // mail.example.org (server2) | |
659 // www.example.com | |
660 base::FilePath certs_dir = GetTestCertsDirectory(); | |
661 scoped_refptr<X509Certificate> test_cert( | |
662 ImportCertFromFile(certs_dir, "spdy_pooling.pem")); | |
663 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get()); | |
664 ProofVerifyDetailsChromium verify_details; | |
665 verify_details.cert_verify_result.verified_cert = test_cert; | |
666 verify_details.cert_verify_result.is_issued_by_known_root = true; | |
667 crypto_client_stream_factory_.set_proof_verify_details(&verify_details); | |
668 | |
669 host_resolver_.set_synchronous_mode(true); | |
670 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", ""); | |
671 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", ""); | |
672 | |
673 QuicStreamRequest request(&factory_); | |
674 is_https_ = true; | |
675 EXPECT_EQ(OK, | |
676 request.Request(server1, | |
677 is_https_, | |
678 privacy_mode_, | |
679 "GET", | |
680 net_log_, | |
681 callback_.callback())); | |
682 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | |
683 EXPECT_TRUE(stream.get()); | |
684 | |
685 TestCompletionCallback callback; | |
686 QuicStreamRequest request2(&factory_); | |
687 EXPECT_EQ(OK, | |
688 request2.Request(server2, | |
689 is_https_, | |
690 privacy_mode_, | |
691 "GET", | |
692 net_log_, | |
693 callback_.callback())); | |
694 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); | |
695 EXPECT_TRUE(stream2.get()); | |
696 | |
697 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession( | |
698 &factory_, server1, is_https_), | |
699 QuicStreamFactoryPeer::GetActiveSession( | |
700 &factory_, server2, is_https_)); | |
701 | |
702 EXPECT_TRUE(socket_data.at_read_eof()); | |
703 EXPECT_TRUE(socket_data.at_write_eof()); | |
704 } | |
705 | |
706 TEST_P(QuicStreamFactoryTest, NoHttpsPoolingIfDisabled) { | |
707 MockRead reads[] = { | |
708 MockRead(ASYNC, OK, 0) // EOF | |
709 }; | |
710 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0); | |
711 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0); | |
712 socket_factory_.AddSocketDataProvider(&socket_data1); | |
713 socket_factory_.AddSocketDataProvider(&socket_data2); | |
714 socket_data1.StopAfter(1); | |
715 socket_data2.StopAfter(1); | |
716 | |
717 HostPortPair server1("www.example.org", 443); | |
718 HostPortPair server2("mail.example.org", 443); | |
719 | |
720 // Load a cert that is valid for: | |
721 // www.example.org (server1) | |
722 // mail.example.org (server2) | |
723 // www.example.com | |
724 base::FilePath certs_dir = GetTestCertsDirectory(); | |
725 scoped_refptr<X509Certificate> test_cert( | |
726 ImportCertFromFile(certs_dir, "spdy_pooling.pem")); | |
727 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get()); | |
728 ProofVerifyDetailsChromium verify_details; | |
729 verify_details.cert_verify_result.verified_cert = test_cert; | |
730 verify_details.cert_verify_result.is_issued_by_known_root = true; | |
731 crypto_client_stream_factory_.set_proof_verify_details(&verify_details); | |
732 | |
733 host_resolver_.set_synchronous_mode(true); | |
734 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", ""); | |
735 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", ""); | |
736 | |
737 // Disable connection pooling. | |
738 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_); | |
739 | |
740 QuicStreamRequest request(&factory_); | |
741 is_https_ = true; | |
742 EXPECT_EQ(OK, | |
743 request.Request(server1, | |
744 is_https_, | |
745 privacy_mode_, | |
746 "GET", | |
747 net_log_, | |
748 callback_.callback())); | |
749 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | |
750 EXPECT_TRUE(stream.get()); | |
751 | |
752 TestCompletionCallback callback; | |
753 QuicStreamRequest request2(&factory_); | |
754 EXPECT_EQ(OK, | |
755 request2.Request(server2, | |
756 is_https_, | |
757 privacy_mode_, | |
758 "GET", | |
759 net_log_, | |
760 callback_.callback())); | |
761 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); | |
762 EXPECT_TRUE(stream2.get()); | |
763 | |
764 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession( | |
765 &factory_, server1, is_https_), | |
766 QuicStreamFactoryPeer::GetActiveSession( | |
767 &factory_, server2, is_https_)); | |
768 | |
769 EXPECT_TRUE(socket_data1.at_read_eof()); | |
770 EXPECT_TRUE(socket_data1.at_write_eof()); | |
771 EXPECT_TRUE(socket_data2.at_read_eof()); | |
772 EXPECT_TRUE(socket_data2.at_write_eof()); | |
773 } | |
774 | |
775 TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithCertMismatch) { | |
776 MockRead reads[] = { | |
777 MockRead(ASYNC, OK, 0) // EOF | |
778 }; | |
779 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0); | |
780 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0); | |
781 socket_factory_.AddSocketDataProvider(&socket_data1); | |
782 socket_factory_.AddSocketDataProvider(&socket_data2); | |
783 socket_data1.StopAfter(1); | |
784 socket_data2.StopAfter(1); | |
785 | |
786 HostPortPair server1("www.example.org", 443); | |
787 HostPortPair server2("mail.google.com", 443); | |
788 | |
789 // Load a cert that is valid for: | |
790 // www.example.org (server1) | |
791 // mail.example.org | |
792 // www.example.com | |
793 // But is not valid for mail.google.com (server2). | |
794 base::FilePath certs_dir = GetTestCertsDirectory(); | |
795 scoped_refptr<X509Certificate> test_cert( | |
796 ImportCertFromFile(certs_dir, "spdy_pooling.pem")); | |
797 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get()); | |
798 ProofVerifyDetailsChromium verify_details; | |
799 verify_details.cert_verify_result.verified_cert = test_cert; | |
800 crypto_client_stream_factory_.set_proof_verify_details(&verify_details); | |
801 | |
802 | |
803 host_resolver_.set_synchronous_mode(true); | |
804 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", ""); | |
805 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", ""); | |
806 | |
807 QuicStreamRequest request(&factory_); | |
808 is_https_ = true; | |
809 EXPECT_EQ(OK, | |
810 request.Request(server1, | |
811 is_https_, | |
812 privacy_mode_, | |
813 "GET", | |
814 net_log_, | |
815 callback_.callback())); | |
816 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | |
817 EXPECT_TRUE(stream.get()); | |
818 | |
819 TestCompletionCallback callback; | |
820 QuicStreamRequest request2(&factory_); | |
821 EXPECT_EQ(OK, | |
822 request2.Request(server2, | |
823 is_https_, | |
824 privacy_mode_, | |
825 "GET", | |
826 net_log_, | |
827 callback_.callback())); | |
828 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); | |
829 EXPECT_TRUE(stream2.get()); | |
830 | |
831 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession( | |
832 &factory_, server1, is_https_), | |
833 QuicStreamFactoryPeer::GetActiveSession( | |
834 &factory_, server2, is_https_)); | |
835 | |
836 EXPECT_TRUE(socket_data1.at_read_eof()); | |
837 EXPECT_TRUE(socket_data1.at_write_eof()); | |
838 EXPECT_TRUE(socket_data2.at_read_eof()); | |
839 EXPECT_TRUE(socket_data2.at_write_eof()); | |
840 } | |
841 | |
842 TEST_P(QuicStreamFactoryTest, HttpsPoolingWithMatchingPins) { | |
843 MockRead reads[] = { | |
844 MockRead(ASYNC, OK, 0) // EOF | |
845 }; | |
846 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0); | |
847 socket_factory_.AddSocketDataProvider(&socket_data); | |
848 socket_data.StopAfter(1); | |
849 | |
850 HostPortPair server1("www.example.org", 443); | |
851 HostPortPair server2("mail.example.org", 443); | |
852 uint8 primary_pin = 1; | |
853 uint8 backup_pin = 2; | |
854 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin, | |
855 backup_pin); | |
856 | |
857 // Load a cert that is valid for: | |
858 // www.example.org (server1) | |
859 // mail.example.org (server2) | |
860 base::FilePath certs_dir = GetTestCertsDirectory(); | |
861 scoped_refptr<X509Certificate> test_cert( | |
862 ImportCertFromFile(certs_dir, "spdy_pooling.pem")); | |
863 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get()); | |
864 ProofVerifyDetailsChromium verify_details; | |
865 verify_details.cert_verify_result.verified_cert = test_cert; | |
866 verify_details.cert_verify_result.is_issued_by_known_root = true; | |
867 verify_details.cert_verify_result.public_key_hashes.push_back( | |
868 test::GetTestHashValue(primary_pin)); | |
869 crypto_client_stream_factory_.set_proof_verify_details(&verify_details); | |
870 | |
871 | |
872 host_resolver_.set_synchronous_mode(true); | |
873 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", ""); | |
874 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", ""); | |
875 | |
876 QuicStreamRequest request(&factory_); | |
877 is_https_ = true; | |
878 EXPECT_EQ(OK, | |
879 request.Request(server1, | |
880 is_https_, | |
881 privacy_mode_, | |
882 "GET", | |
883 net_log_, | |
884 callback_.callback())); | |
885 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | |
886 EXPECT_TRUE(stream.get()); | |
887 | |
888 TestCompletionCallback callback; | |
889 QuicStreamRequest request2(&factory_); | |
890 EXPECT_EQ(OK, | |
891 request2.Request(server2, | |
892 is_https_, | |
893 privacy_mode_, | |
894 "GET", | |
895 net_log_, | |
896 callback_.callback())); | |
897 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); | |
898 EXPECT_TRUE(stream2.get()); | |
899 | |
900 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession( | |
901 &factory_, server1, is_https_), | |
902 QuicStreamFactoryPeer::GetActiveSession( | |
903 &factory_, server2, is_https_)); | |
904 | |
905 EXPECT_TRUE(socket_data.at_read_eof()); | |
906 EXPECT_TRUE(socket_data.at_write_eof()); | |
907 } | |
908 | |
909 TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithMatchingPinsIfDisabled) { | |
910 MockRead reads[] = { | |
911 MockRead(ASYNC, OK, 0) // EOF | |
912 }; | |
913 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0); | |
914 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0); | |
915 socket_factory_.AddSocketDataProvider(&socket_data1); | |
916 socket_factory_.AddSocketDataProvider(&socket_data2); | |
917 socket_data1.StopAfter(1); | |
918 socket_data2.StopAfter(1); | |
919 | |
920 HostPortPair server1("www.example.org", 443); | |
921 HostPortPair server2("mail.example.org", 443); | |
922 uint8 primary_pin = 1; | |
923 uint8 backup_pin = 2; | |
924 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin, | |
925 backup_pin); | |
926 | |
927 // Load a cert that is valid for: | |
928 // www.example.org (server1) | |
929 // mail.example.org (server2) | |
930 base::FilePath certs_dir = GetTestCertsDirectory(); | |
931 scoped_refptr<X509Certificate> test_cert( | |
932 ImportCertFromFile(certs_dir, "spdy_pooling.pem")); | |
933 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get()); | |
934 ProofVerifyDetailsChromium verify_details; | |
935 verify_details.cert_verify_result.verified_cert = test_cert; | |
936 verify_details.cert_verify_result.is_issued_by_known_root = true; | |
937 verify_details.cert_verify_result.public_key_hashes.push_back( | |
938 test::GetTestHashValue(primary_pin)); | |
939 crypto_client_stream_factory_.set_proof_verify_details(&verify_details); | |
940 | |
941 | |
942 host_resolver_.set_synchronous_mode(true); | |
943 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", ""); | |
944 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", ""); | |
945 | |
946 // Disable connection pooling. | |
947 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_); | |
948 | |
949 QuicStreamRequest request(&factory_); | |
950 is_https_ = true; | |
951 EXPECT_EQ(OK, | |
952 request.Request(server1, | |
953 is_https_, | |
954 privacy_mode_, | |
955 "GET", | |
956 net_log_, | |
957 callback_.callback())); | |
958 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | |
959 EXPECT_TRUE(stream.get()); | |
960 | |
961 TestCompletionCallback callback; | |
962 QuicStreamRequest request2(&factory_); | |
963 EXPECT_EQ(OK, | |
964 request2.Request(server2, | |
965 is_https_, | |
966 privacy_mode_, | |
967 "GET", | |
968 net_log_, | |
969 callback_.callback())); | |
970 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); | |
971 EXPECT_TRUE(stream2.get()); | |
972 | |
973 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession( | |
974 &factory_, server1, is_https_), | |
975 QuicStreamFactoryPeer::GetActiveSession( | |
976 &factory_, server2, is_https_)); | |
977 | |
978 EXPECT_TRUE(socket_data1.at_read_eof()); | |
979 EXPECT_TRUE(socket_data1.at_write_eof()); | |
980 EXPECT_TRUE(socket_data2.at_read_eof()); | |
981 EXPECT_TRUE(socket_data2.at_write_eof()); | |
982 } | |
983 | |
984 TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithDifferentPins) { | |
985 MockRead reads[] = { | |
986 MockRead(ASYNC, OK, 0) // EOF | |
987 }; | |
988 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0); | |
989 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0); | |
990 socket_factory_.AddSocketDataProvider(&socket_data1); | |
991 socket_factory_.AddSocketDataProvider(&socket_data2); | |
992 socket_data1.StopAfter(1); | |
993 socket_data2.StopAfter(1); | |
994 | |
995 HostPortPair server1("www.example.org", 443); | |
996 HostPortPair server2("mail.example.org", 443); | |
997 uint8 primary_pin = 1; | |
998 uint8 backup_pin = 2; | |
999 uint8 bad_pin = 3; | |
1000 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin, | |
1001 backup_pin); | |
1002 | |
1003 // Load a cert that is valid for: | |
1004 // www.example.org (server1) | |
1005 // mail.example.org (server2) | |
1006 base::FilePath certs_dir = GetTestCertsDirectory(); | |
1007 scoped_refptr<X509Certificate> test_cert( | |
1008 ImportCertFromFile(certs_dir, "spdy_pooling.pem")); | |
1009 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get()); | |
1010 ProofVerifyDetailsChromium verify_details; | |
1011 verify_details.cert_verify_result.verified_cert = test_cert; | |
1012 verify_details.cert_verify_result.is_issued_by_known_root = true; | |
1013 verify_details.cert_verify_result.public_key_hashes.push_back( | |
1014 test::GetTestHashValue(bad_pin)); | |
1015 crypto_client_stream_factory_.set_proof_verify_details(&verify_details); | |
1016 | |
1017 | |
1018 host_resolver_.set_synchronous_mode(true); | |
1019 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", ""); | |
1020 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", ""); | |
1021 | |
1022 QuicStreamRequest request(&factory_); | |
1023 is_https_ = true; | |
1024 EXPECT_EQ(OK, | |
1025 request.Request(server1, | |
1026 is_https_, | |
1027 privacy_mode_, | |
1028 "GET", | |
1029 net_log_, | |
1030 callback_.callback())); | |
1031 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | |
1032 EXPECT_TRUE(stream.get()); | |
1033 | |
1034 TestCompletionCallback callback; | |
1035 QuicStreamRequest request2(&factory_); | |
1036 EXPECT_EQ(OK, | |
1037 request2.Request(server2, | |
1038 is_https_, | |
1039 privacy_mode_, | |
1040 "GET", | |
1041 net_log_, | |
1042 callback_.callback())); | |
1043 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); | |
1044 EXPECT_TRUE(stream2.get()); | |
1045 | |
1046 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession( | |
1047 &factory_, server1, is_https_), | |
1048 QuicStreamFactoryPeer::GetActiveSession( | |
1049 &factory_, server2, is_https_)); | |
1050 | |
1051 EXPECT_TRUE(socket_data1.at_read_eof()); | |
1052 EXPECT_TRUE(socket_data1.at_write_eof()); | |
1053 EXPECT_TRUE(socket_data2.at_read_eof()); | |
1054 EXPECT_TRUE(socket_data2.at_write_eof()); | |
1055 } | |
1056 | |
1057 TEST_P(QuicStreamFactoryTest, Goaway) { | |
1058 MockRead reads[] = { | |
1059 MockRead(ASYNC, OK, 0) // EOF | |
1060 }; | |
1061 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0); | |
1062 socket_data.StopAfter(1); | |
1063 socket_factory_.AddSocketDataProvider(&socket_data); | |
1064 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0); | |
1065 socket_data2.StopAfter(1); | |
1066 socket_factory_.AddSocketDataProvider(&socket_data2); | |
1067 | |
1068 QuicStreamRequest request(&factory_); | |
1069 EXPECT_EQ(ERR_IO_PENDING, | |
1070 request.Request(host_port_pair_, | |
1071 is_https_, | |
1072 privacy_mode_, | |
1073 "GET", | |
1074 net_log_, | |
1075 callback_.callback())); | |
1076 | |
1077 EXPECT_EQ(OK, callback_.WaitForResult()); | |
1078 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | |
1079 EXPECT_TRUE(stream.get()); | |
1080 | |
1081 // Mark the session as going away. Ensure that while it is still alive | |
1082 // that it is no longer active. | |
1083 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession( | |
1084 &factory_, host_port_pair_, is_https_); | |
1085 factory_.OnSessionGoingAway(session); | |
1086 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session)); | |
1087 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession( | |
1088 &factory_, host_port_pair_, is_https_)); | |
1089 EXPECT_EQ(nullptr, CreateIfSessionExists(host_port_pair_, net_log_).get()); | |
1090 | |
1091 // Create a new request for the same destination and verify that a | |
1092 // new session is created. | |
1093 QuicStreamRequest request2(&factory_); | |
1094 EXPECT_EQ(ERR_IO_PENDING, | |
1095 request2.Request(host_port_pair_, | |
1096 is_https_, | |
1097 privacy_mode_, | |
1098 "GET", | |
1099 net_log_, | |
1100 callback_.callback())); | |
1101 EXPECT_EQ(OK, callback_.WaitForResult()); | |
1102 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); | |
1103 EXPECT_TRUE(stream2.get()); | |
1104 | |
1105 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(&factory_, | |
1106 host_port_pair_, | |
1107 is_https_)); | |
1108 EXPECT_NE(session, | |
1109 QuicStreamFactoryPeer::GetActiveSession( | |
1110 &factory_, host_port_pair_, is_https_)); | |
1111 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session)); | |
1112 | |
1113 stream2.reset(); | |
1114 stream.reset(); | |
1115 | |
1116 EXPECT_TRUE(socket_data.at_read_eof()); | |
1117 EXPECT_TRUE(socket_data.at_write_eof()); | |
1118 EXPECT_TRUE(socket_data2.at_read_eof()); | |
1119 EXPECT_TRUE(socket_data2.at_write_eof()); | |
1120 } | |
1121 | |
1122 TEST_P(QuicStreamFactoryTest, MaxOpenStream) { | |
1123 MockRead reads[] = { | |
1124 MockRead(ASYNC, OK, 0) // EOF | |
1125 }; | |
1126 QuicStreamId stream_id = kClientDataStreamId1; | |
1127 scoped_ptr<QuicEncryptedPacket> rst( | |
1128 maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_CANCELLED)); | |
1129 MockWrite writes[] = { | |
1130 MockWrite(ASYNC, rst->data(), rst->length(), 1), | |
1131 }; | |
1132 DeterministicSocketData socket_data(reads, arraysize(reads), | |
1133 writes, arraysize(writes)); | |
1134 socket_factory_.AddSocketDataProvider(&socket_data); | |
1135 socket_data.StopAfter(1); | |
1136 | |
1137 HttpRequestInfo request_info; | |
1138 std::vector<QuicHttpStream*> streams; | |
1139 // The MockCryptoClientStream sets max_open_streams to be | |
1140 // kDefaultMaxStreamsPerConnection / 2. | |
1141 for (size_t i = 0; i < kDefaultMaxStreamsPerConnection / 2; i++) { | |
1142 QuicStreamRequest request(&factory_); | |
1143 int rv = request.Request(host_port_pair_, | |
1144 is_https_, | |
1145 privacy_mode_, | |
1146 "GET", | |
1147 net_log_, | |
1148 callback_.callback()); | |
1149 if (i == 0) { | |
1150 EXPECT_EQ(ERR_IO_PENDING, rv); | |
1151 EXPECT_EQ(OK, callback_.WaitForResult()); | |
1152 } else { | |
1153 EXPECT_EQ(OK, rv); | |
1154 } | |
1155 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | |
1156 EXPECT_TRUE(stream); | |
1157 EXPECT_EQ(OK, stream->InitializeStream( | |
1158 &request_info, DEFAULT_PRIORITY, net_log_, CompletionCallback())); | |
1159 streams.push_back(stream.release()); | |
1160 } | |
1161 | |
1162 QuicStreamRequest request(&factory_); | |
1163 EXPECT_EQ(OK, | |
1164 request.Request(host_port_pair_, | |
1165 is_https_, | |
1166 privacy_mode_, | |
1167 "GET", | |
1168 net_log_, | |
1169 CompletionCallback())); | |
1170 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | |
1171 EXPECT_TRUE(stream); | |
1172 EXPECT_EQ(ERR_IO_PENDING, stream->InitializeStream( | |
1173 &request_info, DEFAULT_PRIORITY, net_log_, callback_.callback())); | |
1174 | |
1175 // Close the first stream. | |
1176 streams.front()->Close(false); | |
1177 | |
1178 ASSERT_TRUE(callback_.have_result()); | |
1179 | |
1180 EXPECT_EQ(OK, callback_.WaitForResult()); | |
1181 | |
1182 EXPECT_TRUE(socket_data.at_read_eof()); | |
1183 EXPECT_TRUE(socket_data.at_write_eof()); | |
1184 STLDeleteElements(&streams); | |
1185 } | |
1186 | |
1187 TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) { | |
1188 DeterministicSocketData socket_data(nullptr, 0, nullptr, 0); | |
1189 socket_factory_.AddSocketDataProvider(&socket_data); | |
1190 | |
1191 host_resolver_.rules()->AddSimulatedFailure(kDefaultServerHostName); | |
1192 | |
1193 QuicStreamRequest request(&factory_); | |
1194 EXPECT_EQ(ERR_IO_PENDING, | |
1195 request.Request(host_port_pair_, | |
1196 is_https_, | |
1197 privacy_mode_, | |
1198 "GET", | |
1199 net_log_, | |
1200 callback_.callback())); | |
1201 | |
1202 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult()); | |
1203 | |
1204 EXPECT_TRUE(socket_data.at_read_eof()); | |
1205 EXPECT_TRUE(socket_data.at_write_eof()); | |
1206 } | |
1207 | |
1208 TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) { | |
1209 MockConnect connect(SYNCHRONOUS, ERR_ADDRESS_IN_USE); | |
1210 DeterministicSocketData socket_data(nullptr, 0, nullptr, 0); | |
1211 socket_data.set_connect_data(connect); | |
1212 socket_factory_.AddSocketDataProvider(&socket_data); | |
1213 socket_data.StopAfter(1); | |
1214 | |
1215 QuicStreamRequest request(&factory_); | |
1216 EXPECT_EQ(ERR_IO_PENDING, | |
1217 request.Request(host_port_pair_, | |
1218 is_https_, | |
1219 privacy_mode_, | |
1220 "GET", | |
1221 net_log_, | |
1222 callback_.callback())); | |
1223 | |
1224 EXPECT_EQ(ERR_ADDRESS_IN_USE, callback_.WaitForResult()); | |
1225 | |
1226 EXPECT_TRUE(socket_data.at_read_eof()); | |
1227 EXPECT_TRUE(socket_data.at_write_eof()); | |
1228 } | |
1229 | |
1230 TEST_P(QuicStreamFactoryTest, CancelCreate) { | |
1231 MockRead reads[] = { | |
1232 MockRead(ASYNC, OK, 0) // EOF | |
1233 }; | |
1234 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0); | |
1235 socket_factory_.AddSocketDataProvider(&socket_data); | |
1236 { | |
1237 QuicStreamRequest request(&factory_); | |
1238 EXPECT_EQ(ERR_IO_PENDING, | |
1239 request.Request(host_port_pair_, | |
1240 is_https_, | |
1241 privacy_mode_, | |
1242 "GET", | |
1243 net_log_, | |
1244 callback_.callback())); | |
1245 } | |
1246 | |
1247 socket_data.StopAfter(1); | |
1248 base::RunLoop run_loop; | |
1249 run_loop.RunUntilIdle(); | |
1250 | |
1251 scoped_ptr<QuicHttpStream> stream( | |
1252 CreateIfSessionExists(host_port_pair_, net_log_)); | |
1253 EXPECT_TRUE(stream.get()); | |
1254 stream.reset(); | |
1255 | |
1256 EXPECT_TRUE(socket_data.at_read_eof()); | |
1257 EXPECT_TRUE(socket_data.at_write_eof()); | |
1258 } | |
1259 | |
1260 TEST_P(QuicStreamFactoryTest, CreateConsistentEphemeralPort) { | |
1261 // Sequentially connect to the default host, then another host, and then the | |
1262 // default host. Verify that the default host gets a consistent ephemeral | |
1263 // port, that is different from the other host's connection. | |
1264 | |
1265 std::string other_server_name = "other.google.com"; | |
1266 EXPECT_NE(kDefaultServerHostName, other_server_name); | |
1267 HostPortPair host_port_pair2(other_server_name, kDefaultServerPort); | |
1268 | |
1269 int original_port = GetSourcePortForNewSession(host_port_pair_); | |
1270 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair2)); | |
1271 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_)); | |
1272 } | |
1273 | |
1274 TEST_P(QuicStreamFactoryTest, GoAwayDisablesConsistentEphemeralPort) { | |
1275 // Get a session to the host using the port suggester. | |
1276 int original_port = | |
1277 GetSourcePortForNewSessionAndGoAway(host_port_pair_); | |
1278 // Verify that the port is different after the goaway. | |
1279 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair_)); | |
1280 // Since the previous session did not goaway we should see the original port. | |
1281 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_)); | |
1282 } | |
1283 | |
1284 TEST_P(QuicStreamFactoryTest, CloseAllSessions) { | |
1285 MockRead reads[] = { | |
1286 MockRead(ASYNC, 0, 0) // EOF | |
1287 }; | |
1288 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket()); | |
1289 std::vector<MockWrite> writes; | |
1290 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1)); | |
1291 DeterministicSocketData socket_data(reads, arraysize(reads), | |
1292 writes.empty() ? nullptr : &writes[0], | |
1293 writes.size()); | |
1294 socket_factory_.AddSocketDataProvider(&socket_data); | |
1295 socket_data.StopAfter(1); | |
1296 | |
1297 MockRead reads2[] = { | |
1298 MockRead(ASYNC, 0, 0) // EOF | |
1299 }; | |
1300 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0); | |
1301 socket_factory_.AddSocketDataProvider(&socket_data2); | |
1302 socket_data2.StopAfter(1); | |
1303 | |
1304 QuicStreamRequest request(&factory_); | |
1305 EXPECT_EQ(ERR_IO_PENDING, | |
1306 request.Request(host_port_pair_, | |
1307 is_https_, | |
1308 privacy_mode_, | |
1309 "GET", | |
1310 net_log_, | |
1311 callback_.callback())); | |
1312 | |
1313 EXPECT_EQ(OK, callback_.WaitForResult()); | |
1314 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | |
1315 HttpRequestInfo request_info; | |
1316 EXPECT_EQ(OK, stream->InitializeStream(&request_info, | |
1317 DEFAULT_PRIORITY, | |
1318 net_log_, CompletionCallback())); | |
1319 | |
1320 // Close the session and verify that stream saw the error. | |
1321 factory_.CloseAllSessions(ERR_INTERNET_DISCONNECTED); | |
1322 EXPECT_EQ(ERR_INTERNET_DISCONNECTED, | |
1323 stream->ReadResponseHeaders(callback_.callback())); | |
1324 | |
1325 // Now attempting to request a stream to the same origin should create | |
1326 // a new session. | |
1327 | |
1328 QuicStreamRequest request2(&factory_); | |
1329 EXPECT_EQ(ERR_IO_PENDING, | |
1330 request2.Request(host_port_pair_, | |
1331 is_https_, | |
1332 privacy_mode_, | |
1333 "GET", | |
1334 net_log_, | |
1335 callback_.callback())); | |
1336 | |
1337 EXPECT_EQ(OK, callback_.WaitForResult()); | |
1338 stream = request2.ReleaseStream(); | |
1339 stream.reset(); // Will reset stream 3. | |
1340 | |
1341 EXPECT_TRUE(socket_data.at_read_eof()); | |
1342 EXPECT_TRUE(socket_data.at_write_eof()); | |
1343 EXPECT_TRUE(socket_data2.at_read_eof()); | |
1344 EXPECT_TRUE(socket_data2.at_write_eof()); | |
1345 } | |
1346 | |
1347 TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) { | |
1348 MockRead reads[] = { | |
1349 MockRead(ASYNC, 0, 0) // EOF | |
1350 }; | |
1351 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket()); | |
1352 std::vector<MockWrite> writes; | |
1353 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1)); | |
1354 DeterministicSocketData socket_data(reads, arraysize(reads), | |
1355 writes.empty() ? nullptr : &writes[0], | |
1356 writes.size()); | |
1357 socket_factory_.AddSocketDataProvider(&socket_data); | |
1358 socket_data.StopAfter(1); | |
1359 | |
1360 MockRead reads2[] = { | |
1361 MockRead(ASYNC, 0, 0) // EOF | |
1362 }; | |
1363 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0); | |
1364 socket_factory_.AddSocketDataProvider(&socket_data2); | |
1365 socket_data2.StopAfter(1); | |
1366 | |
1367 QuicStreamRequest request(&factory_); | |
1368 EXPECT_EQ(ERR_IO_PENDING, | |
1369 request.Request(host_port_pair_, | |
1370 is_https_, | |
1371 privacy_mode_, | |
1372 "GET", | |
1373 net_log_, | |
1374 callback_.callback())); | |
1375 | |
1376 EXPECT_EQ(OK, callback_.WaitForResult()); | |
1377 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | |
1378 HttpRequestInfo request_info; | |
1379 EXPECT_EQ(OK, stream->InitializeStream(&request_info, | |
1380 DEFAULT_PRIORITY, | |
1381 net_log_, CompletionCallback())); | |
1382 | |
1383 // Change the IP address and verify that stream saw the error. | |
1384 factory_.OnIPAddressChanged(); | |
1385 EXPECT_EQ(ERR_NETWORK_CHANGED, | |
1386 stream->ReadResponseHeaders(callback_.callback())); | |
1387 EXPECT_TRUE(factory_.require_confirmation()); | |
1388 | |
1389 // Now attempting to request a stream to the same origin should create | |
1390 // a new session. | |
1391 | |
1392 QuicStreamRequest request2(&factory_); | |
1393 EXPECT_EQ(ERR_IO_PENDING, | |
1394 request2.Request(host_port_pair_, | |
1395 is_https_, | |
1396 privacy_mode_, | |
1397 "GET", | |
1398 net_log_, | |
1399 callback_.callback())); | |
1400 | |
1401 EXPECT_EQ(OK, callback_.WaitForResult()); | |
1402 stream = request2.ReleaseStream(); | |
1403 stream.reset(); // Will reset stream 3. | |
1404 | |
1405 EXPECT_TRUE(socket_data.at_read_eof()); | |
1406 EXPECT_TRUE(socket_data.at_write_eof()); | |
1407 EXPECT_TRUE(socket_data2.at_read_eof()); | |
1408 EXPECT_TRUE(socket_data2.at_write_eof()); | |
1409 } | |
1410 | |
1411 TEST_P(QuicStreamFactoryTest, OnCertAdded) { | |
1412 MockRead reads[] = { | |
1413 MockRead(ASYNC, 0, 0) // EOF | |
1414 }; | |
1415 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket()); | |
1416 std::vector<MockWrite> writes; | |
1417 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1)); | |
1418 DeterministicSocketData socket_data(reads, arraysize(reads), | |
1419 writes.empty() ? nullptr : &writes[0], | |
1420 writes.size()); | |
1421 socket_factory_.AddSocketDataProvider(&socket_data); | |
1422 socket_data.StopAfter(1); | |
1423 | |
1424 MockRead reads2[] = { | |
1425 MockRead(ASYNC, 0, 0) // EOF | |
1426 }; | |
1427 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0); | |
1428 socket_factory_.AddSocketDataProvider(&socket_data2); | |
1429 socket_data2.StopAfter(1); | |
1430 | |
1431 QuicStreamRequest request(&factory_); | |
1432 EXPECT_EQ(ERR_IO_PENDING, | |
1433 request.Request(host_port_pair_, | |
1434 is_https_, | |
1435 privacy_mode_, | |
1436 "GET", | |
1437 net_log_, | |
1438 callback_.callback())); | |
1439 | |
1440 EXPECT_EQ(OK, callback_.WaitForResult()); | |
1441 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | |
1442 HttpRequestInfo request_info; | |
1443 EXPECT_EQ(OK, stream->InitializeStream(&request_info, | |
1444 DEFAULT_PRIORITY, | |
1445 net_log_, CompletionCallback())); | |
1446 | |
1447 // Add a cert and verify that stream saw the event. | |
1448 factory_.OnCertAdded(nullptr); | |
1449 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED, | |
1450 stream->ReadResponseHeaders(callback_.callback())); | |
1451 EXPECT_FALSE(factory_.require_confirmation()); | |
1452 | |
1453 // Now attempting to request a stream to the same origin should create | |
1454 // a new session. | |
1455 | |
1456 QuicStreamRequest request2(&factory_); | |
1457 EXPECT_EQ(ERR_IO_PENDING, | |
1458 request2.Request(host_port_pair_, | |
1459 is_https_, | |
1460 privacy_mode_, | |
1461 "GET", | |
1462 net_log_, | |
1463 callback_.callback())); | |
1464 | |
1465 EXPECT_EQ(OK, callback_.WaitForResult()); | |
1466 stream = request2.ReleaseStream(); | |
1467 stream.reset(); // Will reset stream 3. | |
1468 | |
1469 EXPECT_TRUE(socket_data.at_read_eof()); | |
1470 EXPECT_TRUE(socket_data.at_write_eof()); | |
1471 EXPECT_TRUE(socket_data2.at_read_eof()); | |
1472 EXPECT_TRUE(socket_data2.at_write_eof()); | |
1473 } | |
1474 | |
1475 TEST_P(QuicStreamFactoryTest, OnCACertChanged) { | |
1476 MockRead reads[] = { | |
1477 MockRead(ASYNC, 0, 0) // EOF | |
1478 }; | |
1479 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket()); | |
1480 std::vector<MockWrite> writes; | |
1481 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1)); | |
1482 DeterministicSocketData socket_data(reads, arraysize(reads), | |
1483 writes.empty() ? nullptr : &writes[0], | |
1484 writes.size()); | |
1485 socket_factory_.AddSocketDataProvider(&socket_data); | |
1486 socket_data.StopAfter(1); | |
1487 | |
1488 MockRead reads2[] = { | |
1489 MockRead(ASYNC, 0, 0) // EOF | |
1490 }; | |
1491 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0); | |
1492 socket_factory_.AddSocketDataProvider(&socket_data2); | |
1493 socket_data2.StopAfter(1); | |
1494 | |
1495 QuicStreamRequest request(&factory_); | |
1496 EXPECT_EQ(ERR_IO_PENDING, | |
1497 request.Request(host_port_pair_, | |
1498 is_https_, | |
1499 privacy_mode_, | |
1500 "GET", | |
1501 net_log_, | |
1502 callback_.callback())); | |
1503 | |
1504 EXPECT_EQ(OK, callback_.WaitForResult()); | |
1505 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | |
1506 HttpRequestInfo request_info; | |
1507 EXPECT_EQ(OK, stream->InitializeStream(&request_info, | |
1508 DEFAULT_PRIORITY, | |
1509 net_log_, CompletionCallback())); | |
1510 | |
1511 // Change the CA cert and verify that stream saw the event. | |
1512 factory_.OnCACertChanged(nullptr); | |
1513 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED, | |
1514 stream->ReadResponseHeaders(callback_.callback())); | |
1515 EXPECT_FALSE(factory_.require_confirmation()); | |
1516 | |
1517 // Now attempting to request a stream to the same origin should create | |
1518 // a new session. | |
1519 | |
1520 QuicStreamRequest request2(&factory_); | |
1521 EXPECT_EQ(ERR_IO_PENDING, | |
1522 request2.Request(host_port_pair_, | |
1523 is_https_, | |
1524 privacy_mode_, | |
1525 "GET", | |
1526 net_log_, | |
1527 callback_.callback())); | |
1528 | |
1529 EXPECT_EQ(OK, callback_.WaitForResult()); | |
1530 stream = request2.ReleaseStream(); | |
1531 stream.reset(); // Will reset stream 3. | |
1532 | |
1533 EXPECT_TRUE(socket_data.at_read_eof()); | |
1534 EXPECT_TRUE(socket_data.at_write_eof()); | |
1535 EXPECT_TRUE(socket_data2.at_read_eof()); | |
1536 EXPECT_TRUE(socket_data2.at_write_eof()); | |
1537 } | |
1538 | |
1539 TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) { | |
1540 vector<string> cannoncial_suffixes; | |
1541 cannoncial_suffixes.push_back(string(".c.youtube.com")); | |
1542 cannoncial_suffixes.push_back(string(".googlevideo.com")); | |
1543 | |
1544 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) { | |
1545 string r1_host_name("r1"); | |
1546 string r2_host_name("r2"); | |
1547 r1_host_name.append(cannoncial_suffixes[i]); | |
1548 r2_host_name.append(cannoncial_suffixes[i]); | |
1549 | |
1550 HostPortPair host_port_pair1(r1_host_name, 80); | |
1551 QuicCryptoClientConfig* crypto_config = | |
1552 QuicStreamFactoryPeer::GetCryptoConfig(&factory_); | |
1553 QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_); | |
1554 QuicCryptoClientConfig::CachedState* cached1 = | |
1555 crypto_config->LookupOrCreate(server_id1); | |
1556 EXPECT_FALSE(cached1->proof_valid()); | |
1557 EXPECT_TRUE(cached1->source_address_token().empty()); | |
1558 | |
1559 // Mutate the cached1 to have different data. | |
1560 // TODO(rtenneti): mutate other members of CachedState. | |
1561 cached1->set_source_address_token(r1_host_name); | |
1562 cached1->SetProofValid(); | |
1563 | |
1564 HostPortPair host_port_pair2(r2_host_name, 80); | |
1565 QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_); | |
1566 QuicCryptoClientConfig::CachedState* cached2 = | |
1567 crypto_config->LookupOrCreate(server_id2); | |
1568 EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token()); | |
1569 EXPECT_TRUE(cached2->proof_valid()); | |
1570 } | |
1571 } | |
1572 | |
1573 TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) { | |
1574 vector<string> cannoncial_suffixes; | |
1575 cannoncial_suffixes.push_back(string(".c.youtube.com")); | |
1576 cannoncial_suffixes.push_back(string(".googlevideo.com")); | |
1577 | |
1578 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) { | |
1579 string r3_host_name("r3"); | |
1580 string r4_host_name("r4"); | |
1581 r3_host_name.append(cannoncial_suffixes[i]); | |
1582 r4_host_name.append(cannoncial_suffixes[i]); | |
1583 | |
1584 HostPortPair host_port_pair1(r3_host_name, 80); | |
1585 QuicCryptoClientConfig* crypto_config = | |
1586 QuicStreamFactoryPeer::GetCryptoConfig(&factory_); | |
1587 QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_); | |
1588 QuicCryptoClientConfig::CachedState* cached1 = | |
1589 crypto_config->LookupOrCreate(server_id1); | |
1590 EXPECT_FALSE(cached1->proof_valid()); | |
1591 EXPECT_TRUE(cached1->source_address_token().empty()); | |
1592 | |
1593 // Mutate the cached1 to have different data. | |
1594 // TODO(rtenneti): mutate other members of CachedState. | |
1595 cached1->set_source_address_token(r3_host_name); | |
1596 cached1->SetProofInvalid(); | |
1597 | |
1598 HostPortPair host_port_pair2(r4_host_name, 80); | |
1599 QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_); | |
1600 QuicCryptoClientConfig::CachedState* cached2 = | |
1601 crypto_config->LookupOrCreate(server_id2); | |
1602 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token()); | |
1603 EXPECT_TRUE(cached2->source_address_token().empty()); | |
1604 EXPECT_FALSE(cached2->proof_valid()); | |
1605 } | |
1606 } | |
1607 | |
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; | |
1613 factory_.set_quic_server_info_factory(&quic_server_info_factory_); | |
1614 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get()); | |
1615 const size_t kLoadServerInfoTimeoutMs = 50; | |
1616 QuicStreamFactoryPeer::SetLoadServerInfoTimeout( | |
1617 &factory_, kLoadServerInfoTimeoutMs); | |
1618 | |
1619 MockRead reads[] = { | |
1620 MockRead(ASYNC, OK, 0) // EOF | |
1621 }; | |
1622 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0); | |
1623 socket_factory_.AddSocketDataProvider(&socket_data); | |
1624 socket_data.StopAfter(1); | |
1625 | |
1626 crypto_client_stream_factory_.set_handshake_mode( | |
1627 MockCryptoClientStream::ZERO_RTT); | |
1628 host_resolver_.set_synchronous_mode(true); | |
1629 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(), | |
1630 "192.168.0.1", ""); | |
1631 | |
1632 QuicStreamRequest request(&factory_); | |
1633 EXPECT_EQ(ERR_IO_PENDING, | |
1634 request.Request(host_port_pair_, | |
1635 is_https_, | |
1636 privacy_mode_, | |
1637 "GET", | |
1638 net_log_, | |
1639 callback_.callback())); | |
1640 | |
1641 // Verify that the CancelWaitForDataReady task has been posted. | |
1642 ASSERT_EQ(1u, runner_->GetPostedTasks().size()); | |
1643 EXPECT_EQ(base::TimeDelta::FromMilliseconds(kLoadServerInfoTimeoutMs), | |
1644 runner_->GetPostedTasks()[0].delay); | |
1645 | |
1646 runner_->RunNextTask(); | |
1647 ASSERT_EQ(0u, runner_->GetPostedTasks().size()); | |
1648 | |
1649 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | |
1650 EXPECT_TRUE(stream.get()); | |
1651 EXPECT_TRUE(socket_data.at_read_eof()); | |
1652 EXPECT_TRUE(socket_data.at_write_eof()); | |
1653 } | |
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 | |
1702 } // namespace test | |
1703 } // namespace net | |
OLD | NEW |