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 |