OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/quic/chromium/quic_stream_factory.h" | 5 #include "net/quic/chromium/quic_stream_factory.h" |
6 | 6 |
7 #include <ostream> | 7 #include <ostream> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 494 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
505 std::move(headers), &spdy_headers_frame_len); | 505 std::move(headers), &spdy_headers_frame_len); |
506 } | 506 } |
507 | 507 |
508 // Helper method for server migration tests. | 508 // Helper method for server migration tests. |
509 void VerifyServerMigration(QuicConfig& config, IPEndPoint expected_address) { | 509 void VerifyServerMigration(QuicConfig& config, IPEndPoint expected_address) { |
510 allow_server_migration_ = true; | 510 allow_server_migration_ = true; |
511 Initialize(); | 511 Initialize(); |
512 | 512 |
513 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); | 513 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
514 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 514 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
515 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | |
516 | |
517 crypto_client_stream_factory_.SetConfig(config); | 515 crypto_client_stream_factory_.SetConfig(config); |
518 | 516 |
519 // Set up first socket data provider. | 517 // Set up first socket data provider. |
520 MockRead reads1[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; | 518 MockRead reads1[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; |
521 SequencedSocketData socket_data1(reads1, arraysize(reads1), nullptr, 0); | 519 SequencedSocketData socket_data1(reads1, arraysize(reads1), nullptr, 0); |
522 socket_factory_.AddSocketDataProvider(&socket_data1); | 520 socket_factory_.AddSocketDataProvider(&socket_data1); |
523 | 521 |
524 // Set up second socket data provider that is used after | 522 // Set up second socket data provider that is used after migration. |
525 // migration. | 523 std::unique_ptr<QuicEncryptedPacket> sendping( |
526 std::unique_ptr<QuicEncryptedPacket> ping( | |
527 client_maker_.MakePingPacket(1, /*include_version=*/true)); | 524 client_maker_.MakePingPacket(1, /*include_version=*/true)); |
528 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket( | 525 std::unique_ptr<QuicEncryptedPacket> client_rst( |
529 2, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED)); | 526 client_maker_.MakeAckAndRstPacket(2, false, kClientDataStreamId1, |
| 527 QUIC_STREAM_CANCELLED, 1, 1, 1, |
| 528 true)); |
530 MockWrite writes2[] = { | 529 MockWrite writes2[] = { |
531 MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 1), | 530 MockWrite(SYNCHRONOUS, sendping->data(), sendping->length(), 0), |
532 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 2)}; | 531 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 3)}; |
533 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; | 532 std::unique_ptr<QuicEncryptedPacket> recvping( |
| 533 client_maker_.MakePingPacket(1, /*include_version=*/false)); |
| 534 MockRead reads2[] = { |
| 535 MockRead(ASYNC, recvping->data(), recvping->length(), 1), |
| 536 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)}; |
534 SequencedSocketData socket_data2(reads2, arraysize(reads2), writes2, | 537 SequencedSocketData socket_data2(reads2, arraysize(reads2), writes2, |
535 arraysize(writes2)); | 538 arraysize(writes2)); |
536 socket_factory_.AddSocketDataProvider(&socket_data2); | 539 socket_factory_.AddSocketDataProvider(&socket_data2); |
537 | 540 |
538 // Create request and QuicHttpStream. | 541 // Create request and QuicHttpStream. |
539 QuicStreamRequest request(factory_.get()); | 542 QuicStreamRequest request(factory_.get()); |
540 EXPECT_EQ(ERR_IO_PENDING, | 543 EXPECT_EQ(ERR_IO_PENDING, |
541 request.Request(host_port_pair_, privacy_mode_, | 544 request.Request(host_port_pair_, privacy_mode_, |
542 /*cert_verify_flags=*/0, url_, "GET", net_log_, | 545 /*cert_verify_flags=*/0, url_, "GET", net_log_, |
543 callback_.callback())); | 546 callback_.callback())); |
544 EXPECT_EQ(OK, callback_.WaitForResult()); | 547 EXPECT_EQ(OK, callback_.WaitForResult()); |
545 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); | 548 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); |
546 EXPECT_TRUE(stream.get()); | 549 EXPECT_TRUE(stream.get()); |
547 | 550 |
548 // Cause QUIC stream to be created. | 551 // Cause QUIC stream to be created. |
549 HttpRequestInfo request_info; | 552 HttpRequestInfo request_info; |
550 request_info.method = "GET"; | 553 request_info.method = "GET"; |
551 request_info.url = GURL("https://www.example.org/"); | 554 request_info.url = GURL("https://www.example.org/"); |
552 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, | 555 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, |
553 net_log_, CompletionCallback())); | 556 net_log_, CompletionCallback())); |
554 | |
555 // Ensure that session is alive and active. | 557 // Ensure that session is alive and active. |
556 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); | 558 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); |
557 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | 559 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
558 EXPECT_TRUE(HasActiveSession(host_port_pair_)); | 560 EXPECT_TRUE(HasActiveSession(host_port_pair_)); |
559 | 561 |
560 IPEndPoint actual_address; | 562 IPEndPoint actual_address; |
561 session->GetDefaultSocket()->GetPeerAddress(&actual_address); | 563 session->GetDefaultSocket()->GetPeerAddress(&actual_address); |
562 EXPECT_EQ(actual_address, expected_address); | 564 EXPECT_EQ(actual_address, expected_address); |
563 DVLOG(1) << "Socket connected to: " << actual_address.address().ToString() | 565 DVLOG(1) << "Socket connected to: " << actual_address.address().ToString() |
564 << " " << actual_address.port(); | 566 << " " << actual_address.port(); |
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
822 net_log_, callback.callback())); | 824 net_log_, callback.callback())); |
823 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream(); | 825 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream(); |
824 EXPECT_TRUE(stream2.get()); | 826 EXPECT_TRUE(stream2.get()); |
825 | 827 |
826 EXPECT_EQ(GetActiveSession(host_port_pair_), GetActiveSession(server2)); | 828 EXPECT_EQ(GetActiveSession(host_port_pair_), GetActiveSession(server2)); |
827 | 829 |
828 EXPECT_TRUE(socket_data.AllReadDataConsumed()); | 830 EXPECT_TRUE(socket_data.AllReadDataConsumed()); |
829 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); | 831 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); |
830 } | 832 } |
831 | 833 |
| 834 TEST_P(QuicStreamFactoryTest, PoolingWithServerMigration) { |
| 835 // Set up session to migrate. |
| 836 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(), |
| 837 "192.168.0.1", ""); |
| 838 IPEndPoint alt_address = IPEndPoint(IPAddress(1, 2, 3, 4), 443); |
| 839 QuicConfig config; |
| 840 config.SetAlternateServerAddressToSend(alt_address); |
| 841 |
| 842 VerifyServerMigration(config, alt_address); |
| 843 |
| 844 // Close server-migrated session. |
| 845 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); |
| 846 session->CloseSessionOnError(0u, QUIC_NO_ERROR); |
| 847 |
| 848 // Set up server IP, socket, proof, and config for new session. |
| 849 HostPortPair server2(kServer2HostName, kDefaultServerPort); |
| 850 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", ""); |
| 851 |
| 852 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; |
| 853 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0); |
| 854 socket_factory_.AddSocketDataProvider(&socket_data); |
| 855 |
| 856 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
| 857 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
| 858 QuicConfig config2; |
| 859 crypto_client_stream_factory_.SetConfig(config2); |
| 860 |
| 861 // Create new request to cause new session creation. |
| 862 TestCompletionCallback callback; |
| 863 QuicStreamRequest request2(factory_.get()); |
| 864 EXPECT_EQ(ERR_IO_PENDING, |
| 865 request2.Request(server2, privacy_mode_, |
| 866 /*cert_verify_flags=*/0, url2_, "GET", net_log_, |
| 867 callback.callback())); |
| 868 EXPECT_EQ(OK, callback.WaitForResult()); |
| 869 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream(); |
| 870 EXPECT_TRUE(stream2.get()); |
| 871 |
| 872 EXPECT_TRUE(socket_data.AllReadDataConsumed()); |
| 873 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); |
| 874 // EXPECT_EQ(GetActiveSession(host_port_pair_), GetActiveSession(server2)); |
| 875 } |
| 876 |
832 TEST_P(QuicStreamFactoryTest, NoPoolingIfDisabled) { | 877 TEST_P(QuicStreamFactoryTest, NoPoolingIfDisabled) { |
833 disable_connection_pooling_ = true; | 878 disable_connection_pooling_ = true; |
834 Initialize(); | 879 Initialize(); |
835 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); | 880 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
836 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 881 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
837 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 882 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
838 | 883 |
839 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; | 884 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; |
840 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0); | 885 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0); |
841 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0); | 886 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0); |
(...skipping 4336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5178 // Clear all cached states. | 5223 // Clear all cached states. |
5179 factory_->ClearCachedStatesInCryptoConfig( | 5224 factory_->ClearCachedStatesInCryptoConfig( |
5180 base::Callback<bool(const GURL&)>()); | 5225 base::Callback<bool(const GURL&)>()); |
5181 EXPECT_TRUE(test_cases[0].state->certs().empty()); | 5226 EXPECT_TRUE(test_cases[0].state->certs().empty()); |
5182 EXPECT_TRUE(test_cases[1].state->certs().empty()); | 5227 EXPECT_TRUE(test_cases[1].state->certs().empty()); |
5183 EXPECT_TRUE(test_cases[2].state->certs().empty()); | 5228 EXPECT_TRUE(test_cases[2].state->certs().empty()); |
5184 } | 5229 } |
5185 | 5230 |
5186 } // namespace test | 5231 } // namespace test |
5187 } // namespace net | 5232 } // namespace net |
OLD | NEW |