1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "net/quic/quic_stream_factory.h" 6 7 #include "base/run_loop.h" 8 #include "base/strings/string_util.h" 9 #include "net/base/test_data_directory.h" 10 #include "net/cert/cert_verifier.h" 11 #include "net/dns/mock_host_resolver.h" 12 #include "net/http/http_response_headers.h" 13 #include "net/http/http_response_info.h" 14 #include "net/http/http_util.h" 15 #include "net/http/transport_security_state.h" 16 #include "net/quic/crypto/crypto_handshake.h" 17 #include "net/quic/crypto/proof_verifier_chromium.h" 18 #include "net/quic/crypto/quic_decrypter.h" 19 #include "net/quic/crypto/quic_encrypter.h" 20 #include "net/quic/quic_http_stream.h" 21 #include "net/quic/quic_server_id.h" 22 #include "net/quic/test_tools/mock_clock.h" 23 #include "net/quic/test_tools/mock_crypto_client_stream_factory.h" 24 #include "net/quic/test_tools/mock_random.h" 25 #include "net/quic/test_tools/quic_test_packet_maker.h" 26 #include "net/quic/test_tools/quic_test_utils.h" 27 #include "net/socket/socket_test_util.h" 28 #include "net/test/cert_test_util.h" 29 #include "testing/gtest/include/gtest/gtest.h" 30 31 using base::StringPiece; 32 using std::string; 33 using std::vector; 34 35 namespace net { 36 namespace test { 37 38 namespace { 39 const char kDefaultServerHostName[] = "www.google.com"; 40 const int kDefaultServerPort = 443; 41 } // namespace anonymous 42 43 class QuicStreamFactoryPeer { 44 public: 45 static QuicCryptoClientConfig* GetCryptoConfig(QuicStreamFactory* factory) { 46 return &factory->crypto_config_; 47 } 48 49 static bool HasActiveSession(QuicStreamFactory* factory, 50 const HostPortPair& host_port_pair, 51 bool is_https) { 52 QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED); 53 return factory->HasActiveSession(server_id); 54 } 55 56 static QuicClientSession* GetActiveSession( 57 QuicStreamFactory* factory, 58 const HostPortPair& host_port_pair, 59 bool is_https) { 60 QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED); 61 DCHECK(factory->HasActiveSession(server_id)); 62 return factory->active_sessions_[server_id]; 63 } 64 65 static scoped_ptr<QuicHttpStream> CreateIfSessionExists( 66 QuicStreamFactory* factory, 67 const HostPortPair& host_port_pair, 68 bool is_https, 69 const BoundNetLog& net_log) { 70 QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED); 71 return factory->CreateIfSessionExists(server_id, net_log); 72 } 73 74 static bool IsLiveSession(QuicStreamFactory* factory, 75 QuicClientSession* session) { 76 for (QuicStreamFactory::SessionIdMap::iterator it = 77 factory->all_sessions_.begin(); 78 it != factory->all_sessions_.end(); ++it) { 79 if (it->first == session) 80 return true; 81 } 82 return false; 83 } 84 }; 85 86 class QuicStreamFactoryTest : public ::testing::TestWithParam<QuicVersion> { 87 protected: 88 QuicStreamFactoryTest() 89 : random_generator_(0), 90 maker_(GetParam(), 0), 91 clock_(new MockClock()), 92 cert_verifier_(CertVerifier::CreateDefault()), 93 factory_(&host_resolver_, &socket_factory_, 94 base::WeakPtr<HttpServerProperties>(), cert_verifier_.get(), 95 &transport_security_state_, 96 &crypto_client_stream_factory_, &random_generator_, clock_, 97 kDefaultMaxPacketSize, std::string(), 98 SupportedVersions(GetParam()), true, true, true), 99 host_port_pair_(kDefaultServerHostName, kDefaultServerPort), 100 is_https_(false), 101 privacy_mode_(PRIVACY_MODE_DISABLED) { 102 factory_.set_require_confirmation(false); 103 } 104 105 scoped_ptr<QuicHttpStream> CreateIfSessionExists( 106 const HostPortPair& host_port_pair, 107 const BoundNetLog& net_log) { 108 return QuicStreamFactoryPeer::CreateIfSessionExists( 109 &factory_, host_port_pair, false, net_log_); 110 } 111 112 int GetSourcePortForNewSession(const HostPortPair& destination) { 113 return GetSourcePortForNewSessionInner(destination, false); 114 } 115 116 int GetSourcePortForNewSessionAndGoAway( 117 const HostPortPair& destination) { 118 return GetSourcePortForNewSessionInner(destination, true); 119 } 120 121 int GetSourcePortForNewSessionInner(const HostPortPair& destination, 122 bool goaway_received) { 123 // Should only be called if there is no active session for this destination. 124 EXPECT_EQ(NULL, CreateIfSessionExists(destination, net_log_).get()); 125 size_t socket_count = socket_factory_.udp_client_sockets().size(); 126 127 MockRead reads[] = { 128 MockRead(ASYNC, OK, 0) // EOF 129 }; 130 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); 131 socket_data.StopAfter(1); 132 socket_factory_.AddSocketDataProvider(&socket_data); 133 134 QuicStreamRequest request(&factory_); 135 EXPECT_EQ(ERR_IO_PENDING, 136 request.Request(destination, 137 is_https_, 138 privacy_mode_, 139 "GET", 140 net_log_, 141 callback_.callback())); 142 143 EXPECT_EQ(OK, callback_.WaitForResult()); 144 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 145 EXPECT_TRUE(stream.get()); 146 stream.reset(); 147 148 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession( 149 &factory_, destination, is_https_); 150 151 if (socket_count + 1 != socket_factory_.udp_client_sockets().size()) { 152 EXPECT_TRUE(false); 153 return 0; 154 } 155 156 IPEndPoint endpoint; 157 socket_factory_. 158 udp_client_sockets()[socket_count]->GetLocalAddress(&endpoint); 159 int port = endpoint.port(); 160 if (goaway_received) { 161 QuicGoAwayFrame goaway(QUIC_NO_ERROR, 1, ""); 162 session->OnGoAway(goaway); 163 } 164 165 factory_.OnSessionClosed(session); 166 EXPECT_EQ(NULL, CreateIfSessionExists(destination, net_log_).get()); 167 EXPECT_TRUE(socket_data.at_read_eof()); 168 EXPECT_TRUE(socket_data.at_write_eof()); 169 return port; 170 } 171 172 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket() { 173 QuicStreamId stream_id = kClientDataStreamId1; 174 return maker_.MakeRstPacket( 175 1, true, stream_id, 176 AdjustErrorForVersion(QUIC_RST_FLOW_CONTROL_ACCOUNTING, GetParam())); 177 } 178 179 MockHostResolver host_resolver_; 180 DeterministicMockClientSocketFactory socket_factory_; 181 MockCryptoClientStreamFactory crypto_client_stream_factory_; 182 MockRandom random_generator_; 183 QuicTestPacketMaker maker_; 184 MockClock* clock_; // Owned by factory_. 185 scoped_ptr<CertVerifier> cert_verifier_; 186 TransportSecurityState transport_security_state_; 187 QuicStreamFactory factory_; 188 HostPortPair host_port_pair_; 189 bool is_https_; 190 PrivacyMode privacy_mode_; 191 BoundNetLog net_log_; 192 TestCompletionCallback callback_; 193 }; 194 195 INSTANTIATE_TEST_CASE_P(Version, QuicStreamFactoryTest, 196 ::testing::ValuesIn(QuicSupportedVersions())); 197 198 TEST_P(QuicStreamFactoryTest, CreateIfSessionExists) { 199 EXPECT_EQ(NULL, CreateIfSessionExists(host_port_pair_, net_log_).get()); 200 } 201 202 TEST_P(QuicStreamFactoryTest, Create) { 203 MockRead reads[] = { 204 MockRead(ASYNC, OK, 0) // EOF 205 }; 206 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); 207 socket_factory_.AddSocketDataProvider(&socket_data); 208 socket_data.StopAfter(1); 209 210 QuicStreamRequest request(&factory_); 211 EXPECT_EQ(ERR_IO_PENDING, 212 request.Request(host_port_pair_, 213 is_https_, 214 privacy_mode_, 215 "GET", 216 net_log_, 217 callback_.callback())); 218 219 EXPECT_EQ(OK, callback_.WaitForResult()); 220 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 221 EXPECT_TRUE(stream.get()); 222 223 // Will reset stream 3. 224 stream = CreateIfSessionExists(host_port_pair_, net_log_); 225 EXPECT_TRUE(stream.get()); 226 227 // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result 228 // in streams on different sessions. 229 QuicStreamRequest request2(&factory_); 230 EXPECT_EQ(OK, 231 request2.Request(host_port_pair_, 232 is_https_, 233 privacy_mode_, 234 "GET", 235 net_log_, 236 callback_.callback())); 237 stream = request2.ReleaseStream(); // Will reset stream 5. 238 stream.reset(); // Will reset stream 7. 239 240 EXPECT_TRUE(socket_data.at_read_eof()); 241 EXPECT_TRUE(socket_data.at_write_eof()); 242 } 243 244 TEST_P(QuicStreamFactoryTest, CreateZeroRtt) { 245 MockRead reads[] = { 246 MockRead(ASYNC, OK, 0) // EOF 247 }; 248 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); 249 socket_factory_.AddSocketDataProvider(&socket_data); 250 socket_data.StopAfter(1); 251 252 crypto_client_stream_factory_.set_handshake_mode( 253 MockCryptoClientStream::ZERO_RTT); 254 host_resolver_.set_synchronous_mode(true); 255 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(), 256 "192.168.0.1", ""); 257 258 QuicStreamRequest request(&factory_); 259 EXPECT_EQ(OK, 260 request.Request(host_port_pair_, 261 is_https_, 262 privacy_mode_, 263 "GET", 264 net_log_, 265 callback_.callback())); 266 267 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 268 EXPECT_TRUE(stream.get()); 269 EXPECT_TRUE(socket_data.at_read_eof()); 270 EXPECT_TRUE(socket_data.at_write_eof()); 271 } 272 273 TEST_P(QuicStreamFactoryTest, CreateZeroRttPost) { 274 MockRead reads[] = { 275 MockRead(ASYNC, OK, 0) // EOF 276 }; 277 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); 278 socket_factory_.AddSocketDataProvider(&socket_data); 279 socket_data.StopAfter(1); 280 281 crypto_client_stream_factory_.set_handshake_mode( 282 MockCryptoClientStream::ZERO_RTT); 283 host_resolver_.set_synchronous_mode(true); 284 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(), 285 "192.168.0.1", ""); 286 287 QuicStreamRequest request(&factory_); 288 // Posts require handshake confirmation, so this will return asynchronously. 289 EXPECT_EQ(ERR_IO_PENDING, 290 request.Request(host_port_pair_, 291 is_https_, 292 privacy_mode_, 293 "POST", 294 net_log_, 295 callback_.callback())); 296 297 // Confirm the handshake and verify that the stream is created. 298 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent( 299 QuicSession::HANDSHAKE_CONFIRMED); 300 301 EXPECT_EQ(OK, callback_.WaitForResult()); 302 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 303 EXPECT_TRUE(stream.get()); 304 EXPECT_TRUE(socket_data.at_read_eof()); 305 EXPECT_TRUE(socket_data.at_write_eof()); 306 } 307 308 TEST_P(QuicStreamFactoryTest, CreateHttpVsHttps) { 309 MockRead reads[] = { 310 MockRead(ASYNC, OK, 0) // EOF 311 }; 312 DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0); 313 DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0); 314 socket_factory_.AddSocketDataProvider(&socket_data1); 315 socket_factory_.AddSocketDataProvider(&socket_data2); 316 socket_data1.StopAfter(1); 317 socket_data2.StopAfter(1); 318 319 QuicStreamRequest request(&factory_); 320 EXPECT_EQ(ERR_IO_PENDING, 321 request.Request(host_port_pair_, 322 is_https_, 323 privacy_mode_, 324 "GET", 325 net_log_, 326 callback_.callback())); 327 328 EXPECT_EQ(OK, callback_.WaitForResult()); 329 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 330 EXPECT_TRUE(stream.get()); 331 332 QuicStreamRequest request2(&factory_); 333 EXPECT_EQ(ERR_IO_PENDING, 334 request2.Request(host_port_pair_, 335 !is_https_, 336 privacy_mode_, 337 "GET", 338 net_log_, 339 callback_.callback())); 340 EXPECT_EQ(OK, callback_.WaitForResult()); 341 stream = request2.ReleaseStream(); 342 EXPECT_TRUE(stream.get()); 343 stream.reset(); 344 345 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession( 346 &factory_, host_port_pair_, is_https_), 347 QuicStreamFactoryPeer::GetActiveSession( 348 &factory_, host_port_pair_, !is_https_)); 349 350 EXPECT_TRUE(socket_data1.at_read_eof()); 351 EXPECT_TRUE(socket_data1.at_write_eof()); 352 EXPECT_TRUE(socket_data2.at_read_eof()); 353 EXPECT_TRUE(socket_data2.at_write_eof()); 354 } 355 356 // TODO(rch): re-enable this. 357 TEST_P(QuicStreamFactoryTest, DISABLED_Pooling) { 358 MockRead reads[] = { 359 MockRead(ASYNC, OK, 0) // EOF 360 }; 361 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); 362 socket_factory_.AddSocketDataProvider(&socket_data); 363 socket_data.StopAfter(1); 364 365 HostPortPair server2("mail.google.com", kDefaultServerPort); 366 host_resolver_.set_synchronous_mode(true); 367 host_resolver_.rules()->AddIPLiteralRule( 368 kDefaultServerHostName, "192.168.0.1", ""); 369 host_resolver_.rules()->AddIPLiteralRule( 370 "mail.google.com", "192.168.0.1", ""); 371 372 QuicStreamRequest request(&factory_); 373 EXPECT_EQ(OK, 374 request.Request(host_port_pair_, 375 is_https_, 376 privacy_mode_, 377 "GET", 378 net_log_, 379 callback_.callback())); 380 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 381 EXPECT_TRUE(stream.get()); 382 383 TestCompletionCallback callback; 384 QuicStreamRequest request2(&factory_); 385 EXPECT_EQ(OK, 386 request2.Request(server2, 387 is_https_, 388 privacy_mode_, 389 "GET", 390 net_log_, 391 callback.callback())); 392 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); 393 EXPECT_TRUE(stream2.get()); 394 395 EXPECT_EQ( 396 QuicStreamFactoryPeer::GetActiveSession( 397 &factory_, host_port_pair_, is_https_), 398 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_)); 399 400 EXPECT_TRUE(socket_data.at_read_eof()); 401 EXPECT_TRUE(socket_data.at_write_eof()); 402 } 403 404 TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) { 405 MockRead reads[] = { 406 MockRead(ASYNC, OK, 0) // EOF 407 }; 408 DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0); 409 DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0); 410 socket_factory_.AddSocketDataProvider(&socket_data1); 411 socket_factory_.AddSocketDataProvider(&socket_data2); 412 socket_data1.StopAfter(1); 413 socket_data2.StopAfter(1); 414 415 HostPortPair server2("mail.google.com", kDefaultServerPort); 416 host_resolver_.set_synchronous_mode(true); 417 host_resolver_.rules()->AddIPLiteralRule( 418 kDefaultServerHostName, "192.168.0.1", ""); 419 host_resolver_.rules()->AddIPLiteralRule( 420 "mail.google.com", "192.168.0.1", ""); 421 422 QuicStreamRequest request(&factory_); 423 EXPECT_EQ(OK, 424 request.Request(host_port_pair_, 425 is_https_, 426 privacy_mode_, 427 "GET", 428 net_log_, 429 callback_.callback())); 430 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 431 EXPECT_TRUE(stream.get()); 432 433 TestCompletionCallback callback; 434 QuicStreamRequest request2(&factory_); 435 EXPECT_EQ(OK, 436 request2.Request(server2, 437 is_https_, 438 privacy_mode_, 439 "GET", 440 net_log_, 441 callback.callback())); 442 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); 443 EXPECT_TRUE(stream2.get()); 444 445 factory_.OnSessionGoingAway(QuicStreamFactoryPeer::GetActiveSession( 446 &factory_, host_port_pair_, is_https_)); 447 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession( 448 &factory_, host_port_pair_, is_https_)); 449 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession( 450 &factory_, server2, is_https_)); 451 452 TestCompletionCallback callback3; 453 QuicStreamRequest request3(&factory_); 454 EXPECT_EQ(OK, 455 request3.Request(server2, 456 is_https_, 457 privacy_mode_, 458 "GET", 459 net_log_, 460 callback3.callback())); 461 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream(); 462 EXPECT_TRUE(stream3.get()); 463 464 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession( 465 &factory_, server2, is_https_)); 466 467 EXPECT_TRUE(socket_data1.at_read_eof()); 468 EXPECT_TRUE(socket_data1.at_write_eof()); 469 EXPECT_TRUE(socket_data2.at_read_eof()); 470 EXPECT_TRUE(socket_data2.at_write_eof()); 471 } 472 473 // TODO(rch): re-enable this. 474 TEST_P(QuicStreamFactoryTest, DISABLED_HttpsPooling) { 475 MockRead reads[] = { 476 MockRead(ASYNC, OK, 0) // EOF 477 }; 478 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); 479 socket_factory_.AddSocketDataProvider(&socket_data); 480 socket_data.StopAfter(1); 481 482 HostPortPair server1("www.example.org", 443); 483 HostPortPair server2("mail.example.org", 443); 484 485 // Load a cert that is valid for: 486 // www.example.org (server1) 487 // mail.example.org (server2) 488 // www.example.com 489 base::FilePath certs_dir = GetTestCertsDirectory(); 490 scoped_refptr<X509Certificate> test_cert( 491 ImportCertFromFile(certs_dir, "spdy_pooling.pem")); 492 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert); 493 ProofVerifyDetailsChromium verify_details; 494 verify_details.cert_verify_result.verified_cert = test_cert; 495 crypto_client_stream_factory_.set_proof_verify_details(&verify_details); 496 497 host_resolver_.set_synchronous_mode(true); 498 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", ""); 499 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", ""); 500 501 QuicStreamRequest request(&factory_); 502 is_https_ = true; 503 EXPECT_EQ(OK, 504 request.Request(server1, 505 is_https_, 506 privacy_mode_, 507 "GET", 508 net_log_, 509 callback_.callback())); 510 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 511 EXPECT_TRUE(stream.get()); 512 513 TestCompletionCallback callback; 514 QuicStreamRequest request2(&factory_); 515 EXPECT_EQ(OK, 516 request2.Request(server2, 517 is_https_, 518 privacy_mode_, 519 "GET", 520 net_log_, 521 callback_.callback())); 522 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); 523 EXPECT_TRUE(stream2.get()); 524 525 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession( 526 &factory_, server1, is_https_), 527 QuicStreamFactoryPeer::GetActiveSession( 528 &factory_, server2, is_https_)); 529 530 EXPECT_TRUE(socket_data.at_read_eof()); 531 EXPECT_TRUE(socket_data.at_write_eof()); 532 } 533 534 TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithCertMismatch) { 535 MockRead reads[] = { 536 MockRead(ASYNC, OK, 0) // EOF 537 }; 538 DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0); 539 DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0); 540 socket_factory_.AddSocketDataProvider(&socket_data1); 541 socket_factory_.AddSocketDataProvider(&socket_data2); 542 socket_data1.StopAfter(1); 543 socket_data2.StopAfter(1); 544 545 HostPortPair server1("www.example.org", 443); 546 HostPortPair server2("mail.google.com", 443); 547 548 // Load a cert that is valid for: 549 // www.example.org (server1) 550 // mail.example.org 551 // www.example.com 552 // But is not valid for mail.google.com (server2). 553 base::FilePath certs_dir = GetTestCertsDirectory(); 554 scoped_refptr<X509Certificate> test_cert( 555 ImportCertFromFile(certs_dir, "spdy_pooling.pem")); 556 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert); 557 ProofVerifyDetailsChromium verify_details; 558 verify_details.cert_verify_result.verified_cert = test_cert; 559 crypto_client_stream_factory_.set_proof_verify_details(&verify_details); 560 561 562 host_resolver_.set_synchronous_mode(true); 563 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", ""); 564 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", ""); 565 566 QuicStreamRequest request(&factory_); 567 is_https_ = true; 568 EXPECT_EQ(OK, 569 request.Request(server1, 570 is_https_, 571 privacy_mode_, 572 "GET", 573 net_log_, 574 callback_.callback())); 575 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 576 EXPECT_TRUE(stream.get()); 577 578 TestCompletionCallback callback; 579 QuicStreamRequest request2(&factory_); 580 EXPECT_EQ(OK, 581 request2.Request(server2, 582 is_https_, 583 privacy_mode_, 584 "GET", 585 net_log_, 586 callback_.callback())); 587 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); 588 EXPECT_TRUE(stream2.get()); 589 590 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession( 591 &factory_, server1, is_https_), 592 QuicStreamFactoryPeer::GetActiveSession( 593 &factory_, server2, is_https_)); 594 595 EXPECT_TRUE(socket_data1.at_read_eof()); 596 EXPECT_TRUE(socket_data1.at_write_eof()); 597 EXPECT_TRUE(socket_data2.at_read_eof()); 598 EXPECT_TRUE(socket_data2.at_write_eof()); 599 } 600 601 TEST_P(QuicStreamFactoryTest, Goaway) { 602 MockRead reads[] = { 603 MockRead(ASYNC, OK, 0) // EOF 604 }; 605 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); 606 socket_data.StopAfter(1); 607 socket_factory_.AddSocketDataProvider(&socket_data); 608 DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0); 609 socket_data2.StopAfter(1); 610 socket_factory_.AddSocketDataProvider(&socket_data2); 611 612 QuicStreamRequest request(&factory_); 613 EXPECT_EQ(ERR_IO_PENDING, 614 request.Request(host_port_pair_, 615 is_https_, 616 privacy_mode_, 617 "GET", 618 net_log_, 619 callback_.callback())); 620 621 EXPECT_EQ(OK, callback_.WaitForResult()); 622 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 623 EXPECT_TRUE(stream.get()); 624 625 // Mark the session as going away. Ensure that while it is still alive 626 // that it is no longer active. 627 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession( 628 &factory_, host_port_pair_, is_https_); 629 factory_.OnSessionGoingAway(session); 630 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session)); 631 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession( 632 &factory_, host_port_pair_, is_https_)); 633 EXPECT_EQ(NULL, CreateIfSessionExists(host_port_pair_, net_log_).get()); 634 635 // Create a new request for the same destination and verify that a 636 // new session is created. 637 QuicStreamRequest request2(&factory_); 638 EXPECT_EQ(ERR_IO_PENDING, 639 request2.Request(host_port_pair_, 640 is_https_, 641 privacy_mode_, 642 "GET", 643 net_log_, 644 callback_.callback())); 645 EXPECT_EQ(OK, callback_.WaitForResult()); 646 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); 647 EXPECT_TRUE(stream2.get()); 648 649 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(&factory_, 650 host_port_pair_, 651 is_https_)); 652 EXPECT_NE(session, 653 QuicStreamFactoryPeer::GetActiveSession( 654 &factory_, host_port_pair_, is_https_)); 655 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session)); 656 657 stream2.reset(); 658 stream.reset(); 659 660 EXPECT_TRUE(socket_data.at_read_eof()); 661 EXPECT_TRUE(socket_data.at_write_eof()); 662 EXPECT_TRUE(socket_data2.at_read_eof()); 663 EXPECT_TRUE(socket_data2.at_write_eof()); 664 } 665 666 TEST_P(QuicStreamFactoryTest, MaxOpenStream) { 667 MockRead reads[] = { 668 MockRead(ASYNC, OK, 0) // EOF 669 }; 670 QuicStreamId stream_id = kClientDataStreamId1; 671 scoped_ptr<QuicEncryptedPacket> rst( 672 maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_CANCELLED)); 673 MockWrite writes[] = { 674 MockWrite(ASYNC, rst->data(), rst->length(), 1), 675 }; 676 DeterministicSocketData socket_data(reads, arraysize(reads), 677 writes, arraysize(writes)); 678 socket_factory_.AddSocketDataProvider(&socket_data); 679 socket_data.StopAfter(1); 680 681 HttpRequestInfo request_info; 682 std::vector<QuicHttpStream*> streams; 683 // The MockCryptoClientStream sets max_open_streams to be 684 // 2 * kDefaultMaxStreamsPerConnection. 685 for (size_t i = 0; i < 2 * kDefaultMaxStreamsPerConnection; i++) { 686 QuicStreamRequest request(&factory_); 687 int rv = request.Request(host_port_pair_, 688 is_https_, 689 privacy_mode_, 690 "GET", 691 net_log_, 692 callback_.callback()); 693 if (i == 0) { 694 EXPECT_EQ(ERR_IO_PENDING, rv); 695 EXPECT_EQ(OK, callback_.WaitForResult()); 696 } else { 697 EXPECT_EQ(OK, rv); 698 } 699 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 700 EXPECT_TRUE(stream); 701 EXPECT_EQ(OK, stream->InitializeStream( 702 &request_info, DEFAULT_PRIORITY, net_log_, CompletionCallback())); 703 streams.push_back(stream.release()); 704 } 705 706 QuicStreamRequest request(&factory_); 707 EXPECT_EQ(OK, 708 request.Request(host_port_pair_, 709 is_https_, 710 privacy_mode_, 711 "GET", 712 net_log_, 713 CompletionCallback())); 714 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 715 EXPECT_TRUE(stream); 716 EXPECT_EQ(ERR_IO_PENDING, stream->InitializeStream( 717 &request_info, DEFAULT_PRIORITY, net_log_, callback_.callback())); 718 719 // Close the first stream. 720 streams.front()->Close(false); 721 722 ASSERT_TRUE(callback_.have_result()); 723 724 EXPECT_EQ(OK, callback_.WaitForResult()); 725 726 EXPECT_TRUE(socket_data.at_read_eof()); 727 EXPECT_TRUE(socket_data.at_write_eof()); 728 STLDeleteElements(&streams); 729 } 730 731 TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) { 732 DeterministicSocketData socket_data(NULL, 0, NULL, 0); 733 socket_factory_.AddSocketDataProvider(&socket_data); 734 735 host_resolver_.rules()->AddSimulatedFailure(kDefaultServerHostName); 736 737 QuicStreamRequest request(&factory_); 738 EXPECT_EQ(ERR_IO_PENDING, 739 request.Request(host_port_pair_, 740 is_https_, 741 privacy_mode_, 742 "GET", 743 net_log_, 744 callback_.callback())); 745 746 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult()); 747 748 EXPECT_TRUE(socket_data.at_read_eof()); 749 EXPECT_TRUE(socket_data.at_write_eof()); 750 } 751 752 TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) { 753 MockConnect connect(SYNCHRONOUS, ERR_ADDRESS_IN_USE); 754 DeterministicSocketData socket_data(NULL, 0, NULL, 0); 755 socket_data.set_connect_data(connect); 756 socket_factory_.AddSocketDataProvider(&socket_data); 757 socket_data.StopAfter(1); 758 759 QuicStreamRequest request(&factory_); 760 EXPECT_EQ(ERR_IO_PENDING, 761 request.Request(host_port_pair_, 762 is_https_, 763 privacy_mode_, 764 "GET", 765 net_log_, 766 callback_.callback())); 767 768 EXPECT_EQ(ERR_ADDRESS_IN_USE, callback_.WaitForResult()); 769 770 EXPECT_TRUE(socket_data.at_read_eof()); 771 EXPECT_TRUE(socket_data.at_write_eof()); 772 } 773 774 TEST_P(QuicStreamFactoryTest, CancelCreate) { 775 MockRead reads[] = { 776 MockRead(ASYNC, OK, 0) // EOF 777 }; 778 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); 779 socket_factory_.AddSocketDataProvider(&socket_data); 780 { 781 QuicStreamRequest request(&factory_); 782 EXPECT_EQ(ERR_IO_PENDING, 783 request.Request(host_port_pair_, 784 is_https_, 785 privacy_mode_, 786 "GET", 787 net_log_, 788 callback_.callback())); 789 } 790 791 socket_data.StopAfter(1); 792 base::RunLoop run_loop; 793 run_loop.RunUntilIdle(); 794 795 scoped_ptr<QuicHttpStream> stream( 796 CreateIfSessionExists(host_port_pair_, net_log_)); 797 EXPECT_TRUE(stream.get()); 798 stream.reset(); 799 800 EXPECT_TRUE(socket_data.at_read_eof()); 801 EXPECT_TRUE(socket_data.at_write_eof()); 802 } 803 804 TEST_P(QuicStreamFactoryTest, CreateConsistentEphemeralPort) { 805 // Sequentially connect to the default host, then another host, and then the 806 // default host. Verify that the default host gets a consistent ephemeral 807 // port, that is different from the other host's connection. 808 809 std::string other_server_name = "other.google.com"; 810 EXPECT_NE(kDefaultServerHostName, other_server_name); 811 HostPortPair host_port_pair2(other_server_name, kDefaultServerPort); 812 813 int original_port = GetSourcePortForNewSession(host_port_pair_); 814 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair2)); 815 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_)); 816 } 817 818 TEST_P(QuicStreamFactoryTest, GoAwayDisablesConsistentEphemeralPort) { 819 // Get a session to the host using the port suggester. 820 int original_port = 821 GetSourcePortForNewSessionAndGoAway(host_port_pair_); 822 // Verify that the port is different after the goaway. 823 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair_)); 824 // Since the previous session did not goaway we should see the original port. 825 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_)); 826 } 827 828 TEST_P(QuicStreamFactoryTest, CloseAllSessions) { 829 MockRead reads[] = { 830 MockRead(ASYNC, 0, 0) // EOF 831 }; 832 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket()); 833 std::vector<MockWrite> writes; 834 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1)); 835 DeterministicSocketData socket_data(reads, arraysize(reads), 836 writes.empty() ? NULL : &writes[0], 837 writes.size()); 838 socket_factory_.AddSocketDataProvider(&socket_data); 839 socket_data.StopAfter(1); 840 841 MockRead reads2[] = { 842 MockRead(ASYNC, 0, 0) // EOF 843 }; 844 DeterministicSocketData socket_data2(reads2, arraysize(reads2), NULL, 0); 845 socket_factory_.AddSocketDataProvider(&socket_data2); 846 socket_data2.StopAfter(1); 847 848 QuicStreamRequest request(&factory_); 849 EXPECT_EQ(ERR_IO_PENDING, 850 request.Request(host_port_pair_, 851 is_https_, 852 privacy_mode_, 853 "GET", 854 net_log_, 855 callback_.callback())); 856 857 EXPECT_EQ(OK, callback_.WaitForResult()); 858 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 859 HttpRequestInfo request_info; 860 EXPECT_EQ(OK, stream->InitializeStream(&request_info, 861 DEFAULT_PRIORITY, 862 net_log_, CompletionCallback())); 863 864 // Close the session and verify that stream saw the error. 865 factory_.CloseAllSessions(ERR_INTERNET_DISCONNECTED); 866 EXPECT_EQ(ERR_INTERNET_DISCONNECTED, 867 stream->ReadResponseHeaders(callback_.callback())); 868 869 // Now attempting to request a stream to the same origin should create 870 // a new session. 871 872 QuicStreamRequest request2(&factory_); 873 EXPECT_EQ(ERR_IO_PENDING, 874 request2.Request(host_port_pair_, 875 is_https_, 876 privacy_mode_, 877 "GET", 878 net_log_, 879 callback_.callback())); 880 881 EXPECT_EQ(OK, callback_.WaitForResult()); 882 stream = request2.ReleaseStream(); 883 stream.reset(); // Will reset stream 3. 884 885 EXPECT_TRUE(socket_data.at_read_eof()); 886 EXPECT_TRUE(socket_data.at_write_eof()); 887 EXPECT_TRUE(socket_data2.at_read_eof()); 888 EXPECT_TRUE(socket_data2.at_write_eof()); 889 } 890 891 TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) { 892 MockRead reads[] = { 893 MockRead(ASYNC, 0, 0) // EOF 894 }; 895 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket()); 896 std::vector<MockWrite> writes; 897 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1)); 898 DeterministicSocketData socket_data(reads, arraysize(reads), 899 writes.empty() ? NULL : &writes[0], 900 writes.size()); 901 socket_factory_.AddSocketDataProvider(&socket_data); 902 socket_data.StopAfter(1); 903 904 MockRead reads2[] = { 905 MockRead(ASYNC, 0, 0) // EOF 906 }; 907 DeterministicSocketData socket_data2(reads2, arraysize(reads2), NULL, 0); 908 socket_factory_.AddSocketDataProvider(&socket_data2); 909 socket_data2.StopAfter(1); 910 911 QuicStreamRequest request(&factory_); 912 EXPECT_EQ(ERR_IO_PENDING, 913 request.Request(host_port_pair_, 914 is_https_, 915 privacy_mode_, 916 "GET", 917 net_log_, 918 callback_.callback())); 919 920 EXPECT_EQ(OK, callback_.WaitForResult()); 921 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 922 HttpRequestInfo request_info; 923 EXPECT_EQ(OK, stream->InitializeStream(&request_info, 924 DEFAULT_PRIORITY, 925 net_log_, CompletionCallback())); 926 927 // Change the IP address and verify that stream saw the error. 928 factory_.OnIPAddressChanged(); 929 EXPECT_EQ(ERR_NETWORK_CHANGED, 930 stream->ReadResponseHeaders(callback_.callback())); 931 EXPECT_TRUE(factory_.require_confirmation()); 932 933 // Now attempting to request a stream to the same origin should create 934 // a new session. 935 936 QuicStreamRequest request2(&factory_); 937 EXPECT_EQ(ERR_IO_PENDING, 938 request2.Request(host_port_pair_, 939 is_https_, 940 privacy_mode_, 941 "GET", 942 net_log_, 943 callback_.callback())); 944 945 EXPECT_EQ(OK, callback_.WaitForResult()); 946 stream = request2.ReleaseStream(); 947 stream.reset(); // Will reset stream 3. 948 949 EXPECT_TRUE(socket_data.at_read_eof()); 950 EXPECT_TRUE(socket_data.at_write_eof()); 951 EXPECT_TRUE(socket_data2.at_read_eof()); 952 EXPECT_TRUE(socket_data2.at_write_eof()); 953 } 954 955 TEST_P(QuicStreamFactoryTest, OnCertAdded) { 956 MockRead reads[] = { 957 MockRead(ASYNC, 0, 0) // EOF 958 }; 959 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket()); 960 std::vector<MockWrite> writes; 961 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1)); 962 DeterministicSocketData socket_data(reads, arraysize(reads), 963 writes.empty() ? NULL : &writes[0], 964 writes.size()); 965 socket_factory_.AddSocketDataProvider(&socket_data); 966 socket_data.StopAfter(1); 967 968 MockRead reads2[] = { 969 MockRead(ASYNC, 0, 0) // EOF 970 }; 971 DeterministicSocketData socket_data2(reads2, arraysize(reads2), NULL, 0); 972 socket_factory_.AddSocketDataProvider(&socket_data2); 973 socket_data2.StopAfter(1); 974 975 QuicStreamRequest request(&factory_); 976 EXPECT_EQ(ERR_IO_PENDING, 977 request.Request(host_port_pair_, 978 is_https_, 979 privacy_mode_, 980 "GET", 981 net_log_, 982 callback_.callback())); 983 984 EXPECT_EQ(OK, callback_.WaitForResult()); 985 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 986 HttpRequestInfo request_info; 987 EXPECT_EQ(OK, stream->InitializeStream(&request_info, 988 DEFAULT_PRIORITY, 989 net_log_, CompletionCallback())); 990 991 // Add a cert and verify that stream saw the event. 992 factory_.OnCertAdded(NULL); 993 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED, 994 stream->ReadResponseHeaders(callback_.callback())); 995 EXPECT_FALSE(factory_.require_confirmation()); 996 997 // Now attempting to request a stream to the same origin should create 998 // a new session. 999 1000 QuicStreamRequest request2(&factory_); 1001 EXPECT_EQ(ERR_IO_PENDING, 1002 request2.Request(host_port_pair_, 1003 is_https_, 1004 privacy_mode_, 1005 "GET", 1006 net_log_, 1007 callback_.callback())); 1008 1009 EXPECT_EQ(OK, callback_.WaitForResult()); 1010 stream = request2.ReleaseStream(); 1011 stream.reset(); // Will reset stream 3. 1012 1013 EXPECT_TRUE(socket_data.at_read_eof()); 1014 EXPECT_TRUE(socket_data.at_write_eof()); 1015 EXPECT_TRUE(socket_data2.at_read_eof()); 1016 EXPECT_TRUE(socket_data2.at_write_eof()); 1017 } 1018 1019 TEST_P(QuicStreamFactoryTest, OnCACertChanged) { 1020 MockRead reads[] = { 1021 MockRead(ASYNC, 0, 0) // EOF 1022 }; 1023 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket()); 1024 std::vector<MockWrite> writes; 1025 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1)); 1026 DeterministicSocketData socket_data(reads, arraysize(reads), 1027 writes.empty() ? NULL : &writes[0], 1028 writes.size()); 1029 socket_factory_.AddSocketDataProvider(&socket_data); 1030 socket_data.StopAfter(1); 1031 1032 MockRead reads2[] = { 1033 MockRead(ASYNC, 0, 0) // EOF 1034 }; 1035 DeterministicSocketData socket_data2(reads2, arraysize(reads2), NULL, 0); 1036 socket_factory_.AddSocketDataProvider(&socket_data2); 1037 socket_data2.StopAfter(1); 1038 1039 QuicStreamRequest request(&factory_); 1040 EXPECT_EQ(ERR_IO_PENDING, 1041 request.Request(host_port_pair_, 1042 is_https_, 1043 privacy_mode_, 1044 "GET", 1045 net_log_, 1046 callback_.callback())); 1047 1048 EXPECT_EQ(OK, callback_.WaitForResult()); 1049 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 1050 HttpRequestInfo request_info; 1051 EXPECT_EQ(OK, stream->InitializeStream(&request_info, 1052 DEFAULT_PRIORITY, 1053 net_log_, CompletionCallback())); 1054 1055 // Change the CA cert and verify that stream saw the event. 1056 factory_.OnCACertChanged(NULL); 1057 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED, 1058 stream->ReadResponseHeaders(callback_.callback())); 1059 EXPECT_FALSE(factory_.require_confirmation()); 1060 1061 // Now attempting to request a stream to the same origin should create 1062 // a new session. 1063 1064 QuicStreamRequest request2(&factory_); 1065 EXPECT_EQ(ERR_IO_PENDING, 1066 request2.Request(host_port_pair_, 1067 is_https_, 1068 privacy_mode_, 1069 "GET", 1070 net_log_, 1071 callback_.callback())); 1072 1073 EXPECT_EQ(OK, callback_.WaitForResult()); 1074 stream = request2.ReleaseStream(); 1075 stream.reset(); // Will reset stream 3. 1076 1077 EXPECT_TRUE(socket_data.at_read_eof()); 1078 EXPECT_TRUE(socket_data.at_write_eof()); 1079 EXPECT_TRUE(socket_data2.at_read_eof()); 1080 EXPECT_TRUE(socket_data2.at_write_eof()); 1081 } 1082 1083 TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) { 1084 vector<string> cannoncial_suffixes; 1085 cannoncial_suffixes.push_back(string(".c.youtube.com")); 1086 cannoncial_suffixes.push_back(string(".googlevideo.com")); 1087 1088 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) { 1089 string r1_host_name("r1"); 1090 string r2_host_name("r2"); 1091 r1_host_name.append(cannoncial_suffixes[i]); 1092 r2_host_name.append(cannoncial_suffixes[i]); 1093 1094 HostPortPair host_port_pair1(r1_host_name, 80); 1095 QuicCryptoClientConfig* crypto_config = 1096 QuicStreamFactoryPeer::GetCryptoConfig(&factory_); 1097 QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_); 1098 QuicCryptoClientConfig::CachedState* cached1 = 1099 crypto_config->LookupOrCreate(server_id1); 1100 EXPECT_FALSE(cached1->proof_valid()); 1101 EXPECT_TRUE(cached1->source_address_token().empty()); 1102 1103 // Mutate the cached1 to have different data. 1104 // TODO(rtenneti): mutate other members of CachedState. 1105 cached1->set_source_address_token(r1_host_name); 1106 cached1->SetProofValid(); 1107 1108 HostPortPair host_port_pair2(r2_host_name, 80); 1109 QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_); 1110 QuicCryptoClientConfig::CachedState* cached2 = 1111 crypto_config->LookupOrCreate(server_id2); 1112 EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token()); 1113 EXPECT_TRUE(cached2->proof_valid()); 1114 } 1115 } 1116 1117 TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) { 1118 vector<string> cannoncial_suffixes; 1119 cannoncial_suffixes.push_back(string(".c.youtube.com")); 1120 cannoncial_suffixes.push_back(string(".googlevideo.com")); 1121 1122 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) { 1123 string r3_host_name("r3"); 1124 string r4_host_name("r4"); 1125 r3_host_name.append(cannoncial_suffixes[i]); 1126 r4_host_name.append(cannoncial_suffixes[i]); 1127 1128 HostPortPair host_port_pair1(r3_host_name, 80); 1129 QuicCryptoClientConfig* crypto_config = 1130 QuicStreamFactoryPeer::GetCryptoConfig(&factory_); 1131 QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_); 1132 QuicCryptoClientConfig::CachedState* cached1 = 1133 crypto_config->LookupOrCreate(server_id1); 1134 EXPECT_FALSE(cached1->proof_valid()); 1135 EXPECT_TRUE(cached1->source_address_token().empty()); 1136 1137 // Mutate the cached1 to have different data. 1138 // TODO(rtenneti): mutate other members of CachedState. 1139 cached1->set_source_address_token(r3_host_name); 1140 cached1->SetProofInvalid(); 1141 1142 HostPortPair host_port_pair2(r4_host_name, 80); 1143 QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_); 1144 QuicCryptoClientConfig::CachedState* cached2 = 1145 crypto_config->LookupOrCreate(server_id2); 1146 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token()); 1147 EXPECT_TRUE(cached2->source_address_token().empty()); 1148 EXPECT_FALSE(cached2->proof_valid()); 1149 } 1150 } 1151 1152 } // namespace test 1153 } // namespace net 1154