Chromium Code Reviews| 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 489 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 500 << " " << actual_address.port(); | 500 << " " << actual_address.port(); |
| 501 DVLOG(1) << "Expected address: " << expected_address.address().ToString() | 501 DVLOG(1) << "Expected address: " << expected_address.address().ToString() |
| 502 << " " << expected_address.port(); | 502 << " " << expected_address.port(); |
| 503 | 503 |
| 504 stream.reset(); | 504 stream.reset(); |
| 505 EXPECT_TRUE(socket_data1.AllReadDataConsumed()); | 505 EXPECT_TRUE(socket_data1.AllReadDataConsumed()); |
| 506 EXPECT_TRUE(socket_data2.AllReadDataConsumed()); | 506 EXPECT_TRUE(socket_data2.AllReadDataConsumed()); |
| 507 EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); | 507 EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); |
| 508 } | 508 } |
| 509 | 509 |
| 510 void RunTestLoopUntilIdle() { | |
| 511 while (runner_->GetPostedTasks().size() > 0) | |
|
Ryan Hamilton
2016/09/12 03:42:01
nit: instead of size() > 0, !empty()
Ryan Hamilton
2016/09/13 00:33:18
ping
Jana
2016/09/13 01:12:18
Done.
| |
| 512 runner_->RunNextTask(); | |
| 513 } | |
| 514 | |
| 510 // Helper methods for tests of connection migration on write error. | 515 // Helper methods for tests of connection migration on write error. |
| 511 void MigrateSessionOnWriteErrorNonMigratableStream(IoMode mode); | 516 void MigrateSessionOnWriteErrorNonMigratableStream(IoMode mode); |
| 512 void MigrateSessionOnWriteErrorMigrationDisabled(IoMode mode); | 517 void MigrateSessionOnWriteErrorMigrationDisabled(IoMode mode); |
| 513 void MigrateSessionOnWriteError(IoMode mode); | 518 void MigrateSessionOnWriteError(IoMode mode); |
| 514 void MigrateSessionOnWriteErrorNoNewNetwork(IoMode mode); | 519 void MigrateSessionOnWriteErrorNoNewNetwork(IoMode mode); |
| 520 void MigrateSessionOnWriteErrorPauseBeforeConnected(IoMode mode); | |
| 515 void MigrateSessionOnMultipleWriteErrors(IoMode mode1, IoMode mode2); | 521 void MigrateSessionOnMultipleWriteErrors(IoMode mode1, IoMode mode2); |
| 516 void MigrateSessionOnWriteErrorWithNotificationQueued(bool disconnected); | 522 void MigrateSessionOnWriteErrorWithNotificationQueued(bool disconnected); |
| 517 void MigrateSessionOnNotificationWithWriteErrorQueued(bool disconnected); | 523 void MigrateSessionOnNotificationWithWriteErrorQueued(bool disconnected); |
| 518 void OnNetworkDisconnected(bool async_write_before); | 524 void OnNetworkDisconnected(bool async_write_before); |
| 519 void OnNetworkMadeDefault(bool async_write_before); | 525 void OnNetworkMadeDefault(bool async_write_before); |
| 520 | 526 |
| 521 MockHostResolver host_resolver_; | 527 MockHostResolver host_resolver_; |
| 522 scoped_refptr<SSLConfigService> ssl_config_service_; | 528 scoped_refptr<SSLConfigService> ssl_config_service_; |
| 523 MockClientSocketFactory socket_factory_; | 529 MockClientSocketFactory socket_factory_; |
| 524 MockCryptoClientStreamFactory crypto_client_stream_factory_; | 530 MockCryptoClientStreamFactory crypto_client_stream_factory_; |
| (...skipping 1226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1751 | 1757 |
| 1752 EXPECT_TRUE(socket_data.AllReadDataConsumed()); | 1758 EXPECT_TRUE(socket_data.AllReadDataConsumed()); |
| 1753 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); | 1759 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); |
| 1754 } | 1760 } |
| 1755 | 1761 |
| 1756 TEST_P(QuicStreamFactoryTest, OnNetworkDisconnectedNoNewNetwork) { | 1762 TEST_P(QuicStreamFactoryTest, OnNetworkDisconnectedNoNewNetwork) { |
| 1757 InitializeConnectionMigrationTest({kDefaultNetworkForTests}); | 1763 InitializeConnectionMigrationTest({kDefaultNetworkForTests}); |
| 1758 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); | 1764 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
| 1759 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 1765 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
| 1760 | 1766 |
| 1767 // Use the test task runner, to force the migration alarm timeout later. | |
| 1768 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get()); | |
| 1769 | |
| 1761 MockQuicData socket_data; | 1770 MockQuicData socket_data; |
| 1762 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); | 1771 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); |
| 1763 socket_data.AddWrite(client_maker_.MakeRstPacket( | 1772 socket_data.AddWrite(client_maker_.MakeRstPacket( |
| 1764 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT)); | 1773 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT)); |
| 1765 socket_data.AddSocketDataToFactory(&socket_factory_); | 1774 socket_data.AddSocketDataToFactory(&socket_factory_); |
| 1766 | 1775 |
| 1767 // Create request and QuicHttpStream. | 1776 // Create request and QuicHttpStream. |
| 1768 QuicStreamRequest request(factory_.get()); | 1777 QuicStreamRequest request(factory_.get()); |
| 1769 EXPECT_EQ(ERR_IO_PENDING, | 1778 EXPECT_EQ(ERR_IO_PENDING, |
| 1770 request.Request(host_port_pair_, privacy_mode_, | 1779 request.Request(host_port_pair_, privacy_mode_, |
| 1771 /*cert_verify_flags=*/0, url_, "GET", net_log_, | 1780 /*cert_verify_flags=*/0, url_, "GET", net_log_, |
| 1772 callback_.callback())); | 1781 callback_.callback())); |
| 1773 EXPECT_THAT(callback_.WaitForResult(), IsOk()); | 1782 EXPECT_THAT(callback_.WaitForResult(), IsOk()); |
| 1774 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); | 1783 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); |
| 1775 EXPECT_TRUE(stream.get()); | 1784 EXPECT_TRUE(stream.get()); |
| 1776 | 1785 |
| 1777 // Cause QUIC stream to be created. | 1786 // Cause QUIC stream to be created. |
| 1778 HttpRequestInfo request_info; | 1787 HttpRequestInfo request_info; |
| 1779 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, | 1788 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, |
| 1780 net_log_, CompletionCallback())); | 1789 net_log_, CompletionCallback())); |
| 1781 | 1790 |
| 1782 // Ensure that session is alive and active. | 1791 // Ensure that session is alive and active. |
| 1783 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); | 1792 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); |
| 1784 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | 1793 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
| 1785 EXPECT_TRUE(HasActiveSession(host_port_pair_)); | 1794 EXPECT_TRUE(HasActiveSession(host_port_pair_)); |
| 1786 | 1795 |
| 1787 // Trigger connection migration. Since there are no networks | 1796 // Trigger connection migration. Since there are no networks |
| 1788 // to migrate to, this should cause a RST_STREAM frame to be emitted | 1797 // to migrate to, this should cause the session to wait for a new network. |
| 1789 // with QUIC_RST_ACKNOWLEDGEMENT error code, and the session will be closed. | |
| 1790 scoped_mock_network_change_notifier_->mock_network_change_notifier() | 1798 scoped_mock_network_change_notifier_->mock_network_change_notifier() |
| 1791 ->NotifyNetworkDisconnected(kDefaultNetworkForTests); | 1799 ->NotifyNetworkDisconnected(kDefaultNetworkForTests); |
| 1792 | 1800 |
| 1801 // The migration will not fail until the migration alarm timeout. | |
| 1802 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | |
| 1803 EXPECT_FALSE(HasActiveSession(host_port_pair_)); | |
| 1804 EXPECT_EQ(1u, session->GetNumActiveStreams()); | |
| 1805 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback())); | |
| 1806 EXPECT_EQ(true, session->connection()->writer()->IsWriteBlocked()); | |
| 1807 | |
| 1808 // Force the migration alarm timeout to run. | |
| 1809 RunTestLoopUntilIdle(); | |
| 1810 | |
| 1811 // The connection should now be closed. A request for response | |
| 1812 // headers should fail. | |
| 1793 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | 1813 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
| 1794 EXPECT_FALSE(HasActiveSession(host_port_pair_)); | 1814 EXPECT_FALSE(HasActiveSession(host_port_pair_)); |
| 1815 EXPECT_EQ(ERR_NETWORK_CHANGED, callback_.WaitForResult()); | |
| 1795 | 1816 |
| 1796 EXPECT_TRUE(socket_data.AllReadDataConsumed()); | 1817 EXPECT_TRUE(socket_data.AllReadDataConsumed()); |
| 1797 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); | 1818 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); |
| 1798 } | 1819 } |
| 1799 | 1820 |
| 1800 TEST_P(QuicStreamFactoryTest, OnNetworkMadeDefaultNonMigratableStream) { | 1821 TEST_P(QuicStreamFactoryTest, OnNetworkMadeDefaultNonMigratableStream) { |
| 1801 InitializeConnectionMigrationTest( | 1822 InitializeConnectionMigrationTest( |
| 1802 {kDefaultNetworkForTests, kNewNetworkForTests}); | 1823 {kDefaultNetworkForTests, kNewNetworkForTests}); |
| 1803 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); | 1824 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
| 1804 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 1825 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
| (...skipping 737 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2542 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); | 2563 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); |
| 2543 EXPECT_TRUE(socket_data1.AllReadDataConsumed()); | 2564 EXPECT_TRUE(socket_data1.AllReadDataConsumed()); |
| 2544 EXPECT_TRUE(socket_data1.AllWriteDataConsumed()); | 2565 EXPECT_TRUE(socket_data1.AllWriteDataConsumed()); |
| 2545 } | 2566 } |
| 2546 | 2567 |
| 2547 TEST_P(QuicStreamFactoryTest, | 2568 TEST_P(QuicStreamFactoryTest, |
| 2548 MigrateSessionOnWriteErrorNoNewNetworkSynchronous) { | 2569 MigrateSessionOnWriteErrorNoNewNetworkSynchronous) { |
| 2549 MigrateSessionOnWriteErrorNoNewNetwork(SYNCHRONOUS); | 2570 MigrateSessionOnWriteErrorNoNewNetwork(SYNCHRONOUS); |
| 2550 } | 2571 } |
| 2551 | 2572 |
| 2552 TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorNoNewNetworkAsync) { | 2573 TEST_P(QuicStreamFactoryTest, |
| 2574 DISABLED_MigrateSessionOnWriteErrorNoNewNetworkAsync) { | |
| 2553 MigrateSessionOnWriteErrorNoNewNetwork(ASYNC); | 2575 MigrateSessionOnWriteErrorNoNewNetwork(ASYNC); |
| 2554 } | 2576 } |
| 2555 | 2577 |
| 2556 void QuicStreamFactoryTestBase::MigrateSessionOnWriteErrorNoNewNetwork( | 2578 void QuicStreamFactoryTestBase::MigrateSessionOnWriteErrorNoNewNetwork( |
| 2557 IoMode mode) { | 2579 IoMode mode) { |
| 2558 InitializeConnectionMigrationTest({kDefaultNetworkForTests}); | 2580 InitializeConnectionMigrationTest({kDefaultNetworkForTests}); |
| 2559 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); | 2581 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
| 2560 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 2582 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
| 2561 | 2583 |
| 2584 // Use the test task runner, to force the migration alarm timeout later. | |
| 2585 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get()); | |
| 2586 | |
| 2562 MockQuicData socket_data; | 2587 MockQuicData socket_data; |
| 2563 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); | 2588 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); |
| 2564 socket_data.AddWrite(mode, ERR_ADDRESS_UNREACHABLE); | 2589 socket_data.AddWrite(mode, ERR_ADDRESS_UNREACHABLE); |
| 2565 socket_data.AddSocketDataToFactory(&socket_factory_); | 2590 socket_data.AddSocketDataToFactory(&socket_factory_); |
| 2566 | 2591 |
| 2567 // Create request and QuicHttpStream. | 2592 // Create request and QuicHttpStream. |
| 2568 QuicStreamRequest request(factory_.get()); | 2593 QuicStreamRequest request(factory_.get()); |
| 2569 EXPECT_EQ(ERR_IO_PENDING, | 2594 EXPECT_EQ(ERR_IO_PENDING, |
| 2570 request.Request(host_port_pair_, privacy_mode_, | 2595 request.Request(host_port_pair_, privacy_mode_, |
| 2571 /*cert_verify_flags=*/0, url_, "GET", net_log_, | 2596 /*cert_verify_flags=*/0, url_, "GET", net_log_, |
| 2572 callback_.callback())); | 2597 callback_.callback())); |
| 2573 EXPECT_EQ(OK, callback_.WaitForResult()); | 2598 EXPECT_EQ(OK, callback_.WaitForResult()); |
| 2574 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); | 2599 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); |
| 2575 EXPECT_TRUE(stream.get()); | 2600 EXPECT_TRUE(stream.get()); |
| 2576 | 2601 |
| 2577 // Cause QUIC stream to be created. | 2602 // Cause QUIC stream to be created. |
| 2578 HttpRequestInfo request_info; | 2603 HttpRequestInfo request_info; |
| 2579 request_info.method = "GET"; | 2604 request_info.method = "GET"; |
| 2580 request_info.url = GURL("https://www.example.org/"); | 2605 request_info.url = GURL("https://www.example.org/"); |
| 2581 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, | 2606 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, |
| 2582 net_log_, CompletionCallback())); | 2607 net_log_, CompletionCallback())); |
| 2583 | 2608 |
| 2584 // Ensure that session is alive and active. | 2609 // Ensure that session is alive and active. |
| 2585 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); | 2610 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); |
| 2586 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | 2611 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
| 2587 EXPECT_TRUE(HasActiveSession(host_port_pair_)); | 2612 EXPECT_TRUE(HasActiveSession(host_port_pair_)); |
| 2588 | 2613 |
| 2614 // Send GET request on stream. This causes a write error, which triggers | |
| 2615 // a connection migration attempt. Since there are no networks | |
| 2616 // to migrate to, this causes the session to wait for a new network. | |
| 2617 HttpResponseInfo response; | |
| 2618 HttpRequestHeaders request_headers; | |
| 2619 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response, | |
| 2620 callback_.callback())); | |
| 2621 | |
| 2622 // Complete any pending writes. | |
| 2623 if (mode == ASYNC) | |
| 2624 runner_->RunNextTask(); | |
| 2625 | |
| 2626 // Migration has not yet failed. The session should be alive and active. | |
| 2627 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | |
| 2628 EXPECT_TRUE(HasActiveSession(host_port_pair_)); | |
| 2629 EXPECT_EQ(1u, session->GetNumActiveStreams()); | |
| 2630 EXPECT_TRUE(session->connection()->writer()->IsWriteBlocked()); | |
| 2631 | |
| 2632 // The migration will not fail until the migration alarm timeout. | |
| 2633 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | |
| 2634 EXPECT_TRUE(HasActiveSession(host_port_pair_)); | |
| 2635 EXPECT_EQ(1u, session->GetNumActiveStreams()); | |
| 2636 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback())); | |
| 2637 | |
| 2638 // Force migration alarm timeout to run. | |
| 2639 RunTestLoopUntilIdle(); | |
| 2640 | |
| 2641 // The connection should be closed. A request for response headers | |
| 2642 // should fail. | |
| 2643 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | |
| 2644 EXPECT_FALSE(HasActiveSession(host_port_pair_)); | |
| 2645 EXPECT_EQ(ERR_NETWORK_CHANGED, callback_.WaitForResult()); | |
| 2646 EXPECT_EQ(ERR_NETWORK_CHANGED, | |
| 2647 stream->ReadResponseHeaders(callback_.callback())); | |
| 2648 | |
| 2649 EXPECT_TRUE(socket_data.AllReadDataConsumed()); | |
| 2650 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); | |
| 2651 } | |
| 2652 | |
| 2653 TEST_P(QuicStreamFactoryTest, | |
| 2654 MigrateSessionOnWriteErrorPauseBeforeConnectedSync) { | |
| 2655 MigrateSessionOnWriteErrorPauseBeforeConnected(SYNCHRONOUS); | |
| 2656 } | |
| 2657 TEST_P(QuicStreamFactoryTest, | |
| 2658 MigrateSessionOnWriteErrorPauseBeforeConnectedAsync) { | |
| 2659 MigrateSessionOnWriteErrorPauseBeforeConnected(ASYNC); | |
| 2660 } | |
| 2661 | |
| 2662 void QuicStreamFactoryTestBase::MigrateSessionOnWriteErrorPauseBeforeConnected( | |
| 2663 IoMode mode) { | |
| 2664 InitializeConnectionMigrationTest({kDefaultNetworkForTests}); | |
| 2665 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); | |
| 2666 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | |
| 2667 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | |
| 2668 | |
| 2669 MockQuicData socket_data; | |
| 2670 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); | |
| 2671 socket_data.AddWrite(SYNCHRONOUS, ERR_FAILED); | |
| 2672 socket_data.AddSocketDataToFactory(&socket_factory_); | |
| 2673 | |
| 2674 // Create request and QuicHttpStream. | |
| 2675 QuicStreamRequest request(factory_.get()); | |
| 2676 EXPECT_EQ(ERR_IO_PENDING, | |
| 2677 request.Request(host_port_pair_, privacy_mode_, | |
| 2678 /*cert_verify_flags=*/0, url_, "GET", net_log_, | |
| 2679 callback_.callback())); | |
| 2680 EXPECT_EQ(OK, callback_.WaitForResult()); | |
| 2681 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); | |
| 2682 EXPECT_TRUE(stream.get()); | |
| 2683 | |
| 2684 // Cause QUIC stream to be created. | |
| 2685 HttpRequestInfo request_info; | |
| 2686 request_info.method = "GET"; | |
| 2687 request_info.url = GURL("https://www.example.org/"); | |
| 2688 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, | |
| 2689 net_log_, CompletionCallback())); | |
| 2690 | |
| 2691 // Ensure that session is alive and active. | |
| 2692 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); | |
| 2693 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | |
| 2694 EXPECT_TRUE(HasActiveSession(host_port_pair_)); | |
| 2695 | |
| 2589 // Send GET request on stream. This should cause a write error, which triggers | 2696 // Send GET request on stream. This should cause a write error, which triggers |
| 2590 // a connection migration attempt. | 2697 // a connection migration attempt. |
| 2591 HttpResponseInfo response; | 2698 HttpResponseInfo response; |
| 2592 HttpRequestHeaders request_headers; | 2699 HttpRequestHeaders request_headers; |
| 2593 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response, | 2700 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response, |
| 2594 callback_.callback())); | 2701 callback_.callback())); |
| 2595 // Run message loop to execute migration attempt. | 2702 |
| 2703 // Run the message loop so that data queued in the new socket is read by the | |
| 2704 // packet reader. | |
| 2596 base::RunLoop().RunUntilIdle(); | 2705 base::RunLoop().RunUntilIdle(); |
| 2597 // Migration fails, and session is closed and deleted. | 2706 |
| 2598 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | 2707 // In this particular code path, the network will not yet be marked |
| 2708 // as going away and the session will still be alive. | |
| 2709 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | |
| 2710 EXPECT_TRUE(HasActiveSession(host_port_pair_)); | |
| 2711 EXPECT_EQ(1u, session->GetNumActiveStreams()); | |
| 2712 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback())); | |
| 2713 | |
| 2714 // On a DISCONNECTED notification, nothing happens. | |
| 2715 // @@@ uncomment after NCN migrations are handled. | |
| 2716 // scoped_mock_network_change_notifier_->mock_network_change_notifier() | |
| 2717 // ->NotifyNetworkDisconnected(kDefaultNetworkForTests); | |
| 2718 | |
| 2719 // Set up second socket data provider that is used after | |
| 2720 // migration. The request is rewritten to this new socket, and the | |
| 2721 // response to the request is read on this new socket. | |
| 2722 MockQuicData socket_data1; | |
| 2723 socket_data1.AddWrite( | |
| 2724 ConstructGetRequestPacket(1, kClientDataStreamId1, true, true)); | |
| 2725 socket_data1.AddRead( | |
| 2726 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false)); | |
| 2727 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); | |
| 2728 socket_data1.AddWrite(client_maker_.MakeAckAndRstPacket( | |
| 2729 2, false, kClientDataStreamId1, QUIC_STREAM_CANCELLED, 1, 1, 1, true)); | |
| 2730 socket_data1.AddSocketDataToFactory(&socket_factory_); | |
| 2731 | |
| 2732 scoped_mock_network_change_notifier_->mock_network_change_notifier() | |
| 2733 ->SetConnectedNetworksList({kNewNetworkForTests}); | |
| 2734 scoped_mock_network_change_notifier_->mock_network_change_notifier() | |
| 2735 ->NotifyNetworkConnected(kNewNetworkForTests); | |
| 2736 | |
| 2737 // The session should now be marked as going away. Ensure that | |
| 2738 // while it is still alive, it is no longer active. | |
| 2739 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | |
| 2599 EXPECT_FALSE(HasActiveSession(host_port_pair_)); | 2740 EXPECT_FALSE(HasActiveSession(host_port_pair_)); |
| 2741 EXPECT_EQ(1u, session->GetNumActiveStreams()); | |
| 2742 | |
| 2743 // This is the callback for the response headers that returned | |
| 2744 // pending previously, because no result was available. Check that | |
| 2745 // the result is now available due to the successful migration. | |
| 2746 EXPECT_THAT(callback_.WaitForResult(), IsOk()); | |
| 2747 EXPECT_EQ(200, response.headers->response_code()); | |
| 2748 | |
| 2749 // Create a new request for the same destination and verify that a | |
| 2750 // new session is created. | |
| 2751 MockQuicData socket_data2; | |
| 2752 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); | |
| 2753 socket_data2.AddSocketDataToFactory(&socket_factory_); | |
| 2754 | |
| 2755 QuicStreamRequest request2(factory_.get()); | |
| 2756 EXPECT_EQ(ERR_IO_PENDING, | |
| 2757 request2.Request(host_port_pair_, privacy_mode_, | |
| 2758 /*cert_verify_flags=*/0, url_, "GET", net_log_, | |
| 2759 callback_.callback())); | |
| 2760 EXPECT_THAT(callback_.WaitForResult(), IsOk()); | |
| 2761 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream(); | |
| 2762 EXPECT_TRUE(stream2.get()); | |
| 2763 | |
| 2764 EXPECT_TRUE(HasActiveSession(host_port_pair_)); | |
| 2765 QuicChromiumClientSession* new_session = GetActiveSession(host_port_pair_); | |
| 2766 EXPECT_NE(session, new_session); | |
| 2767 | |
| 2768 stream.reset(); | |
| 2769 stream2.reset(); | |
| 2600 | 2770 |
| 2601 EXPECT_TRUE(socket_data.AllReadDataConsumed()); | 2771 EXPECT_TRUE(socket_data.AllReadDataConsumed()); |
| 2602 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); | 2772 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); |
| 2773 EXPECT_TRUE(socket_data1.AllReadDataConsumed()); | |
| 2774 EXPECT_TRUE(socket_data1.AllWriteDataConsumed()); | |
| 2775 EXPECT_TRUE(socket_data2.AllReadDataConsumed()); | |
| 2776 EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); | |
| 2603 } | 2777 } |
| 2604 | 2778 |
| 2605 TEST_P(QuicStreamFactoryTest, | 2779 TEST_P(QuicStreamFactoryTest, |
| 2606 MigrateSessionOnWriteErrorNonMigratableStreamSynchronous) { | 2780 MigrateSessionOnWriteErrorNonMigratableStreamSynchronous) { |
| 2607 MigrateSessionOnWriteErrorNonMigratableStream(SYNCHRONOUS); | 2781 MigrateSessionOnWriteErrorNonMigratableStream(SYNCHRONOUS); |
| 2608 } | 2782 } |
| 2609 | 2783 |
| 2610 TEST_P(QuicStreamFactoryTest, | 2784 TEST_P(QuicStreamFactoryTest, |
| 2611 MigrateSessionOnWriteErrorNonMigratableStreamAsync) { | 2785 MigrateSessionOnWriteErrorNonMigratableStreamAsync) { |
| 2612 MigrateSessionOnWriteErrorNonMigratableStream(ASYNC); | 2786 MigrateSessionOnWriteErrorNonMigratableStream(ASYNC); |
| (...skipping 2894 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5507 // Clear all cached states. | 5681 // Clear all cached states. |
| 5508 factory_->ClearCachedStatesInCryptoConfig( | 5682 factory_->ClearCachedStatesInCryptoConfig( |
| 5509 base::Callback<bool(const GURL&)>()); | 5683 base::Callback<bool(const GURL&)>()); |
| 5510 EXPECT_TRUE(test_cases[0].state->certs().empty()); | 5684 EXPECT_TRUE(test_cases[0].state->certs().empty()); |
| 5511 EXPECT_TRUE(test_cases[1].state->certs().empty()); | 5685 EXPECT_TRUE(test_cases[1].state->certs().empty()); |
| 5512 EXPECT_TRUE(test_cases[2].state->certs().empty()); | 5686 EXPECT_TRUE(test_cases[2].state->certs().empty()); |
| 5513 } | 5687 } |
| 5514 | 5688 |
| 5515 } // namespace test | 5689 } // namespace test |
| 5516 } // namespace net | 5690 } // namespace net |
| OLD | NEW |