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.
5 #include "net/quic/quic_stream_factory.h"
7 #include "base/run_loop.h"
8 #include "base/strings/string_util.h"
9 #include "base/thread_task_runner_handle.h"
10 #include "net/base/test_data_directory.h"
11 #include "net/cert/cert_verifier.h"
12 #include "net/dns/mock_host_resolver.h"
13 #include "net/http/http_response_headers.h"
14 #include "net/http/http_response_info.h"
15 #include "net/http/http_server_properties_impl.h"
16 #include "net/http/http_util.h"
17 #include "net/http/transport_security_state.h"
18 #include "net/quic/crypto/crypto_handshake.h"
19 #include "net/quic/crypto/proof_verifier_chromium.h"
20 #include "net/quic/crypto/quic_decrypter.h"
21 #include "net/quic/crypto/quic_encrypter.h"
22 #include "net/quic/crypto/quic_server_info.h"
23 #include "net/quic/quic_http_stream.h"
24 #include "net/quic/quic_server_id.h"
25 #include "net/quic/test_tools/mock_clock.h"
26 #include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
27 #include "net/quic/test_tools/mock_random.h"
28 #include "net/quic/test_tools/quic_test_packet_maker.h"
29 #include "net/quic/test_tools/quic_test_utils.h"
30 #include "net/quic/test_tools/test_task_runner.h"
31 #include "net/socket/socket_test_util.h"
32 #include "net/spdy/spdy_test_utils.h"
33 #include "net/ssl/channel_id_service.h"
34 #include "net/ssl/default_channel_id_store.h"
35 #include "net/test/cert_test_util.h"
36 #include "testing/gtest/include/gtest/gtest.h"
38 using base::StringPiece
;
47 const char kDefaultServerHostName
[] = "www.google.com";
48 const int kDefaultServerPort
= 443;
50 // Run all tests with all the combinations of versions and
51 // enable_connection_racing.
53 TestParams(const QuicVersion version
, bool enable_connection_racing
)
54 : version(version
), enable_connection_racing(enable_connection_racing
) {}
56 friend ostream
& operator<<(ostream
& os
, const TestParams
& p
) {
57 os
<< "{ version: " << QuicVersionToString(p
.version
);
58 os
<< " enable_connection_racing: " << p
.enable_connection_racing
<< " }";
63 bool enable_connection_racing
;
66 // Constructs various test permutations.
67 vector
<TestParams
> GetTestParams() {
68 vector
<TestParams
> params
;
69 QuicVersionVector all_supported_versions
= QuicSupportedVersions();
70 for (const QuicVersion version
: all_supported_versions
) {
71 params
.push_back(TestParams(version
, false));
72 params
.push_back(TestParams(version
, true));
77 } // namespace anonymous
79 class QuicStreamFactoryPeer
{
81 static QuicCryptoClientConfig
* GetCryptoConfig(QuicStreamFactory
* factory
) {
82 return &factory
->crypto_config_
;
85 static bool HasActiveSession(QuicStreamFactory
* factory
,
86 const HostPortPair
& host_port_pair
,
88 QuicServerId
server_id(host_port_pair
, is_https
, PRIVACY_MODE_DISABLED
);
89 return factory
->HasActiveSession(server_id
);
92 static QuicChromiumClientSession
* GetActiveSession(
93 QuicStreamFactory
* factory
,
94 const HostPortPair
& host_port_pair
,
96 QuicServerId
server_id(host_port_pair
, is_https
, PRIVACY_MODE_DISABLED
);
97 DCHECK(factory
->HasActiveSession(server_id
));
98 return factory
->active_sessions_
[server_id
];
101 static scoped_ptr
<QuicHttpStream
> CreateFromSession(
102 QuicStreamFactory
* factory
,
103 QuicChromiumClientSession
* session
) {
104 return factory
->CreateFromSession(session
);
107 static bool IsLiveSession(QuicStreamFactory
* factory
,
108 QuicChromiumClientSession
* session
) {
109 for (QuicStreamFactory::SessionIdMap::iterator it
=
110 factory
->all_sessions_
.begin();
111 it
!= factory
->all_sessions_
.end(); ++it
) {
112 if (it
->first
== session
)
118 static void DisableConnectionPooling(QuicStreamFactory
* factory
) {
119 factory
->disable_connection_pooling_
= true;
122 static void SetTaskRunner(QuicStreamFactory
* factory
,
123 base::TaskRunner
* task_runner
) {
124 factory
->task_runner_
= task_runner
;
127 static void SetEnableConnectionRacing(QuicStreamFactory
* factory
,
128 bool enable_connection_racing
) {
129 factory
->enable_connection_racing_
= enable_connection_racing
;
132 static void SetDisableDiskCache(QuicStreamFactory
* factory
,
133 bool disable_disk_cache
) {
134 factory
->disable_disk_cache_
= disable_disk_cache
;
137 static void SetMaxNumberOfLossyConnections(
138 QuicStreamFactory
* factory
,
139 int max_number_of_lossy_connections
) {
140 factory
->max_number_of_lossy_connections_
= max_number_of_lossy_connections
;
143 static int GetNumberOfLossyConnections(QuicStreamFactory
* factory
,
145 return factory
->number_of_lossy_connections_
[port
];
148 static bool IsQuicDisabled(QuicStreamFactory
* factory
, uint16 port
) {
149 return factory
->IsQuicDisabled(port
);
152 static bool GetDelayTcpRace(QuicStreamFactory
* factory
) {
153 return factory
->delay_tcp_race_
;
156 static void SetDelayTcpRace(QuicStreamFactory
* factory
, bool delay_tcp_race
) {
157 factory
->delay_tcp_race_
= delay_tcp_race
;
160 static void SetHttpServerProperties(
161 QuicStreamFactory
* factory
,
162 base::WeakPtr
<HttpServerProperties
> http_server_properties
) {
163 factory
->http_server_properties_
= http_server_properties
;
166 static size_t GetNumberOfActiveJobs(QuicStreamFactory
* factory
,
167 const QuicServerId
& server_id
) {
168 return (factory
->active_jobs_
[server_id
]).size();
171 static void SetThresholdTimeoutsWithOpenStreams(
172 QuicStreamFactory
* factory
,
173 int threshold_timeouts_with_open_streams
) {
174 factory
->threshold_timeouts_with_open_streams_
=
175 threshold_timeouts_with_open_streams
;
178 static int GetNumTimeoutsWithOpenStreams(QuicStreamFactory
* factory
) {
179 return factory
->num_timeouts_with_open_streams_
;
182 static void SetThresholdPublicResetsPostHandshake(
183 QuicStreamFactory
* factory
,
184 int threshold_public_resets_post_handshake
) {
185 factory
->threshold_public_resets_post_handshake_
=
186 threshold_public_resets_post_handshake
;
189 static int GetNumPublicResetsPostHandshake(QuicStreamFactory
* factory
) {
190 return factory
->num_public_resets_post_handshake_
;
193 static void InitializeQuicSupportedServersAtStartup(
194 QuicStreamFactory
* factory
) {
195 factory
->InitializeQuicSupportedServersAtStartup();
198 static bool GetQuicSupportedServersAtStartupInitialzied(
199 QuicStreamFactory
* factory
) {
200 return factory
->quic_supported_servers_at_startup_initialzied_
;
203 static bool SupportsQuicAtStartUp(QuicStreamFactory
* factory
,
204 HostPortPair host_port_pair
) {
205 return ContainsKey(factory
->quic_supported_servers_at_startup_
,
210 class MockQuicServerInfo
: public QuicServerInfo
{
212 MockQuicServerInfo(const QuicServerId
& server_id
)
213 : QuicServerInfo(server_id
) {}
214 ~MockQuicServerInfo() override
{}
216 void Start() override
{}
218 int WaitForDataReady(const CompletionCallback
& callback
) override
{
219 return ERR_IO_PENDING
;
222 void ResetWaitForDataReadyCallback() override
{}
224 void CancelWaitForDataReadyCallback() override
{}
226 bool IsDataReady() override
{ return false; }
228 bool IsReadyToPersist() override
{ return false; }
230 void Persist() override
{}
232 void OnExternalCacheHit() override
{}
235 class MockQuicServerInfoFactory
: public QuicServerInfoFactory
{
237 MockQuicServerInfoFactory() {}
238 ~MockQuicServerInfoFactory() override
{}
240 QuicServerInfo
* GetForServer(const QuicServerId
& server_id
) override
{
241 return new MockQuicServerInfo(server_id
);
245 class QuicStreamFactoryTest
: public ::testing::TestWithParam
<TestParams
> {
247 QuicStreamFactoryTest()
248 : random_generator_(0),
249 clock_(new MockClock()),
250 runner_(new TestTaskRunner(clock_
)),
251 maker_(GetParam().version
, 0, clock_
, kDefaultServerHostName
),
252 cert_verifier_(CertVerifier::CreateDefault()),
254 new ChannelIDService(new DefaultChannelIDStore(nullptr),
255 base::ThreadTaskRunnerHandle::Get())),
256 factory_(&host_resolver_
,
258 base::WeakPtr
<HttpServerProperties
>(),
259 cert_verifier_
.get(),
261 channel_id_service_
.get(),
262 &transport_security_state_
,
263 /*SocketPerformanceWatcherFactory*/ nullptr,
264 &crypto_client_stream_factory_
,
267 kDefaultMaxPacketSize
,
269 SupportedVersions(GetParam().version
),
270 /*enable_port_selection=*/true,
271 /*always_require_handshake_confirmation=*/false,
272 /*disable_connection_pooling=*/false,
273 /*load_server_info_timeout_srtt_multiplier=*/0.0f
,
274 /*enable_connection_racing=*/false,
275 /*enable_non_blocking_io=*/true,
276 /*disable_disk_cache=*/false,
277 /*prefer_aes=*/false,
278 /*max_number_of_lossy_connections=*/0,
279 /*packet_loss_threshold=*/1.0f
,
280 /*max_disabled_reasons=*/3,
281 /*threshold_timeouts_with_open_streams=*/2,
282 /*threshold_pulic_resets_post_handshake=*/2,
283 /*receive_buffer_size=*/0,
284 /*delay_tcp_race=*/false,
286 host_port_pair_(kDefaultServerHostName
, kDefaultServerPort
),
288 privacy_mode_(PRIVACY_MODE_DISABLED
) {
289 factory_
.set_require_confirmation(false);
290 clock_
->AdvanceTime(QuicTime::Delta::FromSeconds(1));
291 QuicStreamFactoryPeer::SetEnableConnectionRacing(
292 &factory_
, GetParam().enable_connection_racing
);
295 bool HasActiveSession(const HostPortPair
& host_port_pair
) {
296 return QuicStreamFactoryPeer::HasActiveSession(&factory_
, host_port_pair
,
297 /*is_https_=*/false);
300 scoped_ptr
<QuicHttpStream
> CreateFromSession(
301 const HostPortPair
& host_port_pair
) {
302 QuicChromiumClientSession
* session
=
303 QuicStreamFactoryPeer::GetActiveSession(&factory_
, host_port_pair
,
305 return QuicStreamFactoryPeer::CreateFromSession(&factory_
, session
);
308 int GetSourcePortForNewSession(const HostPortPair
& destination
) {
309 return GetSourcePortForNewSessionInner(destination
, false);
312 int GetSourcePortForNewSessionAndGoAway(
313 const HostPortPair
& destination
) {
314 return GetSourcePortForNewSessionInner(destination
, true);
317 int GetSourcePortForNewSessionInner(const HostPortPair
& destination
,
318 bool goaway_received
) {
319 // Should only be called if there is no active session for this destination.
320 EXPECT_FALSE(HasActiveSession(destination
));
321 size_t socket_count
= socket_factory_
.udp_client_sockets().size();
324 MockRead(ASYNC
, OK
, 0) // EOF
326 DeterministicSocketData
socket_data(reads
, arraysize(reads
), nullptr, 0);
327 socket_data
.StopAfter(1);
328 socket_factory_
.AddSocketDataProvider(&socket_data
);
330 QuicStreamRequest
request(&factory_
);
331 EXPECT_EQ(ERR_IO_PENDING
,
332 request
.Request(destination
, is_https_
, privacy_mode_
,
333 /*cert_verify_flags=*/0, destination
.host(),
334 "GET", net_log_
, callback_
.callback()));
336 EXPECT_EQ(OK
, callback_
.WaitForResult());
337 scoped_ptr
<QuicHttpStream
> stream
= request
.ReleaseStream();
338 EXPECT_TRUE(stream
.get());
341 QuicChromiumClientSession
* session
=
342 QuicStreamFactoryPeer::GetActiveSession(&factory_
, destination
,
345 if (socket_count
+ 1 != socket_factory_
.udp_client_sockets().size()) {
352 udp_client_sockets()[socket_count
]->GetLocalAddress(&endpoint
);
353 int port
= endpoint
.port();
354 if (goaway_received
) {
355 QuicGoAwayFrame
goaway(QUIC_NO_ERROR
, 1, "");
356 session
->connection()->OnGoAwayFrame(goaway
);
359 factory_
.OnSessionClosed(session
);
360 EXPECT_FALSE(HasActiveSession(destination
));
361 EXPECT_TRUE(socket_data
.AllReadDataConsumed());
362 EXPECT_TRUE(socket_data
.AllWriteDataConsumed());
366 scoped_ptr
<QuicEncryptedPacket
> ConstructRstPacket() {
367 QuicStreamId stream_id
= kClientDataStreamId1
;
368 return maker_
.MakeRstPacket(
370 AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT
, GetParam().version
));
373 static ProofVerifyDetailsChromium
DefaultProofVerifyDetails() {
374 // Load a certificate that is valid for www.example.org, mail.example.org,
375 // and mail.example.com.
376 scoped_refptr
<X509Certificate
> test_cert(
377 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
378 EXPECT_TRUE(test_cert
.get());
379 ProofVerifyDetailsChromium verify_details
;
380 verify_details
.cert_verify_result
.verified_cert
= test_cert
;
381 verify_details
.cert_verify_result
.is_issued_by_known_root
= true;
382 return verify_details
;
385 MockQuicServerInfoFactory quic_server_info_factory_
;
386 MockHostResolver host_resolver_
;
387 DeterministicMockClientSocketFactory socket_factory_
;
388 MockCryptoClientStreamFactory crypto_client_stream_factory_
;
389 MockRandom random_generator_
;
390 MockClock
* clock_
; // Owned by factory_.
391 scoped_refptr
<TestTaskRunner
> runner_
;
392 QuicTestPacketMaker maker_
;
393 scoped_ptr
<CertVerifier
> cert_verifier_
;
394 scoped_ptr
<ChannelIDService
> channel_id_service_
;
395 TransportSecurityState transport_security_state_
;
396 QuicStreamFactory factory_
;
397 HostPortPair host_port_pair_
;
399 PrivacyMode privacy_mode_
;
400 BoundNetLog net_log_
;
401 TestCompletionCallback callback_
;
404 INSTANTIATE_TEST_CASE_P(Version
,
405 QuicStreamFactoryTest
,
406 ::testing::ValuesIn(GetTestParams()));
408 TEST_P(QuicStreamFactoryTest
, Create
) {
410 MockRead(ASYNC
, OK
, 0) // EOF
412 DeterministicSocketData
socket_data(reads
, arraysize(reads
), nullptr, 0);
413 socket_factory_
.AddSocketDataProvider(&socket_data
);
414 socket_data
.StopAfter(1);
416 QuicStreamRequest
request(&factory_
);
417 EXPECT_EQ(ERR_IO_PENDING
,
418 request
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
419 /*cert_verify_flags=*/0, host_port_pair_
.host(),
420 "GET", net_log_
, callback_
.callback()));
422 EXPECT_EQ(OK
, callback_
.WaitForResult());
423 scoped_ptr
<QuicHttpStream
> stream
= request
.ReleaseStream();
424 EXPECT_TRUE(stream
.get());
426 // Will reset stream 3.
427 stream
= CreateFromSession(host_port_pair_
);
428 EXPECT_TRUE(stream
.get());
430 // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
431 // in streams on different sessions.
432 QuicStreamRequest
request2(&factory_
);
434 request2
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
435 /*cert_verify_flags=*/0, host_port_pair_
.host(),
436 "GET", net_log_
, callback_
.callback()));
437 stream
= request2
.ReleaseStream(); // Will reset stream 5.
438 stream
.reset(); // Will reset stream 7.
440 EXPECT_TRUE(socket_data
.AllReadDataConsumed());
441 EXPECT_TRUE(socket_data
.AllWriteDataConsumed());
444 TEST_P(QuicStreamFactoryTest
, CreateZeroRtt
) {
446 MockRead(ASYNC
, OK
, 0) // EOF
448 DeterministicSocketData
socket_data(reads
, arraysize(reads
), nullptr, 0);
449 socket_factory_
.AddSocketDataProvider(&socket_data
);
450 socket_data
.StopAfter(1);
452 crypto_client_stream_factory_
.set_handshake_mode(
453 MockCryptoClientStream::ZERO_RTT
);
454 host_resolver_
.set_synchronous_mode(true);
455 host_resolver_
.rules()->AddIPLiteralRule(host_port_pair_
.host(),
458 QuicStreamRequest
request(&factory_
);
459 EXPECT_EQ(OK
, request
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
460 /*cert_verify_flags=*/0, host_port_pair_
.host(),
461 "GET", net_log_
, callback_
.callback()));
463 scoped_ptr
<QuicHttpStream
> stream
= request
.ReleaseStream();
464 EXPECT_TRUE(stream
.get());
465 EXPECT_TRUE(socket_data
.AllReadDataConsumed());
466 EXPECT_TRUE(socket_data
.AllWriteDataConsumed());
469 TEST_P(QuicStreamFactoryTest
, CreateZeroRttPost
) {
471 MockRead(ASYNC
, OK
, 0) // EOF
473 DeterministicSocketData
socket_data(reads
, arraysize(reads
), nullptr, 0);
474 socket_factory_
.AddSocketDataProvider(&socket_data
);
475 socket_data
.StopAfter(1);
477 crypto_client_stream_factory_
.set_handshake_mode(
478 MockCryptoClientStream::ZERO_RTT
);
479 host_resolver_
.set_synchronous_mode(true);
480 host_resolver_
.rules()->AddIPLiteralRule(host_port_pair_
.host(),
483 QuicStreamRequest
request(&factory_
);
484 // Posts require handshake confirmation, so this will return asynchronously.
485 EXPECT_EQ(ERR_IO_PENDING
,
486 request
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
487 /*cert_verify_flags=*/0, host_port_pair_
.host(),
488 "POST", net_log_
, callback_
.callback()));
490 // Confirm the handshake and verify that the stream is created.
491 crypto_client_stream_factory_
.last_stream()->SendOnCryptoHandshakeEvent(
492 QuicSession::HANDSHAKE_CONFIRMED
);
494 EXPECT_EQ(OK
, callback_
.WaitForResult());
495 scoped_ptr
<QuicHttpStream
> stream
= request
.ReleaseStream();
496 EXPECT_TRUE(stream
.get());
497 EXPECT_TRUE(socket_data
.AllReadDataConsumed());
498 EXPECT_TRUE(socket_data
.AllWriteDataConsumed());
501 TEST_P(QuicStreamFactoryTest
, NoZeroRttForDifferentHost
) {
503 MockRead(ASYNC
, OK
, 0),
505 DeterministicSocketData
socket_data(reads
, arraysize(reads
), nullptr, 0);
506 socket_factory_
.AddSocketDataProvider(&socket_data
);
507 socket_data
.StopAfter(1);
509 crypto_client_stream_factory_
.set_handshake_mode(
510 MockCryptoClientStream::ZERO_RTT
);
511 host_resolver_
.set_synchronous_mode(true);
512 host_resolver_
.rules()->AddIPLiteralRule(host_port_pair_
.host(),
515 QuicStreamRequest
request(&factory_
);
516 int rv
= request
.Request(
517 host_port_pair_
, is_https_
, privacy_mode_
, /*cert_verify_flags=*/0,
518 "different.host.example.com", "GET", net_log_
, callback_
.callback());
519 // If server and origin have different hostnames, then handshake confirmation
520 // should be required, so Request will return asynchronously.
521 EXPECT_EQ(ERR_IO_PENDING
, rv
);
522 // Confirm handshake.
523 crypto_client_stream_factory_
.last_stream()->SendOnCryptoHandshakeEvent(
524 QuicSession::HANDSHAKE_CONFIRMED
);
525 EXPECT_EQ(OK
, callback_
.WaitForResult());
527 scoped_ptr
<QuicHttpStream
> stream
= request
.ReleaseStream();
528 EXPECT_TRUE(stream
.get());
529 EXPECT_TRUE(socket_data
.AllReadDataConsumed());
530 EXPECT_TRUE(socket_data
.AllWriteDataConsumed());
533 TEST_P(QuicStreamFactoryTest
, CreateHttpVsHttps
) {
535 MockRead(ASYNC
, OK
, 0) // EOF
537 DeterministicSocketData
socket_data1(reads
, arraysize(reads
), nullptr, 0);
538 DeterministicSocketData
socket_data2(reads
, arraysize(reads
), nullptr, 0);
539 socket_factory_
.AddSocketDataProvider(&socket_data1
);
540 socket_factory_
.AddSocketDataProvider(&socket_data2
);
541 socket_data1
.StopAfter(1);
542 socket_data2
.StopAfter(1);
544 QuicStreamRequest
request(&factory_
);
545 EXPECT_EQ(ERR_IO_PENDING
,
546 request
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
547 /*cert_verify_flags=*/0, host_port_pair_
.host(),
548 "GET", net_log_
, callback_
.callback()));
550 EXPECT_EQ(OK
, callback_
.WaitForResult());
551 scoped_ptr
<QuicHttpStream
> stream
= request
.ReleaseStream();
552 EXPECT_TRUE(stream
.get());
554 QuicStreamRequest
request2(&factory_
);
555 EXPECT_EQ(ERR_IO_PENDING
,
556 request2
.Request(host_port_pair_
, !is_https_
, privacy_mode_
,
557 /*cert_verify_flags=*/0, host_port_pair_
.host(),
558 "GET", net_log_
, callback_
.callback()));
559 EXPECT_EQ(OK
, callback_
.WaitForResult());
560 stream
= request2
.ReleaseStream();
561 EXPECT_TRUE(stream
.get());
564 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
565 &factory_
, host_port_pair_
, is_https_
),
566 QuicStreamFactoryPeer::GetActiveSession(
567 &factory_
, host_port_pair_
, !is_https_
));
569 EXPECT_TRUE(socket_data1
.AllReadDataConsumed());
570 EXPECT_TRUE(socket_data1
.AllWriteDataConsumed());
571 EXPECT_TRUE(socket_data2
.AllReadDataConsumed());
572 EXPECT_TRUE(socket_data2
.AllWriteDataConsumed());
575 TEST_P(QuicStreamFactoryTest
, Pooling
) {
577 MockRead(ASYNC
, OK
, 0) // EOF
579 DeterministicSocketData
socket_data(reads
, arraysize(reads
), nullptr, 0);
580 socket_factory_
.AddSocketDataProvider(&socket_data
);
581 socket_data
.StopAfter(1);
583 HostPortPair
server2("mail.google.com", kDefaultServerPort
);
584 host_resolver_
.set_synchronous_mode(true);
585 host_resolver_
.rules()->AddIPLiteralRule(
586 kDefaultServerHostName
, "192.168.0.1", "");
587 host_resolver_
.rules()->AddIPLiteralRule(
588 "mail.google.com", "192.168.0.1", "");
590 QuicStreamRequest
request(&factory_
);
591 EXPECT_EQ(OK
, request
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
592 /*cert_verify_flags=*/0, host_port_pair_
.host(),
593 "GET", net_log_
, callback_
.callback()));
594 scoped_ptr
<QuicHttpStream
> stream
= request
.ReleaseStream();
595 EXPECT_TRUE(stream
.get());
597 TestCompletionCallback callback
;
598 QuicStreamRequest
request2(&factory_
);
599 EXPECT_EQ(OK
, request2
.Request(server2
, is_https_
, privacy_mode_
,
600 /*cert_verify_flags=*/0, server2
.host(), "GET",
601 net_log_
, callback
.callback()));
602 scoped_ptr
<QuicHttpStream
> stream2
= request2
.ReleaseStream();
603 EXPECT_TRUE(stream2
.get());
606 QuicStreamFactoryPeer::GetActiveSession(
607 &factory_
, host_port_pair_
, is_https_
),
608 QuicStreamFactoryPeer::GetActiveSession(&factory_
, server2
, is_https_
));
610 EXPECT_TRUE(socket_data
.AllReadDataConsumed());
611 EXPECT_TRUE(socket_data
.AllWriteDataConsumed());
614 TEST_P(QuicStreamFactoryTest
, NoPoolingIfDisabled
) {
616 MockRead(ASYNC
, OK
, 0) // EOF
618 DeterministicSocketData
socket_data1(reads
, arraysize(reads
), nullptr, 0);
619 DeterministicSocketData
socket_data2(reads
, arraysize(reads
), nullptr, 0);
620 socket_factory_
.AddSocketDataProvider(&socket_data1
);
621 socket_factory_
.AddSocketDataProvider(&socket_data2
);
622 socket_data1
.StopAfter(1);
623 socket_data2
.StopAfter(1);
625 HostPortPair
server2("mail.google.com", kDefaultServerPort
);
626 host_resolver_
.set_synchronous_mode(true);
627 host_resolver_
.rules()->AddIPLiteralRule(
628 kDefaultServerHostName
, "192.168.0.1", "");
629 host_resolver_
.rules()->AddIPLiteralRule(
630 "mail.google.com", "192.168.0.1", "");
632 // Disable connection pooling.
633 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_
);
635 QuicStreamRequest
request(&factory_
);
636 EXPECT_EQ(OK
, request
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
637 /*cert_verify_flags=*/0, host_port_pair_
.host(),
638 "GET", net_log_
, callback_
.callback()));
639 scoped_ptr
<QuicHttpStream
> stream
= request
.ReleaseStream();
640 EXPECT_TRUE(stream
.get());
642 TestCompletionCallback callback
;
643 QuicStreamRequest
request2(&factory_
);
644 EXPECT_EQ(OK
, request2
.Request(server2
, is_https_
, privacy_mode_
,
645 /*cert_verify_flags=*/0, server2
.host(), "GET",
646 net_log_
, callback
.callback()));
647 scoped_ptr
<QuicHttpStream
> stream2
= request2
.ReleaseStream();
648 EXPECT_TRUE(stream2
.get());
651 QuicStreamFactoryPeer::GetActiveSession(
652 &factory_
, host_port_pair_
, is_https_
),
653 QuicStreamFactoryPeer::GetActiveSession(&factory_
, server2
, is_https_
));
655 EXPECT_TRUE(socket_data1
.AllReadDataConsumed());
656 EXPECT_TRUE(socket_data1
.AllWriteDataConsumed());
657 EXPECT_TRUE(socket_data2
.AllReadDataConsumed());
658 EXPECT_TRUE(socket_data2
.AllWriteDataConsumed());
661 TEST_P(QuicStreamFactoryTest
, NoPoolingAfterGoAway
) {
663 MockRead(ASYNC
, OK
, 0) // EOF
665 DeterministicSocketData
socket_data1(reads
, arraysize(reads
), nullptr, 0);
666 DeterministicSocketData
socket_data2(reads
, arraysize(reads
), nullptr, 0);
667 socket_factory_
.AddSocketDataProvider(&socket_data1
);
668 socket_factory_
.AddSocketDataProvider(&socket_data2
);
669 socket_data1
.StopAfter(1);
670 socket_data2
.StopAfter(1);
672 HostPortPair
server2("mail.google.com", kDefaultServerPort
);
673 host_resolver_
.set_synchronous_mode(true);
674 host_resolver_
.rules()->AddIPLiteralRule(
675 kDefaultServerHostName
, "192.168.0.1", "");
676 host_resolver_
.rules()->AddIPLiteralRule(
677 "mail.google.com", "192.168.0.1", "");
679 QuicStreamRequest
request(&factory_
);
680 EXPECT_EQ(OK
, request
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
681 /*cert_verify_flags=*/0, host_port_pair_
.host(),
682 "GET", net_log_
, callback_
.callback()));
683 scoped_ptr
<QuicHttpStream
> stream
= request
.ReleaseStream();
684 EXPECT_TRUE(stream
.get());
686 TestCompletionCallback callback
;
687 QuicStreamRequest
request2(&factory_
);
688 EXPECT_EQ(OK
, request2
.Request(server2
, is_https_
, privacy_mode_
,
689 /*cert_verify_flags=*/0, server2
.host(), "GET",
690 net_log_
, callback
.callback()));
691 scoped_ptr
<QuicHttpStream
> stream2
= request2
.ReleaseStream();
692 EXPECT_TRUE(stream2
.get());
694 factory_
.OnSessionGoingAway(QuicStreamFactoryPeer::GetActiveSession(
695 &factory_
, host_port_pair_
, is_https_
));
696 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
697 &factory_
, host_port_pair_
, is_https_
));
698 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
699 &factory_
, server2
, is_https_
));
701 TestCompletionCallback callback3
;
702 QuicStreamRequest
request3(&factory_
);
703 EXPECT_EQ(OK
, request3
.Request(server2
, is_https_
, privacy_mode_
,
704 /*cert_verify_flags=*/0, server2
.host(), "GET",
705 net_log_
, callback3
.callback()));
706 scoped_ptr
<QuicHttpStream
> stream3
= request3
.ReleaseStream();
707 EXPECT_TRUE(stream3
.get());
709 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(
710 &factory_
, server2
, is_https_
));
712 EXPECT_TRUE(socket_data1
.AllReadDataConsumed());
713 EXPECT_TRUE(socket_data1
.AllWriteDataConsumed());
714 EXPECT_TRUE(socket_data2
.AllReadDataConsumed());
715 EXPECT_TRUE(socket_data2
.AllWriteDataConsumed());
718 TEST_P(QuicStreamFactoryTest
, HttpsPooling
) {
720 MockRead(ASYNC
, OK
, 0) // EOF
722 DeterministicSocketData
socket_data(reads
, arraysize(reads
), nullptr, 0);
723 socket_factory_
.AddSocketDataProvider(&socket_data
);
724 socket_data
.StopAfter(1);
726 HostPortPair
server1("www.example.org", 443);
727 HostPortPair
server2("mail.example.org", 443);
729 ProofVerifyDetailsChromium verify_details
= DefaultProofVerifyDetails();
730 crypto_client_stream_factory_
.AddProofVerifyDetails(&verify_details
);
732 host_resolver_
.set_synchronous_mode(true);
733 host_resolver_
.rules()->AddIPLiteralRule(server1
.host(), "192.168.0.1", "");
734 host_resolver_
.rules()->AddIPLiteralRule(server2
.host(), "192.168.0.1", "");
736 QuicStreamRequest
request(&factory_
);
738 EXPECT_EQ(OK
, request
.Request(server1
, is_https_
, privacy_mode_
,
739 /*cert_verify_flags=*/0, server1
.host(), "GET",
740 net_log_
, callback_
.callback()));
741 scoped_ptr
<QuicHttpStream
> stream
= request
.ReleaseStream();
742 EXPECT_TRUE(stream
.get());
744 TestCompletionCallback callback
;
745 QuicStreamRequest
request2(&factory_
);
746 EXPECT_EQ(OK
, request2
.Request(server2
, is_https_
, privacy_mode_
,
747 /*cert_verify_flags=*/0, server2
.host(), "GET",
748 net_log_
, callback_
.callback()));
749 scoped_ptr
<QuicHttpStream
> stream2
= request2
.ReleaseStream();
750 EXPECT_TRUE(stream2
.get());
752 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(
753 &factory_
, server1
, is_https_
),
754 QuicStreamFactoryPeer::GetActiveSession(
755 &factory_
, server2
, is_https_
));
757 EXPECT_TRUE(socket_data
.AllReadDataConsumed());
758 EXPECT_TRUE(socket_data
.AllWriteDataConsumed());
761 TEST_P(QuicStreamFactoryTest
, NoHttpsPoolingIfDisabled
) {
763 MockRead(ASYNC
, OK
, 0) // EOF
765 DeterministicSocketData
socket_data1(reads
, arraysize(reads
), nullptr, 0);
766 DeterministicSocketData
socket_data2(reads
, arraysize(reads
), nullptr, 0);
767 socket_factory_
.AddSocketDataProvider(&socket_data1
);
768 socket_factory_
.AddSocketDataProvider(&socket_data2
);
769 socket_data1
.StopAfter(1);
770 socket_data2
.StopAfter(1);
772 HostPortPair
server1("www.example.org", 443);
773 HostPortPair
server2("mail.example.org", 443);
775 ProofVerifyDetailsChromium verify_details
= DefaultProofVerifyDetails();
776 crypto_client_stream_factory_
.AddProofVerifyDetails(&verify_details
);
778 host_resolver_
.set_synchronous_mode(true);
779 host_resolver_
.rules()->AddIPLiteralRule(server1
.host(), "192.168.0.1", "");
780 host_resolver_
.rules()->AddIPLiteralRule(server2
.host(), "192.168.0.1", "");
782 // Disable connection pooling.
783 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_
);
785 QuicStreamRequest
request(&factory_
);
787 EXPECT_EQ(OK
, request
.Request(server1
, is_https_
, privacy_mode_
,
788 /*cert_verify_flags=*/0, server1
.host(), "GET",
789 net_log_
, callback_
.callback()));
790 scoped_ptr
<QuicHttpStream
> stream
= request
.ReleaseStream();
791 EXPECT_TRUE(stream
.get());
793 TestCompletionCallback callback
;
794 QuicStreamRequest
request2(&factory_
);
795 EXPECT_EQ(OK
, request2
.Request(server2
, is_https_
, privacy_mode_
,
796 /*cert_verify_flags=*/0, server2
.host(), "GET",
797 net_log_
, callback_
.callback()));
798 scoped_ptr
<QuicHttpStream
> stream2
= request2
.ReleaseStream();
799 EXPECT_TRUE(stream2
.get());
801 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
802 &factory_
, server1
, is_https_
),
803 QuicStreamFactoryPeer::GetActiveSession(
804 &factory_
, server2
, is_https_
));
806 EXPECT_TRUE(socket_data1
.AllReadDataConsumed());
807 EXPECT_TRUE(socket_data1
.AllWriteDataConsumed());
808 EXPECT_TRUE(socket_data2
.AllReadDataConsumed());
809 EXPECT_TRUE(socket_data2
.AllWriteDataConsumed());
812 class QuicAlternativeServiceCertificateValidationPooling
813 : public QuicStreamFactoryTest
{
815 void Run(bool valid
) {
817 MockRead(ASYNC
, OK
, 0) // EOF
819 DeterministicSocketData
socket_data1(reads
, arraysize(reads
), nullptr, 0);
820 socket_factory_
.AddSocketDataProvider(&socket_data1
);
821 socket_data1
.StopAfter(1);
823 HostPortPair
server1("www.example.org", 443);
824 HostPortPair
server2("mail.example.org", 443);
826 std::string
origin_host(valid
? "mail.example.org" : "invalid.example.org");
827 HostPortPair
alternative("www.example.org", 443);
829 ProofVerifyDetailsChromium verify_details
= DefaultProofVerifyDetails();
830 bool common_name_fallback_used
;
832 verify_details
.cert_verify_result
.verified_cert
->VerifyNameMatch(
833 origin_host
, &common_name_fallback_used
));
835 verify_details
.cert_verify_result
.verified_cert
->VerifyNameMatch(
836 alternative
.host(), &common_name_fallback_used
));
837 crypto_client_stream_factory_
.AddProofVerifyDetails(&verify_details
);
839 host_resolver_
.set_synchronous_mode(true);
840 host_resolver_
.rules()->AddIPLiteralRule(alternative
.host(), "192.168.0.1",
843 // Open first stream to alternative.
844 QuicStreamRequest
request1(&factory_
);
846 EXPECT_EQ(OK
, request1
.Request(alternative
, is_https_
, privacy_mode_
,
847 /*cert_verify_flags=*/0, alternative
.host(),
848 "GET", net_log_
, callback_
.callback()));
849 scoped_ptr
<QuicHttpStream
> stream1
= request1
.ReleaseStream();
850 EXPECT_TRUE(stream1
.get());
852 QuicStreamRequest
request2(&factory_
);
853 int rv
= request2
.Request(alternative
, is_https_
, privacy_mode_
,
854 /*cert_verify_flags=*/0, origin_host
, "GET",
855 net_log_
, callback_
.callback());
857 // Alternative service of origin to |alternative| should pool to session
858 // of |stream1| even if origin is different. Since only one
859 // SocketDataProvider is set up, the second request succeeding means that
860 // it pooled to the session opened by the first one.
862 scoped_ptr
<QuicHttpStream
> stream2
= request2
.ReleaseStream();
863 EXPECT_TRUE(stream2
.get());
865 EXPECT_EQ(ERR_ALTERNATIVE_CERT_NOT_VALID_FOR_ORIGIN
, rv
);
868 EXPECT_TRUE(socket_data1
.AllReadDataConsumed());
869 EXPECT_TRUE(socket_data1
.AllWriteDataConsumed());
873 INSTANTIATE_TEST_CASE_P(Version
,
874 QuicAlternativeServiceCertificateValidationPooling
,
875 ::testing::ValuesIn(GetTestParams()));
877 TEST_P(QuicAlternativeServiceCertificateValidationPooling
, Valid
) {
881 TEST_P(QuicAlternativeServiceCertificateValidationPooling
, Invalid
) {
885 TEST_P(QuicStreamFactoryTest
, HttpsPoolingWithMatchingPins
) {
887 MockRead(ASYNC
, OK
, 0) // EOF
889 DeterministicSocketData
socket_data(reads
, arraysize(reads
), nullptr, 0);
890 socket_factory_
.AddSocketDataProvider(&socket_data
);
891 socket_data
.StopAfter(1);
893 HostPortPair
server1("www.example.org", 443);
894 HostPortPair
server2("mail.example.org", 443);
895 uint8 primary_pin
= 1;
896 uint8 backup_pin
= 2;
897 test::AddPin(&transport_security_state_
, "mail.example.org", primary_pin
,
900 ProofVerifyDetailsChromium verify_details
= DefaultProofVerifyDetails();
901 verify_details
.cert_verify_result
.public_key_hashes
.push_back(
902 test::GetTestHashValue(primary_pin
));
903 crypto_client_stream_factory_
.AddProofVerifyDetails(&verify_details
);
905 host_resolver_
.set_synchronous_mode(true);
906 host_resolver_
.rules()->AddIPLiteralRule(server1
.host(), "192.168.0.1", "");
907 host_resolver_
.rules()->AddIPLiteralRule(server2
.host(), "192.168.0.1", "");
909 QuicStreamRequest
request(&factory_
);
911 EXPECT_EQ(OK
, request
.Request(server1
, is_https_
, privacy_mode_
,
912 /*cert_verify_flags=*/0, server1
.host(), "GET",
913 net_log_
, callback_
.callback()));
914 scoped_ptr
<QuicHttpStream
> stream
= request
.ReleaseStream();
915 EXPECT_TRUE(stream
.get());
917 TestCompletionCallback callback
;
918 QuicStreamRequest
request2(&factory_
);
919 EXPECT_EQ(OK
, request2
.Request(server2
, is_https_
, privacy_mode_
,
920 /*cert_verify_flags=*/0, server2
.host(), "GET",
921 net_log_
, callback_
.callback()));
922 scoped_ptr
<QuicHttpStream
> stream2
= request2
.ReleaseStream();
923 EXPECT_TRUE(stream2
.get());
925 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(
926 &factory_
, server1
, is_https_
),
927 QuicStreamFactoryPeer::GetActiveSession(
928 &factory_
, server2
, is_https_
));
930 EXPECT_TRUE(socket_data
.AllReadDataConsumed());
931 EXPECT_TRUE(socket_data
.AllWriteDataConsumed());
934 TEST_P(QuicStreamFactoryTest
, NoHttpsPoolingWithMatchingPinsIfDisabled
) {
936 MockRead(ASYNC
, OK
, 0) // EOF
938 DeterministicSocketData
socket_data1(reads
, arraysize(reads
), nullptr, 0);
939 DeterministicSocketData
socket_data2(reads
, arraysize(reads
), nullptr, 0);
940 socket_factory_
.AddSocketDataProvider(&socket_data1
);
941 socket_factory_
.AddSocketDataProvider(&socket_data2
);
942 socket_data1
.StopAfter(1);
943 socket_data2
.StopAfter(1);
945 HostPortPair
server1("www.example.org", 443);
946 HostPortPair
server2("mail.example.org", 443);
947 uint8 primary_pin
= 1;
948 uint8 backup_pin
= 2;
949 test::AddPin(&transport_security_state_
, "mail.example.org", primary_pin
,
952 ProofVerifyDetailsChromium verify_details
= DefaultProofVerifyDetails();
953 verify_details
.cert_verify_result
.public_key_hashes
.push_back(
954 test::GetTestHashValue(primary_pin
));
955 crypto_client_stream_factory_
.AddProofVerifyDetails(&verify_details
);
957 host_resolver_
.set_synchronous_mode(true);
958 host_resolver_
.rules()->AddIPLiteralRule(server1
.host(), "192.168.0.1", "");
959 host_resolver_
.rules()->AddIPLiteralRule(server2
.host(), "192.168.0.1", "");
961 // Disable connection pooling.
962 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_
);
964 QuicStreamRequest
request(&factory_
);
966 EXPECT_EQ(OK
, request
.Request(server1
, is_https_
, privacy_mode_
,
967 /*cert_verify_flags=*/0, server1
.host(), "GET",
968 net_log_
, callback_
.callback()));
969 scoped_ptr
<QuicHttpStream
> stream
= request
.ReleaseStream();
970 EXPECT_TRUE(stream
.get());
972 TestCompletionCallback callback
;
973 QuicStreamRequest
request2(&factory_
);
974 EXPECT_EQ(OK
, request2
.Request(server2
, is_https_
, privacy_mode_
,
975 /*cert_verify_flags=*/0, server2
.host(), "GET",
976 net_log_
, callback_
.callback()));
977 scoped_ptr
<QuicHttpStream
> stream2
= request2
.ReleaseStream();
978 EXPECT_TRUE(stream2
.get());
980 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
981 &factory_
, server1
, is_https_
),
982 QuicStreamFactoryPeer::GetActiveSession(
983 &factory_
, server2
, is_https_
));
985 EXPECT_TRUE(socket_data1
.AllReadDataConsumed());
986 EXPECT_TRUE(socket_data1
.AllWriteDataConsumed());
987 EXPECT_TRUE(socket_data2
.AllReadDataConsumed());
988 EXPECT_TRUE(socket_data2
.AllWriteDataConsumed());
991 TEST_P(QuicStreamFactoryTest
, NoHttpsPoolingWithDifferentPins
) {
993 MockRead(ASYNC
, OK
, 0) // EOF
995 DeterministicSocketData
socket_data1(reads
, arraysize(reads
), nullptr, 0);
996 DeterministicSocketData
socket_data2(reads
, arraysize(reads
), nullptr, 0);
997 socket_factory_
.AddSocketDataProvider(&socket_data1
);
998 socket_factory_
.AddSocketDataProvider(&socket_data2
);
999 socket_data1
.StopAfter(1);
1000 socket_data2
.StopAfter(1);
1002 HostPortPair
server1("www.example.org", 443);
1003 HostPortPair
server2("mail.example.org", 443);
1004 uint8 primary_pin
= 1;
1005 uint8 backup_pin
= 2;
1007 test::AddPin(&transport_security_state_
, "mail.example.org", primary_pin
,
1010 ProofVerifyDetailsChromium verify_details1
= DefaultProofVerifyDetails();
1011 verify_details1
.cert_verify_result
.public_key_hashes
.push_back(
1012 test::GetTestHashValue(bad_pin
));
1013 crypto_client_stream_factory_
.AddProofVerifyDetails(&verify_details1
);
1015 ProofVerifyDetailsChromium verify_details2
= DefaultProofVerifyDetails();
1016 verify_details2
.cert_verify_result
.public_key_hashes
.push_back(
1017 test::GetTestHashValue(primary_pin
));
1018 crypto_client_stream_factory_
.AddProofVerifyDetails(&verify_details2
);
1020 host_resolver_
.set_synchronous_mode(true);
1021 host_resolver_
.rules()->AddIPLiteralRule(server1
.host(), "192.168.0.1", "");
1022 host_resolver_
.rules()->AddIPLiteralRule(server2
.host(), "192.168.0.1", "");
1024 QuicStreamRequest
request(&factory_
);
1026 EXPECT_EQ(OK
, request
.Request(server1
, is_https_
, privacy_mode_
,
1027 /*cert_verify_flags=*/0, server1
.host(), "GET",
1028 net_log_
, callback_
.callback()));
1029 scoped_ptr
<QuicHttpStream
> stream
= request
.ReleaseStream();
1030 EXPECT_TRUE(stream
.get());
1032 TestCompletionCallback callback
;
1033 QuicStreamRequest
request2(&factory_
);
1034 EXPECT_EQ(OK
, request2
.Request(server2
, is_https_
, privacy_mode_
,
1035 /*cert_verify_flags=*/0, server2
.host(), "GET",
1036 net_log_
, callback_
.callback()));
1037 scoped_ptr
<QuicHttpStream
> stream2
= request2
.ReleaseStream();
1038 EXPECT_TRUE(stream2
.get());
1040 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
1041 &factory_
, server1
, is_https_
),
1042 QuicStreamFactoryPeer::GetActiveSession(
1043 &factory_
, server2
, is_https_
));
1045 EXPECT_TRUE(socket_data1
.AllReadDataConsumed());
1046 EXPECT_TRUE(socket_data1
.AllWriteDataConsumed());
1047 EXPECT_TRUE(socket_data2
.AllReadDataConsumed());
1048 EXPECT_TRUE(socket_data2
.AllWriteDataConsumed());
1051 TEST_P(QuicStreamFactoryTest
, Goaway
) {
1052 MockRead reads
[] = {
1053 MockRead(ASYNC
, OK
, 0) // EOF
1055 DeterministicSocketData
socket_data(reads
, arraysize(reads
), nullptr, 0);
1056 socket_data
.StopAfter(1);
1057 socket_factory_
.AddSocketDataProvider(&socket_data
);
1058 DeterministicSocketData
socket_data2(reads
, arraysize(reads
), nullptr, 0);
1059 socket_data2
.StopAfter(1);
1060 socket_factory_
.AddSocketDataProvider(&socket_data2
);
1062 QuicStreamRequest
request(&factory_
);
1063 EXPECT_EQ(ERR_IO_PENDING
,
1064 request
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
1065 /*cert_verify_flags=*/0, host_port_pair_
.host(),
1066 "GET", net_log_
, callback_
.callback()));
1068 EXPECT_EQ(OK
, callback_
.WaitForResult());
1069 scoped_ptr
<QuicHttpStream
> stream
= request
.ReleaseStream();
1070 EXPECT_TRUE(stream
.get());
1072 // Mark the session as going away. Ensure that while it is still alive
1073 // that it is no longer active.
1074 QuicChromiumClientSession
* session
= QuicStreamFactoryPeer::GetActiveSession(
1075 &factory_
, host_port_pair_
, is_https_
);
1076 factory_
.OnSessionGoingAway(session
);
1077 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_
, session
));
1078 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
1079 &factory_
, host_port_pair_
, is_https_
));
1080 EXPECT_FALSE(HasActiveSession(host_port_pair_
));
1082 // Create a new request for the same destination and verify that a
1083 // new session is created.
1084 QuicStreamRequest
request2(&factory_
);
1085 EXPECT_EQ(ERR_IO_PENDING
,
1086 request2
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
1087 /*cert_verify_flags=*/0, host_port_pair_
.host(),
1088 "GET", net_log_
, callback_
.callback()));
1089 EXPECT_EQ(OK
, callback_
.WaitForResult());
1090 scoped_ptr
<QuicHttpStream
> stream2
= request2
.ReleaseStream();
1091 EXPECT_TRUE(stream2
.get());
1093 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(&factory_
,
1097 QuicStreamFactoryPeer::GetActiveSession(
1098 &factory_
, host_port_pair_
, is_https_
));
1099 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_
, session
));
1104 EXPECT_TRUE(socket_data
.AllReadDataConsumed());
1105 EXPECT_TRUE(socket_data
.AllWriteDataConsumed());
1106 EXPECT_TRUE(socket_data2
.AllReadDataConsumed());
1107 EXPECT_TRUE(socket_data2
.AllWriteDataConsumed());
1110 TEST_P(QuicStreamFactoryTest
, MaxOpenStream
) {
1111 MockRead reads
[] = {
1112 MockRead(ASYNC
, OK
, 0) // EOF
1114 QuicStreamId stream_id
= kClientDataStreamId1
;
1115 scoped_ptr
<QuicEncryptedPacket
> rst(
1116 maker_
.MakeRstPacket(1, true, stream_id
, QUIC_STREAM_CANCELLED
));
1117 MockWrite writes
[] = {
1118 MockWrite(ASYNC
, rst
->data(), rst
->length(), 1),
1120 DeterministicSocketData
socket_data(reads
, arraysize(reads
),
1121 writes
, arraysize(writes
));
1122 socket_factory_
.AddSocketDataProvider(&socket_data
);
1123 socket_data
.StopAfter(1);
1125 HttpRequestInfo request_info
;
1126 std::vector
<QuicHttpStream
*> streams
;
1127 // The MockCryptoClientStream sets max_open_streams to be
1128 // kDefaultMaxStreamsPerConnection / 2.
1129 for (size_t i
= 0; i
< kDefaultMaxStreamsPerConnection
/ 2; i
++) {
1130 QuicStreamRequest
request(&factory_
);
1131 int rv
= request
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
1132 /*cert_verify_flags=*/0, host_port_pair_
.host(),
1133 "GET", net_log_
, callback_
.callback());
1135 EXPECT_EQ(ERR_IO_PENDING
, rv
);
1136 EXPECT_EQ(OK
, callback_
.WaitForResult());
1140 scoped_ptr
<QuicHttpStream
> stream
= request
.ReleaseStream();
1141 EXPECT_TRUE(stream
);
1142 EXPECT_EQ(OK
, stream
->InitializeStream(
1143 &request_info
, DEFAULT_PRIORITY
, net_log_
, CompletionCallback()));
1144 streams
.push_back(stream
.release());
1147 QuicStreamRequest
request(&factory_
);
1148 EXPECT_EQ(OK
, request
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
1149 /*cert_verify_flags=*/0, host_port_pair_
.host(),
1150 "GET", net_log_
, CompletionCallback()));
1151 scoped_ptr
<QuicHttpStream
> stream
= request
.ReleaseStream();
1152 EXPECT_TRUE(stream
);
1153 EXPECT_EQ(ERR_IO_PENDING
, stream
->InitializeStream(
1154 &request_info
, DEFAULT_PRIORITY
, net_log_
, callback_
.callback()));
1156 // Close the first stream.
1157 streams
.front()->Close(false);
1159 ASSERT_TRUE(callback_
.have_result());
1161 EXPECT_EQ(OK
, callback_
.WaitForResult());
1163 EXPECT_TRUE(socket_data
.AllReadDataConsumed());
1164 EXPECT_TRUE(socket_data
.AllWriteDataConsumed());
1165 STLDeleteElements(&streams
);
1168 TEST_P(QuicStreamFactoryTest
, ResolutionErrorInCreate
) {
1169 DeterministicSocketData
socket_data(nullptr, 0, nullptr, 0);
1170 socket_factory_
.AddSocketDataProvider(&socket_data
);
1172 host_resolver_
.rules()->AddSimulatedFailure(kDefaultServerHostName
);
1174 QuicStreamRequest
request(&factory_
);
1175 EXPECT_EQ(ERR_IO_PENDING
,
1176 request
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
1177 /*cert_verify_flags=*/0, host_port_pair_
.host(),
1178 "GET", net_log_
, callback_
.callback()));
1180 EXPECT_EQ(ERR_NAME_NOT_RESOLVED
, callback_
.WaitForResult());
1182 EXPECT_TRUE(socket_data
.AllReadDataConsumed());
1183 EXPECT_TRUE(socket_data
.AllWriteDataConsumed());
1186 TEST_P(QuicStreamFactoryTest
, ConnectErrorInCreate
) {
1187 MockConnect
connect(SYNCHRONOUS
, ERR_ADDRESS_IN_USE
);
1188 DeterministicSocketData
socket_data(nullptr, 0, nullptr, 0);
1189 socket_data
.set_connect_data(connect
);
1190 socket_factory_
.AddSocketDataProvider(&socket_data
);
1191 socket_data
.StopAfter(1);
1193 QuicStreamRequest
request(&factory_
);
1194 EXPECT_EQ(ERR_IO_PENDING
,
1195 request
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
1196 /*cert_verify_flags=*/0, host_port_pair_
.host(),
1197 "GET", net_log_
, callback_
.callback()));
1199 EXPECT_EQ(ERR_ADDRESS_IN_USE
, callback_
.WaitForResult());
1201 EXPECT_TRUE(socket_data
.AllReadDataConsumed());
1202 EXPECT_TRUE(socket_data
.AllWriteDataConsumed());
1205 TEST_P(QuicStreamFactoryTest
, CancelCreate
) {
1206 MockRead reads
[] = {
1207 MockRead(ASYNC
, OK
, 0) // EOF
1209 DeterministicSocketData
socket_data(reads
, arraysize(reads
), nullptr, 0);
1210 socket_factory_
.AddSocketDataProvider(&socket_data
);
1212 QuicStreamRequest
request(&factory_
);
1213 EXPECT_EQ(ERR_IO_PENDING
,
1214 request
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
1215 /*cert_verify_flags=*/0, host_port_pair_
.host(),
1216 "GET", net_log_
, callback_
.callback()));
1219 socket_data
.StopAfter(1);
1220 base::RunLoop run_loop
;
1221 run_loop
.RunUntilIdle();
1223 scoped_ptr
<QuicHttpStream
> stream(CreateFromSession(host_port_pair_
));
1224 EXPECT_TRUE(stream
.get());
1227 EXPECT_TRUE(socket_data
.AllReadDataConsumed());
1228 EXPECT_TRUE(socket_data
.AllWriteDataConsumed());
1231 TEST_P(QuicStreamFactoryTest
, CreateConsistentEphemeralPort
) {
1232 // Sequentially connect to the default host, then another host, and then the
1233 // default host. Verify that the default host gets a consistent ephemeral
1234 // port, that is different from the other host's connection.
1236 std::string other_server_name
= "other.google.com";
1237 EXPECT_NE(kDefaultServerHostName
, other_server_name
);
1238 HostPortPair
host_port_pair2(other_server_name
, kDefaultServerPort
);
1240 int original_port
= GetSourcePortForNewSession(host_port_pair_
);
1241 EXPECT_NE(original_port
, GetSourcePortForNewSession(host_port_pair2
));
1242 EXPECT_EQ(original_port
, GetSourcePortForNewSession(host_port_pair_
));
1245 TEST_P(QuicStreamFactoryTest
, GoAwayDisablesConsistentEphemeralPort
) {
1246 // Get a session to the host using the port suggester.
1248 GetSourcePortForNewSessionAndGoAway(host_port_pair_
);
1249 // Verify that the port is different after the goaway.
1250 EXPECT_NE(original_port
, GetSourcePortForNewSession(host_port_pair_
));
1251 // Since the previous session did not goaway we should see the original port.
1252 EXPECT_EQ(original_port
, GetSourcePortForNewSession(host_port_pair_
));
1255 TEST_P(QuicStreamFactoryTest
, CloseAllSessions
) {
1256 MockRead reads
[] = {
1257 MockRead(ASYNC
, 0, 0) // EOF
1259 scoped_ptr
<QuicEncryptedPacket
> rst(ConstructRstPacket());
1260 std::vector
<MockWrite
> writes
;
1261 writes
.push_back(MockWrite(ASYNC
, rst
->data(), rst
->length(), 1));
1262 DeterministicSocketData
socket_data(reads
, arraysize(reads
),
1263 writes
.empty() ? nullptr : &writes
[0],
1265 socket_factory_
.AddSocketDataProvider(&socket_data
);
1266 socket_data
.StopAfter(1);
1268 MockRead reads2
[] = {
1269 MockRead(ASYNC
, 0, 0) // EOF
1271 DeterministicSocketData
socket_data2(reads2
, arraysize(reads2
), nullptr, 0);
1272 socket_factory_
.AddSocketDataProvider(&socket_data2
);
1273 socket_data2
.StopAfter(1);
1275 QuicStreamRequest
request(&factory_
);
1276 EXPECT_EQ(ERR_IO_PENDING
,
1277 request
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
1278 /*cert_verify_flags=*/0, host_port_pair_
.host(),
1279 "GET", net_log_
, callback_
.callback()));
1281 EXPECT_EQ(OK
, callback_
.WaitForResult());
1282 scoped_ptr
<QuicHttpStream
> stream
= request
.ReleaseStream();
1283 HttpRequestInfo request_info
;
1284 EXPECT_EQ(OK
, stream
->InitializeStream(&request_info
,
1286 net_log_
, CompletionCallback()));
1288 // Close the session and verify that stream saw the error.
1289 factory_
.CloseAllSessions(ERR_INTERNET_DISCONNECTED
);
1290 EXPECT_EQ(ERR_INTERNET_DISCONNECTED
,
1291 stream
->ReadResponseHeaders(callback_
.callback()));
1293 // Now attempting to request a stream to the same origin should create
1296 QuicStreamRequest
request2(&factory_
);
1297 EXPECT_EQ(ERR_IO_PENDING
,
1298 request2
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
1299 /*cert_verify_flags=*/0, host_port_pair_
.host(),
1300 "GET", net_log_
, callback_
.callback()));
1302 EXPECT_EQ(OK
, callback_
.WaitForResult());
1303 stream
= request2
.ReleaseStream();
1304 stream
.reset(); // Will reset stream 3.
1306 EXPECT_TRUE(socket_data
.AllReadDataConsumed());
1307 EXPECT_TRUE(socket_data
.AllWriteDataConsumed());
1308 EXPECT_TRUE(socket_data2
.AllReadDataConsumed());
1309 EXPECT_TRUE(socket_data2
.AllWriteDataConsumed());
1312 TEST_P(QuicStreamFactoryTest
, OnIPAddressChanged
) {
1313 MockRead reads
[] = {
1314 MockRead(ASYNC
, 0, 0) // EOF
1316 scoped_ptr
<QuicEncryptedPacket
> rst(ConstructRstPacket());
1317 std::vector
<MockWrite
> writes
;
1318 writes
.push_back(MockWrite(ASYNC
, rst
->data(), rst
->length(), 1));
1319 DeterministicSocketData
socket_data(reads
, arraysize(reads
),
1320 writes
.empty() ? nullptr : &writes
[0],
1322 socket_factory_
.AddSocketDataProvider(&socket_data
);
1323 socket_data
.StopAfter(1);
1325 MockRead reads2
[] = {
1326 MockRead(ASYNC
, 0, 0) // EOF
1328 DeterministicSocketData
socket_data2(reads2
, arraysize(reads2
), nullptr, 0);
1329 socket_factory_
.AddSocketDataProvider(&socket_data2
);
1330 socket_data2
.StopAfter(1);
1332 QuicStreamRequest
request(&factory_
);
1333 EXPECT_EQ(ERR_IO_PENDING
,
1334 request
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
1335 /*cert_verify_flags=*/0, host_port_pair_
.host(),
1336 "GET", net_log_
, callback_
.callback()));
1338 EXPECT_EQ(OK
, callback_
.WaitForResult());
1339 scoped_ptr
<QuicHttpStream
> stream
= request
.ReleaseStream();
1340 HttpRequestInfo request_info
;
1341 EXPECT_EQ(OK
, stream
->InitializeStream(&request_info
,
1343 net_log_
, CompletionCallback()));
1345 // Change the IP address and verify that stream saw the error.
1346 factory_
.OnIPAddressChanged();
1347 EXPECT_EQ(ERR_NETWORK_CHANGED
,
1348 stream
->ReadResponseHeaders(callback_
.callback()));
1349 EXPECT_TRUE(factory_
.require_confirmation());
1351 // Now attempting to request a stream to the same origin should create
1354 QuicStreamRequest
request2(&factory_
);
1355 EXPECT_EQ(ERR_IO_PENDING
,
1356 request2
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
1357 /*cert_verify_flags=*/0, host_port_pair_
.host(),
1358 "GET", net_log_
, callback_
.callback()));
1360 EXPECT_EQ(OK
, callback_
.WaitForResult());
1361 stream
= request2
.ReleaseStream();
1362 stream
.reset(); // Will reset stream 3.
1364 EXPECT_TRUE(socket_data
.AllReadDataConsumed());
1365 EXPECT_TRUE(socket_data
.AllWriteDataConsumed());
1366 EXPECT_TRUE(socket_data2
.AllReadDataConsumed());
1367 EXPECT_TRUE(socket_data2
.AllWriteDataConsumed());
1370 TEST_P(QuicStreamFactoryTest
, OnSSLConfigChanged
) {
1371 MockRead reads
[] = {
1372 MockRead(ASYNC
, 0, 0) // EOF
1374 scoped_ptr
<QuicEncryptedPacket
> rst(ConstructRstPacket());
1375 std::vector
<MockWrite
> writes
;
1376 writes
.push_back(MockWrite(ASYNC
, rst
->data(), rst
->length(), 1));
1377 DeterministicSocketData
socket_data(reads
, arraysize(reads
),
1378 writes
.empty() ? nullptr : &writes
[0],
1380 socket_factory_
.AddSocketDataProvider(&socket_data
);
1381 socket_data
.StopAfter(1);
1383 MockRead reads2
[] = {
1384 MockRead(ASYNC
, 0, 0) // EOF
1386 DeterministicSocketData
socket_data2(reads2
, arraysize(reads2
), nullptr, 0);
1387 socket_factory_
.AddSocketDataProvider(&socket_data2
);
1388 socket_data2
.StopAfter(1);
1390 QuicStreamRequest
request(&factory_
);
1391 EXPECT_EQ(ERR_IO_PENDING
,
1392 request
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
1393 /*cert_verify_flags=*/0, host_port_pair_
.host(),
1394 "GET", net_log_
, callback_
.callback()));
1396 EXPECT_EQ(OK
, callback_
.WaitForResult());
1397 scoped_ptr
<QuicHttpStream
> stream
= request
.ReleaseStream();
1398 HttpRequestInfo request_info
;
1399 EXPECT_EQ(OK
, stream
->InitializeStream(&request_info
, DEFAULT_PRIORITY
,
1400 net_log_
, CompletionCallback()));
1402 factory_
.OnSSLConfigChanged();
1403 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED
,
1404 stream
->ReadResponseHeaders(callback_
.callback()));
1405 EXPECT_FALSE(factory_
.require_confirmation());
1407 // Now attempting to request a stream to the same origin should create
1410 QuicStreamRequest
request2(&factory_
);
1411 EXPECT_EQ(ERR_IO_PENDING
,
1412 request2
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
1413 /*cert_verify_flags=*/0, host_port_pair_
.host(),
1414 "GET", net_log_
, callback_
.callback()));
1416 EXPECT_EQ(OK
, callback_
.WaitForResult());
1417 stream
= request2
.ReleaseStream();
1418 stream
.reset(); // Will reset stream 3.
1420 EXPECT_TRUE(socket_data
.AllReadDataConsumed());
1421 EXPECT_TRUE(socket_data
.AllWriteDataConsumed());
1422 EXPECT_TRUE(socket_data2
.AllReadDataConsumed());
1423 EXPECT_TRUE(socket_data2
.AllWriteDataConsumed());
1426 TEST_P(QuicStreamFactoryTest
, OnCertAdded
) {
1427 MockRead reads
[] = {
1428 MockRead(ASYNC
, 0, 0) // EOF
1430 scoped_ptr
<QuicEncryptedPacket
> rst(ConstructRstPacket());
1431 std::vector
<MockWrite
> writes
;
1432 writes
.push_back(MockWrite(ASYNC
, rst
->data(), rst
->length(), 1));
1433 DeterministicSocketData
socket_data(reads
, arraysize(reads
),
1434 writes
.empty() ? nullptr : &writes
[0],
1436 socket_factory_
.AddSocketDataProvider(&socket_data
);
1437 socket_data
.StopAfter(1);
1439 MockRead reads2
[] = {
1440 MockRead(ASYNC
, 0, 0) // EOF
1442 DeterministicSocketData
socket_data2(reads2
, arraysize(reads2
), nullptr, 0);
1443 socket_factory_
.AddSocketDataProvider(&socket_data2
);
1444 socket_data2
.StopAfter(1);
1446 QuicStreamRequest
request(&factory_
);
1447 EXPECT_EQ(ERR_IO_PENDING
,
1448 request
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
1449 /*cert_verify_flags=*/0, host_port_pair_
.host(),
1450 "GET", net_log_
, callback_
.callback()));
1452 EXPECT_EQ(OK
, callback_
.WaitForResult());
1453 scoped_ptr
<QuicHttpStream
> stream
= request
.ReleaseStream();
1454 HttpRequestInfo request_info
;
1455 EXPECT_EQ(OK
, stream
->InitializeStream(&request_info
,
1457 net_log_
, CompletionCallback()));
1459 // Add a cert and verify that stream saw the event.
1460 factory_
.OnCertAdded(nullptr);
1461 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED
,
1462 stream
->ReadResponseHeaders(callback_
.callback()));
1463 EXPECT_FALSE(factory_
.require_confirmation());
1465 // Now attempting to request a stream to the same origin should create
1468 QuicStreamRequest
request2(&factory_
);
1469 EXPECT_EQ(ERR_IO_PENDING
,
1470 request2
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
1471 /*cert_verify_flags=*/0, host_port_pair_
.host(),
1472 "GET", net_log_
, callback_
.callback()));
1474 EXPECT_EQ(OK
, callback_
.WaitForResult());
1475 stream
= request2
.ReleaseStream();
1476 stream
.reset(); // Will reset stream 3.
1478 EXPECT_TRUE(socket_data
.AllReadDataConsumed());
1479 EXPECT_TRUE(socket_data
.AllWriteDataConsumed());
1480 EXPECT_TRUE(socket_data2
.AllReadDataConsumed());
1481 EXPECT_TRUE(socket_data2
.AllWriteDataConsumed());
1484 TEST_P(QuicStreamFactoryTest
, OnCACertChanged
) {
1485 MockRead reads
[] = {
1486 MockRead(ASYNC
, 0, 0) // EOF
1488 scoped_ptr
<QuicEncryptedPacket
> rst(ConstructRstPacket());
1489 std::vector
<MockWrite
> writes
;
1490 writes
.push_back(MockWrite(ASYNC
, rst
->data(), rst
->length(), 1));
1491 DeterministicSocketData
socket_data(reads
, arraysize(reads
),
1492 writes
.empty() ? nullptr : &writes
[0],
1494 socket_factory_
.AddSocketDataProvider(&socket_data
);
1495 socket_data
.StopAfter(1);
1497 MockRead reads2
[] = {
1498 MockRead(ASYNC
, 0, 0) // EOF
1500 DeterministicSocketData
socket_data2(reads2
, arraysize(reads2
), nullptr, 0);
1501 socket_factory_
.AddSocketDataProvider(&socket_data2
);
1502 socket_data2
.StopAfter(1);
1504 QuicStreamRequest
request(&factory_
);
1505 EXPECT_EQ(ERR_IO_PENDING
,
1506 request
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
1507 /*cert_verify_flags=*/0, host_port_pair_
.host(),
1508 "GET", net_log_
, callback_
.callback()));
1510 EXPECT_EQ(OK
, callback_
.WaitForResult());
1511 scoped_ptr
<QuicHttpStream
> stream
= request
.ReleaseStream();
1512 HttpRequestInfo request_info
;
1513 EXPECT_EQ(OK
, stream
->InitializeStream(&request_info
,
1515 net_log_
, CompletionCallback()));
1517 // Change the CA cert and verify that stream saw the event.
1518 factory_
.OnCACertChanged(nullptr);
1519 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED
,
1520 stream
->ReadResponseHeaders(callback_
.callback()));
1521 EXPECT_FALSE(factory_
.require_confirmation());
1523 // Now attempting to request a stream to the same origin should create
1526 QuicStreamRequest
request2(&factory_
);
1527 EXPECT_EQ(ERR_IO_PENDING
,
1528 request2
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
1529 /*cert_verify_flags=*/0, host_port_pair_
.host(),
1530 "GET", net_log_
, callback_
.callback()));
1532 EXPECT_EQ(OK
, callback_
.WaitForResult());
1533 stream
= request2
.ReleaseStream();
1534 stream
.reset(); // Will reset stream 3.
1536 EXPECT_TRUE(socket_data
.AllReadDataConsumed());
1537 EXPECT_TRUE(socket_data
.AllWriteDataConsumed());
1538 EXPECT_TRUE(socket_data2
.AllReadDataConsumed());
1539 EXPECT_TRUE(socket_data2
.AllWriteDataConsumed());
1542 TEST_P(QuicStreamFactoryTest
, SharedCryptoConfig
) {
1543 vector
<string
> cannoncial_suffixes
;
1544 cannoncial_suffixes
.push_back(string(".c.youtube.com"));
1545 cannoncial_suffixes
.push_back(string(".googlevideo.com"));
1547 for (unsigned i
= 0; i
< cannoncial_suffixes
.size(); ++i
) {
1548 string
r1_host_name("r1");
1549 string
r2_host_name("r2");
1550 r1_host_name
.append(cannoncial_suffixes
[i
]);
1551 r2_host_name
.append(cannoncial_suffixes
[i
]);
1553 HostPortPair
host_port_pair1(r1_host_name
, 80);
1554 QuicCryptoClientConfig
* crypto_config
=
1555 QuicStreamFactoryPeer::GetCryptoConfig(&factory_
);
1556 QuicServerId
server_id1(host_port_pair1
, is_https_
, privacy_mode_
);
1557 QuicCryptoClientConfig::CachedState
* cached1
=
1558 crypto_config
->LookupOrCreate(server_id1
);
1559 EXPECT_FALSE(cached1
->proof_valid());
1560 EXPECT_TRUE(cached1
->source_address_token().empty());
1562 // Mutate the cached1 to have different data.
1563 // TODO(rtenneti): mutate other members of CachedState.
1564 cached1
->set_source_address_token(r1_host_name
);
1565 cached1
->SetProofValid();
1567 HostPortPair
host_port_pair2(r2_host_name
, 80);
1568 QuicServerId
server_id2(host_port_pair2
, is_https_
, privacy_mode_
);
1569 QuicCryptoClientConfig::CachedState
* cached2
=
1570 crypto_config
->LookupOrCreate(server_id2
);
1571 EXPECT_EQ(cached1
->source_address_token(), cached2
->source_address_token());
1572 EXPECT_TRUE(cached2
->proof_valid());
1576 TEST_P(QuicStreamFactoryTest
, CryptoConfigWhenProofIsInvalid
) {
1577 vector
<string
> cannoncial_suffixes
;
1578 cannoncial_suffixes
.push_back(string(".c.youtube.com"));
1579 cannoncial_suffixes
.push_back(string(".googlevideo.com"));
1581 for (unsigned i
= 0; i
< cannoncial_suffixes
.size(); ++i
) {
1582 string
r3_host_name("r3");
1583 string
r4_host_name("r4");
1584 r3_host_name
.append(cannoncial_suffixes
[i
]);
1585 r4_host_name
.append(cannoncial_suffixes
[i
]);
1587 HostPortPair
host_port_pair1(r3_host_name
, 80);
1588 QuicCryptoClientConfig
* crypto_config
=
1589 QuicStreamFactoryPeer::GetCryptoConfig(&factory_
);
1590 QuicServerId
server_id1(host_port_pair1
, is_https_
, privacy_mode_
);
1591 QuicCryptoClientConfig::CachedState
* cached1
=
1592 crypto_config
->LookupOrCreate(server_id1
);
1593 EXPECT_FALSE(cached1
->proof_valid());
1594 EXPECT_TRUE(cached1
->source_address_token().empty());
1596 // Mutate the cached1 to have different data.
1597 // TODO(rtenneti): mutate other members of CachedState.
1598 cached1
->set_source_address_token(r3_host_name
);
1599 cached1
->SetProofInvalid();
1601 HostPortPair
host_port_pair2(r4_host_name
, 80);
1602 QuicServerId
server_id2(host_port_pair2
, is_https_
, privacy_mode_
);
1603 QuicCryptoClientConfig::CachedState
* cached2
=
1604 crypto_config
->LookupOrCreate(server_id2
);
1605 EXPECT_NE(cached1
->source_address_token(), cached2
->source_address_token());
1606 EXPECT_TRUE(cached2
->source_address_token().empty());
1607 EXPECT_FALSE(cached2
->proof_valid());
1611 TEST_P(QuicStreamFactoryTest
, RacingConnections
) {
1612 if (!GetParam().enable_connection_racing
)
1614 factory_
.set_quic_server_info_factory(&quic_server_info_factory_
);
1615 QuicStreamFactoryPeer::SetTaskRunner(&factory_
, runner_
.get());
1616 MockRead reads
[] = {
1617 MockRead(ASYNC
, OK
, 0) // EOF
1619 DeterministicSocketData
socket_data(reads
, arraysize(reads
), nullptr, 0);
1620 socket_factory_
.AddSocketDataProvider(&socket_data
);
1621 socket_data
.StopAfter(1);
1623 MockRead reads2
[] = {
1624 MockRead(ASYNC
, 0, 0) // EOF
1626 DeterministicSocketData
socket_data2(reads2
, arraysize(reads2
), nullptr, 0);
1627 socket_factory_
.AddSocketDataProvider(&socket_data2
);
1628 socket_data2
.StopAfter(1);
1630 crypto_client_stream_factory_
.set_handshake_mode(
1631 MockCryptoClientStream::ZERO_RTT
);
1632 host_resolver_
.set_synchronous_mode(true);
1633 host_resolver_
.rules()->AddIPLiteralRule(host_port_pair_
.host(),
1636 QuicStreamRequest
request(&factory_
);
1637 QuicServerId
server_id(host_port_pair_
, is_https_
, privacy_mode_
);
1638 EXPECT_EQ(ERR_IO_PENDING
,
1639 request
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
1640 /*cert_verify_flags=*/0, host_port_pair_
.host(),
1641 "GET", net_log_
, callback_
.callback()));
1643 QuicStreamFactoryPeer::GetNumberOfActiveJobs(&factory_
, server_id
));
1645 runner_
->RunNextTask();
1647 scoped_ptr
<QuicHttpStream
> stream
= request
.ReleaseStream();
1648 EXPECT_TRUE(stream
.get());
1649 EXPECT_TRUE(socket_data
.AllReadDataConsumed());
1650 EXPECT_TRUE(socket_data
.AllWriteDataConsumed());
1652 QuicStreamFactoryPeer::GetNumberOfActiveJobs(&factory_
, server_id
));
1655 TEST_P(QuicStreamFactoryTest
, EnableNotLoadFromDiskCache
) {
1656 factory_
.set_quic_server_info_factory(&quic_server_info_factory_
);
1657 QuicStreamFactoryPeer::SetTaskRunner(&factory_
, runner_
.get());
1658 QuicStreamFactoryPeer::SetDisableDiskCache(&factory_
, true);
1660 MockRead reads
[] = {
1661 MockRead(ASYNC
, OK
, 0) // EOF
1663 DeterministicSocketData
socket_data(reads
, arraysize(reads
), nullptr, 0);
1664 socket_factory_
.AddSocketDataProvider(&socket_data
);
1665 socket_data
.StopAfter(1);
1667 crypto_client_stream_factory_
.set_handshake_mode(
1668 MockCryptoClientStream::ZERO_RTT
);
1669 host_resolver_
.set_synchronous_mode(true);
1670 host_resolver_
.rules()->AddIPLiteralRule(host_port_pair_
.host(),
1673 QuicStreamRequest
request(&factory_
);
1674 EXPECT_EQ(OK
, request
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
1675 /*cert_verify_flags=*/0, host_port_pair_
.host(),
1676 "GET", net_log_
, callback_
.callback()));
1678 // If we are waiting for disk cache, we would have posted a task. Verify that
1679 // the CancelWaitForDataReady task hasn't been posted.
1680 ASSERT_EQ(0u, runner_
->GetPostedTasks().size());
1682 scoped_ptr
<QuicHttpStream
> stream
= request
.ReleaseStream();
1683 EXPECT_TRUE(stream
.get());
1684 EXPECT_TRUE(socket_data
.AllReadDataConsumed());
1685 EXPECT_TRUE(socket_data
.AllWriteDataConsumed());
1688 TEST_P(QuicStreamFactoryTest
, BadPacketLoss
) {
1689 factory_
.set_quic_server_info_factory(&quic_server_info_factory_
);
1690 QuicStreamFactoryPeer::SetTaskRunner(&factory_
, runner_
.get());
1691 QuicStreamFactoryPeer::SetDisableDiskCache(&factory_
, true);
1692 QuicStreamFactoryPeer::SetMaxNumberOfLossyConnections(&factory_
, 2);
1694 QuicStreamFactoryPeer::IsQuicDisabled(&factory_
, host_port_pair_
.port()));
1695 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1696 &factory_
, host_port_pair_
.port()));
1698 MockRead reads
[] = {
1699 MockRead(ASYNC
, OK
, 0) // EOF
1701 DeterministicSocketData
socket_data(reads
, arraysize(reads
), nullptr, 0);
1702 socket_factory_
.AddSocketDataProvider(&socket_data
);
1703 socket_data
.StopAfter(1);
1705 DeterministicSocketData
socket_data2(nullptr, 0, nullptr, 0);
1706 socket_factory_
.AddSocketDataProvider(&socket_data2
);
1707 socket_data2
.StopAfter(1);
1709 DeterministicSocketData
socket_data3(nullptr, 0, nullptr, 0);
1710 socket_factory_
.AddSocketDataProvider(&socket_data3
);
1711 socket_data3
.StopAfter(1);
1713 DeterministicSocketData
socket_data4(nullptr, 0, nullptr, 0);
1714 socket_factory_
.AddSocketDataProvider(&socket_data4
);
1715 socket_data4
.StopAfter(1);
1717 HostPortPair
server2("mail.example.org", kDefaultServerPort
);
1718 HostPortPair
server3("docs.example.org", kDefaultServerPort
);
1719 HostPortPair
server4("images.example.org", kDefaultServerPort
);
1721 crypto_client_stream_factory_
.set_handshake_mode(
1722 MockCryptoClientStream::ZERO_RTT
);
1723 host_resolver_
.set_synchronous_mode(true);
1724 host_resolver_
.rules()->AddIPLiteralRule(host_port_pair_
.host(),
1726 host_resolver_
.rules()->AddIPLiteralRule(server2
.host(), "192.168.0.1", "");
1727 host_resolver_
.rules()->AddIPLiteralRule(server3
.host(), "192.168.0.1", "");
1728 host_resolver_
.rules()->AddIPLiteralRule(server4
.host(), "192.168.0.1", "");
1730 QuicStreamRequest
request(&factory_
);
1731 EXPECT_EQ(OK
, request
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
1732 /*cert_verify_flags=*/0, host_port_pair_
.host(),
1733 "GET", net_log_
, callback_
.callback()));
1735 QuicChromiumClientSession
* session
= QuicStreamFactoryPeer::GetActiveSession(
1736 &factory_
, host_port_pair_
, is_https_
);
1738 DVLOG(1) << "Create 1st session and test packet loss";
1740 // Set packet_loss_rate to a lower value than packet_loss_threshold.
1742 factory_
.OnHandshakeConfirmed(session
, /*packet_loss_rate=*/0.9f
));
1743 EXPECT_TRUE(session
->connection()->connected());
1744 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(
1745 &factory_
, host_port_pair_
, is_https_
));
1747 QuicStreamFactoryPeer::IsQuicDisabled(&factory_
, host_port_pair_
.port()));
1748 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1749 &factory_
, host_port_pair_
.port()));
1751 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
1752 // and that shouldn't close the session and it shouldn't disable QUIC.
1754 factory_
.OnHandshakeConfirmed(session
, /*packet_loss_rate=*/1.0f
));
1755 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1756 &factory_
, host_port_pair_
.port()));
1757 EXPECT_TRUE(session
->connection()->connected());
1759 QuicStreamFactoryPeer::IsQuicDisabled(&factory_
, host_port_pair_
.port()));
1760 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(
1761 &factory_
, host_port_pair_
, is_https_
));
1763 // Test N-in-a-row high packet loss connections.
1765 DVLOG(1) << "Create 2nd session and test packet loss";
1767 TestCompletionCallback callback2
;
1768 QuicStreamRequest
request2(&factory_
);
1769 EXPECT_EQ(OK
, request2
.Request(server2
, is_https_
, privacy_mode_
,
1770 /*cert_verify_flags=*/0, server2
.host(), "GET",
1771 net_log_
, callback2
.callback()));
1772 QuicChromiumClientSession
* session2
=
1773 QuicStreamFactoryPeer::GetActiveSession(&factory_
, server2
, is_https_
);
1775 // If there is no packet loss during handshake confirmation, number of lossy
1776 // connections for the port should be 0.
1777 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1778 &factory_
, server2
.port()));
1780 factory_
.OnHandshakeConfirmed(session2
, /*packet_loss_rate=*/0.9f
));
1781 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1782 &factory_
, server2
.port()));
1784 QuicStreamFactoryPeer::IsQuicDisabled(&factory_
, server2
.port()));
1786 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
1787 // and that shouldn't close the session and it shouldn't disable QUIC.
1789 factory_
.OnHandshakeConfirmed(session2
, /*packet_loss_rate=*/1.0f
));
1790 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1791 &factory_
, server2
.port()));
1792 EXPECT_TRUE(session2
->connection()->connected());
1794 QuicStreamFactoryPeer::IsQuicDisabled(&factory_
, server2
.port()));
1796 QuicStreamFactoryPeer::HasActiveSession(&factory_
, server2
, is_https_
));
1798 DVLOG(1) << "Create 3rd session which also has packet loss";
1800 TestCompletionCallback callback3
;
1801 QuicStreamRequest
request3(&factory_
);
1802 EXPECT_EQ(OK
, request3
.Request(server3
, is_https_
, privacy_mode_
,
1803 /*cert_verify_flags=*/0, server3
.host(), "GET",
1804 net_log_
, callback3
.callback()));
1805 QuicChromiumClientSession
* session3
=
1806 QuicStreamFactoryPeer::GetActiveSession(&factory_
, server3
, is_https_
);
1808 DVLOG(1) << "Create 4th session with packet loss and test IsQuicDisabled()";
1809 TestCompletionCallback callback4
;
1810 QuicStreamRequest
request4(&factory_
);
1811 EXPECT_EQ(OK
, request4
.Request(server4
, is_https_
, privacy_mode_
,
1812 /*cert_verify_flags=*/0, server4
.host(), "GET",
1813 net_log_
, callback4
.callback()));
1814 QuicChromiumClientSession
* session4
=
1815 QuicStreamFactoryPeer::GetActiveSession(&factory_
, server4
, is_https_
);
1817 // Set packet_loss_rate to higher value than packet_loss_threshold 2nd time in
1818 // a row and that should close the session and disable QUIC.
1820 factory_
.OnHandshakeConfirmed(session3
, /*packet_loss_rate=*/1.0f
));
1821 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1822 &factory_
, server3
.port()));
1823 EXPECT_FALSE(session3
->connection()->connected());
1824 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(&factory_
, server3
.port()));
1826 QuicStreamFactoryPeer::HasActiveSession(&factory_
, server3
, is_https_
));
1827 EXPECT_FALSE(HasActiveSession(server3
));
1829 // Set packet_loss_rate to higher value than packet_loss_threshold 3rd time in
1830 // a row and IsQuicDisabled() should close the session.
1832 factory_
.OnHandshakeConfirmed(session4
, /*packet_loss_rate=*/1.0f
));
1833 EXPECT_EQ(3, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1834 &factory_
, server4
.port()));
1835 EXPECT_FALSE(session4
->connection()->connected());
1836 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(&factory_
, server4
.port()));
1838 QuicStreamFactoryPeer::HasActiveSession(&factory_
, server4
, is_https_
));
1839 EXPECT_FALSE(HasActiveSession(server4
));
1841 scoped_ptr
<QuicHttpStream
> stream
= request
.ReleaseStream();
1842 EXPECT_TRUE(stream
.get());
1843 scoped_ptr
<QuicHttpStream
> stream2
= request2
.ReleaseStream();
1844 EXPECT_TRUE(stream2
.get());
1845 scoped_ptr
<QuicHttpStream
> stream3
= request3
.ReleaseStream();
1846 EXPECT_TRUE(stream3
.get());
1847 scoped_ptr
<QuicHttpStream
> stream4
= request4
.ReleaseStream();
1848 EXPECT_TRUE(stream4
.get());
1849 EXPECT_TRUE(socket_data
.AllReadDataConsumed());
1850 EXPECT_TRUE(socket_data
.AllWriteDataConsumed());
1851 EXPECT_TRUE(socket_data2
.AllReadDataConsumed());
1852 EXPECT_TRUE(socket_data2
.AllWriteDataConsumed());
1853 EXPECT_TRUE(socket_data3
.AllReadDataConsumed());
1854 EXPECT_TRUE(socket_data3
.AllWriteDataConsumed());
1855 EXPECT_TRUE(socket_data4
.AllReadDataConsumed());
1856 EXPECT_TRUE(socket_data4
.AllWriteDataConsumed());
1859 TEST_P(QuicStreamFactoryTest
, PublicResetPostHandshakeTwoOfTwo
) {
1860 factory_
.set_quic_server_info_factory(&quic_server_info_factory_
);
1861 QuicStreamFactoryPeer::SetTaskRunner(&factory_
, runner_
.get());
1862 QuicStreamFactoryPeer::SetDisableDiskCache(&factory_
, true);
1863 QuicStreamFactoryPeer::SetThresholdPublicResetsPostHandshake(&factory_
, 2);
1865 QuicStreamFactoryPeer::IsQuicDisabled(&factory_
, host_port_pair_
.port()));
1866 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1867 &factory_
, host_port_pair_
.port()));
1869 MockRead reads
[] = {
1870 MockRead(ASYNC
, OK
, 0) // EOF
1872 DeterministicSocketData
socket_data(reads
, arraysize(reads
), nullptr, 0);
1873 socket_factory_
.AddSocketDataProvider(&socket_data
);
1874 socket_data
.StopAfter(1);
1876 DeterministicSocketData
socket_data2(reads
, arraysize(reads
), nullptr, 0);
1877 socket_factory_
.AddSocketDataProvider(&socket_data2
);
1878 socket_data2
.StopAfter(1);
1880 HostPortPair
server2("mail.example.org", kDefaultServerPort
);
1882 crypto_client_stream_factory_
.set_handshake_mode(
1883 MockCryptoClientStream::CONFIRM_HANDSHAKE
);
1884 host_resolver_
.set_synchronous_mode(true);
1885 host_resolver_
.rules()->AddIPLiteralRule(host_port_pair_
.host(),
1887 host_resolver_
.rules()->AddIPLiteralRule(server2
.host(), "192.168.0.1", "");
1889 QuicStreamRequest
request(&factory_
);
1890 EXPECT_EQ(OK
, request
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
1891 /*cert_verify_flags=*/0, host_port_pair_
.host(),
1892 "GET", net_log_
, callback_
.callback()));
1894 QuicChromiumClientSession
* session
= QuicStreamFactoryPeer::GetActiveSession(
1895 &factory_
, host_port_pair_
, is_https_
);
1897 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
1898 session
->connection()->CloseConnection(QUIC_PUBLIC_RESET
, true);
1899 // Need to spin the loop now to ensure that
1900 // QuicStreamFactory::OnSessionClosed() runs.
1901 base::RunLoop run_loop
;
1902 run_loop
.RunUntilIdle();
1905 QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(&factory_
));
1907 QuicStreamFactoryPeer::IsQuicDisabled(&factory_
, host_port_pair_
.port()));
1909 // Test two-in-a-row public reset post handshakes..
1910 DVLOG(1) << "Create 2nd session and trigger public reset post handshake";
1911 TestCompletionCallback callback2
;
1912 QuicStreamRequest
request2(&factory_
);
1913 EXPECT_EQ(OK
, request2
.Request(server2
, is_https_
, privacy_mode_
,
1914 /*cert_verify_flags=*/0, server2
.host(), "GET",
1915 net_log_
, callback2
.callback()));
1916 QuicChromiumClientSession
* session2
=
1917 QuicStreamFactoryPeer::GetActiveSession(&factory_
, server2
, is_https_
);
1919 session2
->connection()->CloseConnection(QUIC_PUBLIC_RESET
, true);
1920 // Need to spin the loop now to ensure that
1921 // QuicStreamFactory::OnSessionClosed() runs.
1922 base::RunLoop run_loop2
;
1923 run_loop2
.RunUntilIdle();
1925 QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(&factory_
));
1927 QuicStreamFactoryPeer::IsQuicDisabled(&factory_
, host_port_pair_
.port()));
1929 QuicChromiumClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE
,
1930 factory_
.QuicDisabledReason(host_port_pair_
.port()));
1932 scoped_ptr
<QuicHttpStream
> stream
= request
.ReleaseStream();
1933 EXPECT_TRUE(stream
.get());
1934 scoped_ptr
<QuicHttpStream
> stream2
= request2
.ReleaseStream();
1935 EXPECT_TRUE(stream2
.get());
1936 EXPECT_TRUE(socket_data
.AllReadDataConsumed());
1937 EXPECT_TRUE(socket_data
.AllWriteDataConsumed());
1938 EXPECT_TRUE(socket_data2
.AllReadDataConsumed());
1939 EXPECT_TRUE(socket_data2
.AllWriteDataConsumed());
1942 TEST_P(QuicStreamFactoryTest
, TimeoutsWithOpenStreamsTwoOfTwo
) {
1943 factory_
.set_quic_server_info_factory(&quic_server_info_factory_
);
1944 QuicStreamFactoryPeer::SetTaskRunner(&factory_
, runner_
.get());
1945 QuicStreamFactoryPeer::SetDisableDiskCache(&factory_
, true);
1946 QuicStreamFactoryPeer::SetThresholdTimeoutsWithOpenStreams(&factory_
, 2);
1948 QuicStreamFactoryPeer::IsQuicDisabled(&factory_
, host_port_pair_
.port()));
1949 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1950 &factory_
, host_port_pair_
.port()));
1952 MockRead reads
[] = {
1953 MockRead(ASYNC
, OK
, 0) // EOF
1955 DeterministicSocketData
socket_data(reads
, arraysize(reads
), nullptr, 0);
1956 socket_factory_
.AddSocketDataProvider(&socket_data
);
1957 socket_data
.StopAfter(1);
1959 DeterministicSocketData
socket_data2(reads
, arraysize(reads
), nullptr, 0);
1960 socket_factory_
.AddSocketDataProvider(&socket_data2
);
1961 socket_data2
.StopAfter(1);
1963 HostPortPair
server2("mail.example.org", kDefaultServerPort
);
1965 crypto_client_stream_factory_
.set_handshake_mode(
1966 MockCryptoClientStream::CONFIRM_HANDSHAKE
);
1967 host_resolver_
.set_synchronous_mode(true);
1968 host_resolver_
.rules()->AddIPLiteralRule(host_port_pair_
.host(),
1970 host_resolver_
.rules()->AddIPLiteralRule(server2
.host(), "192.168.0.1", "");
1972 QuicStreamRequest
request(&factory_
);
1973 EXPECT_EQ(OK
, request
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
1974 /*cert_verify_flags=*/0, host_port_pair_
.host(),
1975 "GET", net_log_
, callback_
.callback()));
1977 QuicChromiumClientSession
* session
= QuicStreamFactoryPeer::GetActiveSession(
1978 &factory_
, host_port_pair_
, is_https_
);
1980 scoped_ptr
<QuicHttpStream
> stream
= request
.ReleaseStream();
1981 EXPECT_TRUE(stream
.get());
1982 HttpRequestInfo request_info
;
1983 EXPECT_EQ(OK
, stream
->InitializeStream(&request_info
, DEFAULT_PRIORITY
,
1984 net_log_
, CompletionCallback()));
1987 << "Created 1st session and initialized a stream. Now trigger timeout";
1988 session
->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT
, false);
1989 // Need to spin the loop now to ensure that
1990 // QuicStreamFactory::OnSessionClosed() runs.
1991 base::RunLoop run_loop
;
1992 run_loop
.RunUntilIdle();
1994 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(&factory_
));
1996 QuicStreamFactoryPeer::IsQuicDisabled(&factory_
, host_port_pair_
.port()));
1998 // Test two-in-a-row timeouts with open streams.
1999 DVLOG(1) << "Create 2nd session and timeout with open stream";
2000 TestCompletionCallback callback2
;
2001 QuicStreamRequest
request2(&factory_
);
2002 EXPECT_EQ(OK
, request2
.Request(server2
, is_https_
, privacy_mode_
,
2003 /*cert_verify_flags=*/0, server2
.host(), "GET",
2004 net_log_
, callback2
.callback()));
2005 QuicChromiumClientSession
* session2
=
2006 QuicStreamFactoryPeer::GetActiveSession(&factory_
, server2
, is_https_
);
2008 scoped_ptr
<QuicHttpStream
> stream2
= request2
.ReleaseStream();
2009 EXPECT_TRUE(stream2
.get());
2010 EXPECT_EQ(OK
, stream2
->InitializeStream(&request_info
, DEFAULT_PRIORITY
,
2011 net_log_
, CompletionCallback()));
2013 session2
->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT
, false);
2014 // Need to spin the loop now to ensure that
2015 // QuicStreamFactory::OnSessionClosed() runs.
2016 base::RunLoop run_loop2
;
2017 run_loop2
.RunUntilIdle();
2018 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(&factory_
));
2020 QuicStreamFactoryPeer::IsQuicDisabled(&factory_
, host_port_pair_
.port()));
2021 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS
,
2022 factory_
.QuicDisabledReason(host_port_pair_
.port()));
2024 EXPECT_TRUE(socket_data
.AllReadDataConsumed());
2025 EXPECT_TRUE(socket_data
.AllWriteDataConsumed());
2026 EXPECT_TRUE(socket_data2
.AllReadDataConsumed());
2027 EXPECT_TRUE(socket_data2
.AllWriteDataConsumed());
2030 TEST_P(QuicStreamFactoryTest
, PublicResetPostHandshakeTwoOfThree
) {
2031 factory_
.set_quic_server_info_factory(&quic_server_info_factory_
);
2032 QuicStreamFactoryPeer::SetTaskRunner(&factory_
, runner_
.get());
2033 QuicStreamFactoryPeer::SetDisableDiskCache(&factory_
, true);
2034 QuicStreamFactoryPeer::SetThresholdPublicResetsPostHandshake(&factory_
, 2);
2036 QuicStreamFactoryPeer::IsQuicDisabled(&factory_
, host_port_pair_
.port()));
2037 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
2038 &factory_
, host_port_pair_
.port()));
2040 MockRead reads
[] = {
2041 MockRead(ASYNC
, OK
, 0) // EOF
2043 DeterministicSocketData
socket_data(reads
, arraysize(reads
), nullptr, 0);
2044 socket_factory_
.AddSocketDataProvider(&socket_data
);
2045 socket_data
.StopAfter(1);
2047 DeterministicSocketData
socket_data2(reads
, arraysize(reads
), nullptr, 0);
2048 socket_factory_
.AddSocketDataProvider(&socket_data2
);
2049 socket_data2
.StopAfter(1);
2051 DeterministicSocketData
socket_data3(reads
, arraysize(reads
), nullptr, 0);
2052 socket_factory_
.AddSocketDataProvider(&socket_data3
);
2053 socket_data3
.StopAfter(1);
2055 HostPortPair
server2("mail.example.org", kDefaultServerPort
);
2056 HostPortPair
server3("docs.example.org", kDefaultServerPort
);
2058 crypto_client_stream_factory_
.set_handshake_mode(
2059 MockCryptoClientStream::CONFIRM_HANDSHAKE
);
2060 host_resolver_
.set_synchronous_mode(true);
2061 host_resolver_
.rules()->AddIPLiteralRule(host_port_pair_
.host(),
2063 host_resolver_
.rules()->AddIPLiteralRule(server2
.host(), "192.168.0.1", "");
2064 host_resolver_
.rules()->AddIPLiteralRule(server3
.host(), "192.168.0.1", "");
2066 // Test first and third out of three public reset post handshakes.
2067 QuicStreamRequest
request(&factory_
);
2068 EXPECT_EQ(OK
, request
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
2069 /*cert_verify_flags=*/0, host_port_pair_
.host(),
2070 "GET", net_log_
, callback_
.callback()));
2072 QuicChromiumClientSession
* session
= QuicStreamFactoryPeer::GetActiveSession(
2073 &factory_
, host_port_pair_
, is_https_
);
2075 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
2076 session
->connection()->CloseConnection(QUIC_PUBLIC_RESET
, true);
2077 // Need to spin the loop now to ensure that
2078 // QuicStreamFactory::OnSessionClosed() runs.
2079 base::RunLoop run_loop
;
2080 run_loop
.RunUntilIdle();
2083 QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(&factory_
));
2085 QuicStreamFactoryPeer::IsQuicDisabled(&factory_
, host_port_pair_
.port()));
2087 DVLOG(1) << "Create 2nd session without disable trigger";
2088 TestCompletionCallback callback2
;
2089 QuicStreamRequest
request2(&factory_
);
2090 EXPECT_EQ(OK
, request2
.Request(server2
, is_https_
, privacy_mode_
,
2091 /*cert_verify_flags=*/0, server2
.host(), "GET",
2092 net_log_
, callback2
.callback()));
2093 QuicChromiumClientSession
* session2
=
2094 QuicStreamFactoryPeer::GetActiveSession(&factory_
, server2
, is_https_
);
2096 session2
->connection()->CloseConnection(QUIC_NO_ERROR
, false);
2097 // Need to spin the loop now to ensure that
2098 // QuicStreamFactory::OnSessionClosed() runs.
2099 base::RunLoop run_loop2
;
2100 run_loop2
.RunUntilIdle();
2102 QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(&factory_
));
2104 QuicStreamFactoryPeer::IsQuicDisabled(&factory_
, host_port_pair_
.port()));
2106 DVLOG(1) << "Create 3rd session with public reset post handshake,"
2107 << " will disable QUIC";
2108 TestCompletionCallback callback3
;
2109 QuicStreamRequest
request3(&factory_
);
2110 EXPECT_EQ(OK
, request3
.Request(server3
, is_https_
, privacy_mode_
,
2111 /*cert_verify_flags=*/0, server3
.host(), "GET",
2112 net_log_
, callback3
.callback()));
2113 QuicChromiumClientSession
* session3
=
2114 QuicStreamFactoryPeer::GetActiveSession(&factory_
, server3
, is_https_
);
2116 session3
->connection()->CloseConnection(QUIC_PUBLIC_RESET
, true);
2117 // Need to spin the loop now to ensure that
2118 // QuicStreamFactory::OnSessionClosed() runs.
2119 base::RunLoop run_loop3
;
2120 run_loop3
.RunUntilIdle();
2122 QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(&factory_
));
2124 QuicStreamFactoryPeer::IsQuicDisabled(&factory_
, host_port_pair_
.port()));
2126 QuicChromiumClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE
,
2127 factory_
.QuicDisabledReason(host_port_pair_
.port()));
2129 scoped_ptr
<QuicHttpStream
> stream
= request
.ReleaseStream();
2130 EXPECT_TRUE(stream
.get());
2131 scoped_ptr
<QuicHttpStream
> stream2
= request2
.ReleaseStream();
2132 EXPECT_TRUE(stream2
.get());
2133 scoped_ptr
<QuicHttpStream
> stream3
= request3
.ReleaseStream();
2134 EXPECT_TRUE(stream3
.get());
2136 EXPECT_TRUE(socket_data
.AllReadDataConsumed());
2137 EXPECT_TRUE(socket_data
.AllWriteDataConsumed());
2138 EXPECT_TRUE(socket_data2
.AllReadDataConsumed());
2139 EXPECT_TRUE(socket_data2
.AllWriteDataConsumed());
2140 EXPECT_TRUE(socket_data3
.AllReadDataConsumed());
2141 EXPECT_TRUE(socket_data3
.AllWriteDataConsumed());
2144 TEST_P(QuicStreamFactoryTest
, TimeoutsWithOpenStreamsTwoOfThree
) {
2145 factory_
.set_quic_server_info_factory(&quic_server_info_factory_
);
2146 QuicStreamFactoryPeer::SetTaskRunner(&factory_
, runner_
.get());
2147 QuicStreamFactoryPeer::SetDisableDiskCache(&factory_
, true);
2148 QuicStreamFactoryPeer::SetThresholdTimeoutsWithOpenStreams(&factory_
, 2);
2150 QuicStreamFactoryPeer::IsQuicDisabled(&factory_
, host_port_pair_
.port()));
2151 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
2152 &factory_
, host_port_pair_
.port()));
2154 MockRead reads
[] = {
2155 MockRead(ASYNC
, OK
, 0) // EOF
2157 DeterministicSocketData
socket_data(reads
, arraysize(reads
), nullptr, 0);
2158 socket_factory_
.AddSocketDataProvider(&socket_data
);
2159 socket_data
.StopAfter(1);
2161 // DeterministicSocketData socket_data2(nullptr, 0, nullptr, 0);
2162 DeterministicSocketData
socket_data2(reads
, arraysize(reads
), nullptr, 0);
2163 socket_factory_
.AddSocketDataProvider(&socket_data2
);
2164 socket_data2
.StopAfter(1);
2166 DeterministicSocketData
socket_data3(reads
, arraysize(reads
), nullptr, 0);
2167 socket_factory_
.AddSocketDataProvider(&socket_data3
);
2168 socket_data3
.StopAfter(1);
2170 HostPortPair
server2("mail.example.org", kDefaultServerPort
);
2171 HostPortPair
server3("docs.example.org", kDefaultServerPort
);
2173 crypto_client_stream_factory_
.set_handshake_mode(
2174 MockCryptoClientStream::CONFIRM_HANDSHAKE
);
2175 host_resolver_
.set_synchronous_mode(true);
2176 host_resolver_
.rules()->AddIPLiteralRule(host_port_pair_
.host(),
2178 host_resolver_
.rules()->AddIPLiteralRule(server2
.host(), "192.168.0.1", "");
2179 host_resolver_
.rules()->AddIPLiteralRule(server3
.host(), "192.168.0.1", "");
2181 // Test first and third out of three timeouts with open streams.
2182 QuicStreamRequest
request(&factory_
);
2183 EXPECT_EQ(OK
, request
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
2184 /*cert_verify_flags=*/0, host_port_pair_
.host(),
2185 "GET", net_log_
, callback_
.callback()));
2187 QuicChromiumClientSession
* session
= QuicStreamFactoryPeer::GetActiveSession(
2188 &factory_
, host_port_pair_
, is_https_
);
2190 scoped_ptr
<QuicHttpStream
> stream
= request
.ReleaseStream();
2191 EXPECT_TRUE(stream
.get());
2192 HttpRequestInfo request_info
;
2193 EXPECT_EQ(OK
, stream
->InitializeStream(&request_info
, DEFAULT_PRIORITY
,
2194 net_log_
, CompletionCallback()));
2197 << "Created 1st session and initialized a stream. Now trigger timeout";
2198 session
->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT
, false);
2199 // Need to spin the loop now to ensure that
2200 // QuicStreamFactory::OnSessionClosed() runs.
2201 base::RunLoop run_loop
;
2202 run_loop
.RunUntilIdle();
2204 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(&factory_
));
2206 QuicStreamFactoryPeer::IsQuicDisabled(&factory_
, host_port_pair_
.port()));
2208 // Test two-in-a-row timeouts with open streams.
2209 DVLOG(1) << "Create 2nd session without timeout";
2210 TestCompletionCallback callback2
;
2211 QuicStreamRequest
request2(&factory_
);
2212 EXPECT_EQ(OK
, request2
.Request(server2
, is_https_
, privacy_mode_
,
2213 /*cert_verify_flags=*/0, server2
.host(), "GET",
2214 net_log_
, callback2
.callback()));
2215 QuicChromiumClientSession
* session2
=
2216 QuicStreamFactoryPeer::GetActiveSession(&factory_
, server2
, is_https_
);
2218 session2
->connection()->CloseConnection(QUIC_NO_ERROR
, true);
2219 // Need to spin the loop now to ensure that
2220 // QuicStreamFactory::OnSessionClosed() runs.
2221 base::RunLoop run_loop2
;
2222 run_loop2
.RunUntilIdle();
2223 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(&factory_
));
2225 QuicStreamFactoryPeer::IsQuicDisabled(&factory_
, host_port_pair_
.port()));
2227 DVLOG(1) << "Create 3rd session with timeout with open streams,"
2228 << " will disable QUIC";
2230 TestCompletionCallback callback3
;
2231 QuicStreamRequest
request3(&factory_
);
2232 EXPECT_EQ(OK
, request3
.Request(server3
, is_https_
, privacy_mode_
,
2233 /*cert_verify_flags=*/0, server3
.host(), "GET",
2234 net_log_
, callback3
.callback()));
2235 QuicChromiumClientSession
* session3
=
2236 QuicStreamFactoryPeer::GetActiveSession(&factory_
, server3
, is_https_
);
2238 scoped_ptr
<QuicHttpStream
> stream3
= request3
.ReleaseStream();
2239 EXPECT_TRUE(stream3
.get());
2240 EXPECT_EQ(OK
, stream3
->InitializeStream(&request_info
, DEFAULT_PRIORITY
,
2241 net_log_
, CompletionCallback()));
2242 session3
->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT
, false);
2243 // Need to spin the loop now to ensure that
2244 // QuicStreamFactory::OnSessionClosed() runs.
2245 base::RunLoop run_loop3
;
2246 run_loop3
.RunUntilIdle();
2247 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(&factory_
));
2249 QuicStreamFactoryPeer::IsQuicDisabled(&factory_
, host_port_pair_
.port()));
2250 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS
,
2251 factory_
.QuicDisabledReason(host_port_pair_
.port()));
2253 scoped_ptr
<QuicHttpStream
> stream2
= request2
.ReleaseStream();
2254 EXPECT_TRUE(stream2
.get());
2255 EXPECT_TRUE(socket_data
.AllReadDataConsumed());
2256 EXPECT_TRUE(socket_data
.AllWriteDataConsumed());
2257 EXPECT_TRUE(socket_data2
.AllReadDataConsumed());
2258 EXPECT_TRUE(socket_data2
.AllWriteDataConsumed());
2259 EXPECT_TRUE(socket_data3
.AllReadDataConsumed());
2260 EXPECT_TRUE(socket_data3
.AllWriteDataConsumed());
2263 TEST_P(QuicStreamFactoryTest
, PublicResetPostHandshakeTwoOfFour
) {
2264 factory_
.set_quic_server_info_factory(&quic_server_info_factory_
);
2265 QuicStreamFactoryPeer::SetTaskRunner(&factory_
, runner_
.get());
2266 QuicStreamFactoryPeer::SetDisableDiskCache(&factory_
, true);
2267 QuicStreamFactoryPeer::SetThresholdPublicResetsPostHandshake(&factory_
, 2);
2269 QuicStreamFactoryPeer::IsQuicDisabled(&factory_
, host_port_pair_
.port()));
2270 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
2271 &factory_
, host_port_pair_
.port()));
2273 MockRead reads
[] = {
2274 MockRead(ASYNC
, OK
, 0) // EOF
2276 DeterministicSocketData
socket_data(reads
, arraysize(reads
), nullptr, 0);
2277 socket_factory_
.AddSocketDataProvider(&socket_data
);
2278 socket_data
.StopAfter(1);
2280 DeterministicSocketData
socket_data2(reads
, arraysize(reads
), nullptr, 0);
2281 socket_factory_
.AddSocketDataProvider(&socket_data2
);
2282 socket_data2
.StopAfter(1);
2284 DeterministicSocketData
socket_data3(reads
, arraysize(reads
), nullptr, 0);
2285 socket_factory_
.AddSocketDataProvider(&socket_data3
);
2286 socket_data3
.StopAfter(1);
2288 DeterministicSocketData
socket_data4(reads
, arraysize(reads
), nullptr, 0);
2289 socket_factory_
.AddSocketDataProvider(&socket_data4
);
2290 socket_data4
.StopAfter(1);
2292 HostPortPair
server2("mail.example.org", kDefaultServerPort
);
2293 HostPortPair
server3("docs.example.org", kDefaultServerPort
);
2294 HostPortPair
server4("images.example.org", kDefaultServerPort
);
2296 crypto_client_stream_factory_
.set_handshake_mode(
2297 MockCryptoClientStream::CONFIRM_HANDSHAKE
);
2298 host_resolver_
.set_synchronous_mode(true);
2299 host_resolver_
.rules()->AddIPLiteralRule(host_port_pair_
.host(),
2301 host_resolver_
.rules()->AddIPLiteralRule(server2
.host(), "192.168.0.1", "");
2302 host_resolver_
.rules()->AddIPLiteralRule(server3
.host(), "192.168.0.1", "");
2303 host_resolver_
.rules()->AddIPLiteralRule(server4
.host(), "192.168.0.1", "");
2305 // Test first and fourth out of four public reset post handshakes.
2306 QuicStreamRequest
request(&factory_
);
2307 EXPECT_EQ(OK
, request
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
2308 /*cert_verify_flags=*/0, host_port_pair_
.host(),
2309 "GET", net_log_
, callback_
.callback()));
2311 QuicChromiumClientSession
* session
= QuicStreamFactoryPeer::GetActiveSession(
2312 &factory_
, host_port_pair_
, is_https_
);
2314 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
2315 session
->connection()->CloseConnection(QUIC_PUBLIC_RESET
, true);
2316 // Need to spin the loop now to ensure that
2317 // QuicStreamFactory::OnSessionClosed() runs.
2318 base::RunLoop run_loop
;
2319 run_loop
.RunUntilIdle();
2322 QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(&factory_
));
2324 QuicStreamFactoryPeer::IsQuicDisabled(&factory_
, host_port_pair_
.port()));
2326 DVLOG(1) << "Create 2nd and 3rd sessions without disable trigger";
2327 TestCompletionCallback callback2
;
2328 QuicStreamRequest
request2(&factory_
);
2329 EXPECT_EQ(OK
, request2
.Request(server2
, is_https_
, privacy_mode_
,
2330 /*cert_verify_flags=*/0, server2
.host(), "GET",
2331 net_log_
, callback2
.callback()));
2332 QuicChromiumClientSession
* session2
=
2333 QuicStreamFactoryPeer::GetActiveSession(&factory_
, server2
, is_https_
);
2335 session2
->connection()->CloseConnection(QUIC_NO_ERROR
, false);
2336 // Need to spin the loop now to ensure that
2337 // QuicStreamFactory::OnSessionClosed() runs.
2338 base::RunLoop run_loop2
;
2339 run_loop2
.RunUntilIdle();
2341 QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(&factory_
));
2343 QuicStreamFactoryPeer::IsQuicDisabled(&factory_
, host_port_pair_
.port()));
2345 TestCompletionCallback callback3
;
2346 QuicStreamRequest
request3(&factory_
);
2347 EXPECT_EQ(OK
, request3
.Request(server3
, is_https_
, privacy_mode_
,
2348 /*cert_verify_flags=*/0, server3
.host(), "GET",
2349 net_log_
, callback3
.callback()));
2350 QuicChromiumClientSession
* session3
=
2351 QuicStreamFactoryPeer::GetActiveSession(&factory_
, server3
, is_https_
);
2353 session3
->connection()->CloseConnection(QUIC_NO_ERROR
, false);
2354 // Need to spin the loop now to ensure that
2355 // QuicStreamFactory::OnSessionClosed() runs.
2356 base::RunLoop run_loop3
;
2357 run_loop3
.RunUntilIdle();
2359 QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(&factory_
));
2361 QuicStreamFactoryPeer::IsQuicDisabled(&factory_
, host_port_pair_
.port()));
2363 DVLOG(1) << "Create 4rd session with public reset post handshake,"
2364 << " will not disable QUIC";
2365 TestCompletionCallback callback4
;
2366 QuicStreamRequest
request4(&factory_
);
2367 EXPECT_EQ(OK
, request4
.Request(server4
, is_https_
, privacy_mode_
,
2368 /*cert_verify_flags=*/0, server4
.host(), "GET",
2369 net_log_
, callback4
.callback()));
2370 QuicChromiumClientSession
* session4
=
2371 QuicStreamFactoryPeer::GetActiveSession(&factory_
, server4
, is_https_
);
2373 session4
->connection()->CloseConnection(QUIC_PUBLIC_RESET
, true);
2374 // Need to spin the loop now to ensure that
2375 // QuicStreamFactory::OnSessionClosed() runs.
2376 base::RunLoop run_loop4
;
2377 run_loop4
.RunUntilIdle();
2379 QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(&factory_
));
2381 QuicStreamFactoryPeer::IsQuicDisabled(&factory_
, host_port_pair_
.port()));
2383 scoped_ptr
<QuicHttpStream
> stream
= request
.ReleaseStream();
2384 EXPECT_TRUE(stream
.get());
2385 scoped_ptr
<QuicHttpStream
> stream2
= request2
.ReleaseStream();
2386 EXPECT_TRUE(stream2
.get());
2387 scoped_ptr
<QuicHttpStream
> stream3
= request3
.ReleaseStream();
2388 EXPECT_TRUE(stream3
.get());
2389 scoped_ptr
<QuicHttpStream
> stream4
= request4
.ReleaseStream();
2390 EXPECT_TRUE(stream4
.get());
2392 EXPECT_TRUE(socket_data
.AllReadDataConsumed());
2393 EXPECT_TRUE(socket_data
.AllWriteDataConsumed());
2394 EXPECT_TRUE(socket_data2
.AllReadDataConsumed());
2395 EXPECT_TRUE(socket_data2
.AllWriteDataConsumed());
2396 EXPECT_TRUE(socket_data3
.AllReadDataConsumed());
2397 EXPECT_TRUE(socket_data3
.AllWriteDataConsumed());
2398 EXPECT_TRUE(socket_data4
.AllReadDataConsumed());
2399 EXPECT_TRUE(socket_data4
.AllWriteDataConsumed());
2402 TEST_P(QuicStreamFactoryTest
, TimeoutsWithOpenStreamsTwoOfFour
) {
2403 factory_
.set_quic_server_info_factory(&quic_server_info_factory_
);
2404 QuicStreamFactoryPeer::SetTaskRunner(&factory_
, runner_
.get());
2405 QuicStreamFactoryPeer::SetDisableDiskCache(&factory_
, true);
2406 QuicStreamFactoryPeer::SetThresholdTimeoutsWithOpenStreams(&factory_
, 2);
2408 QuicStreamFactoryPeer::IsQuicDisabled(&factory_
, host_port_pair_
.port()));
2409 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
2410 &factory_
, host_port_pair_
.port()));
2412 MockRead reads
[] = {
2413 MockRead(ASYNC
, OK
, 0) // EOF
2415 DeterministicSocketData
socket_data(reads
, arraysize(reads
), nullptr, 0);
2416 socket_factory_
.AddSocketDataProvider(&socket_data
);
2417 socket_data
.StopAfter(1);
2419 // DeterministicSocketData socket_data2(nullptr, 0, nullptr, 0);
2420 DeterministicSocketData
socket_data2(reads
, arraysize(reads
), nullptr, 0);
2421 socket_factory_
.AddSocketDataProvider(&socket_data2
);
2422 socket_data2
.StopAfter(1);
2424 DeterministicSocketData
socket_data3(reads
, arraysize(reads
), nullptr, 0);
2425 socket_factory_
.AddSocketDataProvider(&socket_data3
);
2426 socket_data3
.StopAfter(1);
2428 DeterministicSocketData
socket_data4(reads
, arraysize(reads
), nullptr, 0);
2429 socket_factory_
.AddSocketDataProvider(&socket_data4
);
2430 socket_data4
.StopAfter(1);
2432 HostPortPair
server2("mail.example.org", kDefaultServerPort
);
2433 HostPortPair
server3("docs.example.org", kDefaultServerPort
);
2434 HostPortPair
server4("images.example.org", kDefaultServerPort
);
2436 crypto_client_stream_factory_
.set_handshake_mode(
2437 MockCryptoClientStream::CONFIRM_HANDSHAKE
);
2438 host_resolver_
.set_synchronous_mode(true);
2439 host_resolver_
.rules()->AddIPLiteralRule(host_port_pair_
.host(),
2441 host_resolver_
.rules()->AddIPLiteralRule(server2
.host(), "192.168.0.1", "");
2442 host_resolver_
.rules()->AddIPLiteralRule(server3
.host(), "192.168.0.1", "");
2443 host_resolver_
.rules()->AddIPLiteralRule(server4
.host(), "192.168.0.1", "");
2445 // Test first and fourth out of three timeouts with open streams.
2446 QuicStreamRequest
request(&factory_
);
2447 EXPECT_EQ(OK
, request
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
2448 /*cert_verify_flags=*/0, host_port_pair_
.host(),
2449 "GET", net_log_
, callback_
.callback()));
2451 QuicChromiumClientSession
* session
= QuicStreamFactoryPeer::GetActiveSession(
2452 &factory_
, host_port_pair_
, is_https_
);
2454 scoped_ptr
<QuicHttpStream
> stream
= request
.ReleaseStream();
2455 EXPECT_TRUE(stream
.get());
2456 HttpRequestInfo request_info
;
2457 EXPECT_EQ(OK
, stream
->InitializeStream(&request_info
, DEFAULT_PRIORITY
,
2458 net_log_
, CompletionCallback()));
2461 << "Created 1st session and initialized a stream. Now trigger timeout";
2462 session
->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT
, false);
2463 // Need to spin the loop now to ensure that
2464 // QuicStreamFactory::OnSessionClosed() runs.
2465 base::RunLoop run_loop
;
2466 run_loop
.RunUntilIdle();
2468 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(&factory_
));
2470 QuicStreamFactoryPeer::IsQuicDisabled(&factory_
, host_port_pair_
.port()));
2472 DVLOG(1) << "Create 2nd and 3rd sessions without timeout";
2473 TestCompletionCallback callback2
;
2474 QuicStreamRequest
request2(&factory_
);
2475 EXPECT_EQ(OK
, request2
.Request(server2
, is_https_
, privacy_mode_
,
2476 /*cert_verify_flags=*/0, server2
.host(), "GET",
2477 net_log_
, callback2
.callback()));
2478 QuicChromiumClientSession
* session2
=
2479 QuicStreamFactoryPeer::GetActiveSession(&factory_
, server2
, is_https_
);
2481 session2
->connection()->CloseConnection(QUIC_NO_ERROR
, true);
2482 // Need to spin the loop now to ensure that
2483 // QuicStreamFactory::OnSessionClosed() runs.
2484 base::RunLoop run_loop2
;
2485 run_loop2
.RunUntilIdle();
2486 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(&factory_
));
2488 QuicStreamFactoryPeer::IsQuicDisabled(&factory_
, host_port_pair_
.port()));
2490 TestCompletionCallback callback3
;
2491 QuicStreamRequest
request3(&factory_
);
2492 EXPECT_EQ(OK
, request3
.Request(server3
, is_https_
, privacy_mode_
,
2493 /*cert_verify_flags=*/0, server3
.host(), "GET",
2494 net_log_
, callback3
.callback()));
2495 QuicChromiumClientSession
* session3
=
2496 QuicStreamFactoryPeer::GetActiveSession(&factory_
, server3
, is_https_
);
2498 session3
->connection()->CloseConnection(QUIC_NO_ERROR
, true);
2499 // Need to spin the loop now to ensure that
2500 // QuicStreamFactory::OnSessionClosed() runs.
2501 base::RunLoop run_loop3
;
2502 run_loop3
.RunUntilIdle();
2503 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(&factory_
));
2505 QuicStreamFactoryPeer::IsQuicDisabled(&factory_
, host_port_pair_
.port()));
2507 DVLOG(1) << "Create 4th session with timeout with open streams,"
2508 << " will not disable QUIC";
2510 TestCompletionCallback callback4
;
2511 QuicStreamRequest
request4(&factory_
);
2512 EXPECT_EQ(OK
, request4
.Request(server4
, is_https_
, privacy_mode_
,
2513 /*cert_verify_flags=*/0, server4
.host(), "GET",
2514 net_log_
, callback4
.callback()));
2515 QuicChromiumClientSession
* session4
=
2516 QuicStreamFactoryPeer::GetActiveSession(&factory_
, server4
, is_https_
);
2518 scoped_ptr
<QuicHttpStream
> stream4
= request4
.ReleaseStream();
2519 EXPECT_TRUE(stream4
.get());
2520 EXPECT_EQ(OK
, stream4
->InitializeStream(&request_info
, DEFAULT_PRIORITY
,
2521 net_log_
, CompletionCallback()));
2522 session4
->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT
, false);
2523 // Need to spin the loop now to ensure that
2524 // QuicStreamFactory::OnSessionClosed() runs.
2525 base::RunLoop run_loop4
;
2526 run_loop4
.RunUntilIdle();
2527 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(&factory_
));
2529 QuicStreamFactoryPeer::IsQuicDisabled(&factory_
, host_port_pair_
.port()));
2531 scoped_ptr
<QuicHttpStream
> stream2
= request2
.ReleaseStream();
2532 EXPECT_TRUE(stream2
.get());
2533 scoped_ptr
<QuicHttpStream
> stream3
= request3
.ReleaseStream();
2534 EXPECT_TRUE(stream3
.get());
2535 EXPECT_TRUE(socket_data
.AllReadDataConsumed());
2536 EXPECT_TRUE(socket_data
.AllWriteDataConsumed());
2537 EXPECT_TRUE(socket_data2
.AllReadDataConsumed());
2538 EXPECT_TRUE(socket_data2
.AllWriteDataConsumed());
2539 EXPECT_TRUE(socket_data3
.AllReadDataConsumed());
2540 EXPECT_TRUE(socket_data3
.AllWriteDataConsumed());
2541 EXPECT_TRUE(socket_data4
.AllReadDataConsumed());
2542 EXPECT_TRUE(socket_data4
.AllWriteDataConsumed());
2545 TEST_P(QuicStreamFactoryTest
, EnableDelayTcpRace
) {
2546 bool delay_tcp_race
= QuicStreamFactoryPeer::GetDelayTcpRace(&factory_
);
2547 QuicStreamFactoryPeer::SetDelayTcpRace(&factory_
, false);
2548 MockRead reads
[] = {
2549 MockRead(ASYNC
, OK
, 0),
2551 DeterministicSocketData
socket_data(reads
, arraysize(reads
), nullptr, 0);
2552 socket_factory_
.AddSocketDataProvider(&socket_data
);
2553 socket_data
.StopAfter(1);
2555 // Set up data in HttpServerProperties.
2556 scoped_ptr
<HttpServerProperties
> http_server_properties(
2557 new HttpServerPropertiesImpl());
2558 QuicStreamFactoryPeer::SetHttpServerProperties(
2559 &factory_
, http_server_properties
->GetWeakPtr());
2561 const AlternativeService
alternative_service1(QUIC
, host_port_pair_
.host(),
2562 host_port_pair_
.port());
2563 AlternativeServiceInfoVector alternative_service_info_vector
;
2564 base::Time expiration
= base::Time::Now() + base::TimeDelta::FromDays(1);
2565 alternative_service_info_vector
.push_back(
2566 AlternativeServiceInfo(alternative_service1
, 1.0, expiration
));
2568 http_server_properties
->SetAlternativeServices(
2569 host_port_pair_
, alternative_service_info_vector
);
2571 ServerNetworkStats stats1
;
2572 stats1
.srtt
= base::TimeDelta::FromMicroseconds(10);
2573 http_server_properties
->SetServerNetworkStats(host_port_pair_
, stats1
);
2575 crypto_client_stream_factory_
.set_handshake_mode(
2576 MockCryptoClientStream::ZERO_RTT
);
2577 host_resolver_
.set_synchronous_mode(true);
2578 host_resolver_
.rules()->AddIPLiteralRule(host_port_pair_
.host(),
2581 QuicStreamRequest
request(&factory_
);
2582 EXPECT_EQ(ERR_IO_PENDING
,
2583 request
.Request(host_port_pair_
, is_https_
, privacy_mode_
,
2584 /*cert_verify_flags=*/0, host_port_pair_
.host(),
2585 "POST", net_log_
, callback_
.callback()));
2587 // If we don't delay TCP connection, then time delay should be 0.
2588 EXPECT_FALSE(factory_
.delay_tcp_race());
2589 EXPECT_EQ(base::TimeDelta(), request
.GetTimeDelayForWaitingJob());
2591 // Enable |delay_tcp_race_| param and verify delay is one RTT and that
2592 // server supports QUIC.
2593 QuicStreamFactoryPeer::SetDelayTcpRace(&factory_
, true);
2594 EXPECT_TRUE(factory_
.delay_tcp_race());
2595 EXPECT_EQ(base::TimeDelta::FromMicroseconds(15),
2596 request
.GetTimeDelayForWaitingJob());
2598 // Confirm the handshake and verify that the stream is created.
2599 crypto_client_stream_factory_
.last_stream()->SendOnCryptoHandshakeEvent(
2600 QuicSession::HANDSHAKE_CONFIRMED
);
2602 EXPECT_EQ(OK
, callback_
.WaitForResult());
2604 scoped_ptr
<QuicHttpStream
> stream
= request
.ReleaseStream();
2605 EXPECT_TRUE(stream
.get());
2606 EXPECT_TRUE(socket_data
.AllReadDataConsumed());
2607 EXPECT_TRUE(socket_data
.AllWriteDataConsumed());
2608 QuicStreamFactoryPeer::SetDelayTcpRace(&factory_
, delay_tcp_race
);
2611 TEST_P(QuicStreamFactoryTest
, QuicSupportedServersAtStartup
) {
2612 factory_
.set_quic_server_info_factory(&quic_server_info_factory_
);
2613 QuicStreamFactoryPeer::SetTaskRunner(&factory_
, runner_
.get());
2615 // Set up data in HttpServerProperties.
2616 scoped_ptr
<HttpServerProperties
> http_server_properties(
2617 new HttpServerPropertiesImpl());
2618 QuicStreamFactoryPeer::SetHttpServerProperties(
2619 &factory_
, http_server_properties
->GetWeakPtr());
2621 const AlternativeService
alternative_service1(QUIC
, host_port_pair_
.host(),
2622 host_port_pair_
.port());
2623 AlternativeServiceInfoVector alternative_service_info_vector
;
2624 base::Time expiration
= base::Time::Now() + base::TimeDelta::FromDays(1);
2625 alternative_service_info_vector
.push_back(
2626 AlternativeServiceInfo(alternative_service1
, 1.0, expiration
));
2628 http_server_properties
->SetAlternativeServices(
2629 host_port_pair_
, alternative_service_info_vector
);
2631 QuicStreamFactoryPeer::InitializeQuicSupportedServersAtStartup(&factory_
);
2633 QuicStreamFactoryPeer::GetQuicSupportedServersAtStartupInitialzied(
2636 QuicStreamFactoryPeer::SupportsQuicAtStartUp(&factory_
, host_port_pair_
));