Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(330)

Side by Side Diff: net/quic/chromium/quic_stream_factory_test.cc

Issue 2319343004: Makes migration on write error asynchronous to avoid reentrancy issues (Closed)
Patch Set: synced and rebased Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/quic/chromium/quic_stream_factory.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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 // Helper methods for tests of connection migration on write error.
511 void TestMigrationOnWriteErrorNonMigratableStream(IoMode write_error_mode);
512 void TestMigrationOnWriteErrorMigrationDisabled(IoMode write_error_mode);
513 void TestMigrationOnWriteError(IoMode write_error_mode);
514 void TestMigrationOnWriteErrorNoNewNetwork(IoMode write_error_mode);
515 void TestMigrationOnMultipleWriteErrors(IoMode first_write_error_mode,
516 IoMode second_write_error_mode);
517 void TestMigrationOnWriteErrorWithNotificationQueued(bool disconnected);
518 void TestMigrationOnNotificationWithWriteErrorQueued(bool disconnected);
519 void OnNetworkDisconnected(bool async_write_before);
520 void OnNetworkMadeDefault(bool async_write_before);
521
510 MockHostResolver host_resolver_; 522 MockHostResolver host_resolver_;
511 scoped_refptr<SSLConfigService> ssl_config_service_; 523 scoped_refptr<SSLConfigService> ssl_config_service_;
512 MockClientSocketFactory socket_factory_; 524 MockClientSocketFactory socket_factory_;
513 MockCryptoClientStreamFactory crypto_client_stream_factory_; 525 MockCryptoClientStreamFactory crypto_client_stream_factory_;
514 MockRandom random_generator_; 526 MockRandom random_generator_;
515 MockClock* clock_; // Owned by |factory_| once created. 527 MockClock* clock_; // Owned by |factory_| once created.
516 scoped_refptr<TestTaskRunner> runner_; 528 scoped_refptr<TestTaskRunner> runner_;
517 QuicVersion version_; 529 QuicVersion version_;
518 QuicTestPacketMaker client_maker_; 530 QuicTestPacketMaker client_maker_;
519 QuicTestPacketMaker server_maker_; 531 QuicTestPacketMaker server_maker_;
(...skipping 933 matching lines...) Expand 10 before | Expand all | Expand 10 after
1453 EXPECT_THAT(callback_.WaitForResult(), IsOk()); 1465 EXPECT_THAT(callback_.WaitForResult(), IsOk());
1454 stream = request2.CreateStream(); 1466 stream = request2.CreateStream();
1455 stream.reset(); // Will reset stream 3. 1467 stream.reset(); // Will reset stream 3.
1456 1468
1457 EXPECT_TRUE(socket_data.AllReadDataConsumed()); 1469 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1458 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 1470 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1459 EXPECT_TRUE(socket_data2.AllReadDataConsumed()); 1471 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1460 EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); 1472 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1461 } 1473 }
1462 1474
1463 TEST_P(QuicStreamFactoryTest, OnNetworkChangeNetworkMadeDefault) { 1475 TEST_P(QuicStreamFactoryTest, OnNetworkMadeDefaultWithSynchronousWriteBefore) {
1476 OnNetworkMadeDefault(/*async_write_before=*/false);
1477 }
1478
1479 TEST_P(QuicStreamFactoryTest, OnNetworkMadeDefaultWithAsyncWriteBefore) {
1480 OnNetworkMadeDefault(/*async_write_before=*/true);
1481 }
1482
1483 void QuicStreamFactoryTestBase::OnNetworkMadeDefault(bool async_write_before) {
1464 InitializeConnectionMigrationTest( 1484 InitializeConnectionMigrationTest(
1465 {kDefaultNetworkForTests, kNewNetworkForTests}); 1485 {kDefaultNetworkForTests, kNewNetworkForTests});
1466 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); 1486 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1467 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 1487 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1468 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 1488 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1469 1489
1490 int packet_number = 1;
1470 MockQuicData socket_data; 1491 MockQuicData socket_data;
1471 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); 1492 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
1472 socket_data.AddWrite( 1493 socket_data.AddWrite(ConstructGetRequestPacket(
1473 ConstructGetRequestPacket(1, kClientDataStreamId1, true, true)); 1494 packet_number++, kClientDataStreamId1, true, true));
1495 if (async_write_before) {
1496 socket_data.AddWrite(ASYNC, OK);
1497 packet_number++;
1498 }
1474 socket_data.AddSocketDataToFactory(&socket_factory_); 1499 socket_data.AddSocketDataToFactory(&socket_factory_);
1475 1500
1476 // Create request and QuicHttpStream. 1501 // Create request and QuicHttpStream.
1477 QuicStreamRequest request(factory_.get()); 1502 QuicStreamRequest request(factory_.get());
1478 EXPECT_EQ(ERR_IO_PENDING, 1503 EXPECT_EQ(ERR_IO_PENDING,
1479 request.Request(host_port_pair_, privacy_mode_, 1504 request.Request(host_port_pair_, privacy_mode_,
1480 /*cert_verify_flags=*/0, url_, "GET", net_log_, 1505 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1481 callback_.callback())); 1506 callback_.callback()));
1482 EXPECT_THAT(callback_.WaitForResult(), IsOk()); 1507 EXPECT_THAT(callback_.WaitForResult(), IsOk());
1483 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); 1508 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
(...skipping 10 matching lines...) Expand all
1494 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); 1519 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
1495 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); 1520 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1496 EXPECT_TRUE(HasActiveSession(host_port_pair_)); 1521 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1497 1522
1498 // Send GET request on stream. 1523 // Send GET request on stream.
1499 HttpResponseInfo response; 1524 HttpResponseInfo response;
1500 HttpRequestHeaders request_headers; 1525 HttpRequestHeaders request_headers;
1501 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response, 1526 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
1502 callback_.callback())); 1527 callback_.callback()));
1503 1528
1529 // Do an async write to leave writer blocked.
1530 if (async_write_before)
1531 session->connection()->SendPing();
1532
1504 // Set up second socket data provider that is used after migration. 1533 // Set up second socket data provider that is used after migration.
1505 // The response to the earlier request is read on this new socket. 1534 // The response to the earlier request is read on this new socket.
1506 MockQuicData socket_data1; 1535 MockQuicData socket_data1;
1507 socket_data1.AddWrite( 1536 socket_data1.AddWrite(
1508 client_maker_.MakePingPacket(2, /*include_version=*/true)); 1537 client_maker_.MakePingPacket(packet_number++, /*include_version=*/true));
1509 socket_data1.AddRead( 1538 socket_data1.AddRead(
1510 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false)); 1539 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false));
1511 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); 1540 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
1512 socket_data1.AddWrite(client_maker_.MakeAckAndRstPacket( 1541 socket_data1.AddWrite(client_maker_.MakeAckAndRstPacket(
1513 3, false, kClientDataStreamId1, QUIC_STREAM_CANCELLED, 1, 1, 1, true)); 1542 packet_number++, false, kClientDataStreamId1, QUIC_STREAM_CANCELLED, 1, 1,
1543 1, true));
1514 socket_data1.AddSocketDataToFactory(&socket_factory_); 1544 socket_data1.AddSocketDataToFactory(&socket_factory_);
1515 1545
1516 // Trigger connection migration. This should cause a PING frame 1546 // Trigger connection migration. This should cause a PING frame
1517 // to be emitted. 1547 // to be emitted.
1518 scoped_mock_network_change_notifier_->mock_network_change_notifier() 1548 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1519 ->NotifyNetworkMadeDefault(kNewNetworkForTests); 1549 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
1520 1550
1521 // The session should now be marked as going away. Ensure that 1551 // The session should now be marked as going away. Ensure that
1522 // while it is still alive, it is no longer active. 1552 // while it is still alive, it is no longer active.
1523 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); 1553 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1560 stream.reset(); 1590 stream.reset();
1561 1591
1562 EXPECT_TRUE(socket_data.AllReadDataConsumed()); 1592 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1563 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 1593 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1564 EXPECT_TRUE(socket_data1.AllReadDataConsumed()); 1594 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1565 EXPECT_TRUE(socket_data1.AllWriteDataConsumed()); 1595 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1566 EXPECT_TRUE(socket_data2.AllReadDataConsumed()); 1596 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1567 EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); 1597 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1568 } 1598 }
1569 1599
1570 TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnected) { 1600 TEST_P(QuicStreamFactoryTest, OnNetworkDisconnectedWithSynchronousWriteBefore) {
1601 OnNetworkDisconnected(/*async_write_before=*/false);
1602 }
1603
1604 TEST_P(QuicStreamFactoryTest, OnNetworkDisconnectedWithAsyncWriteBefore) {
1605 OnNetworkDisconnected(/*async_write_before=*/true);
1606 }
1607
1608 void QuicStreamFactoryTestBase::OnNetworkDisconnected(bool async_write_before) {
1571 InitializeConnectionMigrationTest( 1609 InitializeConnectionMigrationTest(
1572 {kDefaultNetworkForTests, kNewNetworkForTests}); 1610 {kDefaultNetworkForTests, kNewNetworkForTests});
1573 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); 1611 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1574 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 1612 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1575 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 1613 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1576 1614
1615 int packet_number = 1;
1577 MockQuicData socket_data; 1616 MockQuicData socket_data;
1578 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); 1617 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
1579 socket_data.AddWrite( 1618 socket_data.AddWrite(ConstructGetRequestPacket(
1580 ConstructGetRequestPacket(1, kClientDataStreamId1, true, true)); 1619 packet_number++, kClientDataStreamId1, true, true));
1620 if (async_write_before) {
1621 socket_data.AddWrite(ASYNC, OK);
1622 packet_number++;
1623 }
1581 socket_data.AddSocketDataToFactory(&socket_factory_); 1624 socket_data.AddSocketDataToFactory(&socket_factory_);
1582 1625
1583 // Create request and QuicHttpStream. 1626 // Create request and QuicHttpStream.
1584 QuicStreamRequest request(factory_.get()); 1627 QuicStreamRequest request(factory_.get());
1585 EXPECT_EQ(ERR_IO_PENDING, 1628 EXPECT_EQ(ERR_IO_PENDING,
1586 request.Request(host_port_pair_, privacy_mode_, 1629 request.Request(host_port_pair_, privacy_mode_,
1587 /*cert_verify_flags=*/0, url_, "GET", net_log_, 1630 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1588 callback_.callback())); 1631 callback_.callback()));
1589 EXPECT_THAT(callback_.WaitForResult(), IsOk()); 1632 EXPECT_THAT(callback_.WaitForResult(), IsOk());
1590 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); 1633 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
(...skipping 10 matching lines...) Expand all
1601 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); 1644 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
1602 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); 1645 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1603 EXPECT_TRUE(HasActiveSession(host_port_pair_)); 1646 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1604 1647
1605 // Send GET request on stream. 1648 // Send GET request on stream.
1606 HttpResponseInfo response_info; 1649 HttpResponseInfo response_info;
1607 HttpRequestHeaders request_headers; 1650 HttpRequestHeaders request_headers;
1608 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response_info, 1651 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response_info,
1609 callback_.callback())); 1652 callback_.callback()));
1610 1653
1654 // Do an async write to leave writer blocked.
1655 if (async_write_before)
1656 session->connection()->SendPing();
1657
1658 // Set up second socket data provider that is used after migration.
1659 // The response to the earlier request is read on this new socket.
1611 MockQuicData socket_data1; 1660 MockQuicData socket_data1;
1612 socket_data1.AddWrite( 1661 socket_data1.AddWrite(
1613 client_maker_.MakePingPacket(2, /*include_version=*/true)); 1662 client_maker_.MakePingPacket(packet_number++, /*include_version=*/true));
1614 socket_data1.AddRead( 1663 socket_data1.AddRead(
1615 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false)); 1664 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false));
1616 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); 1665 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
1617 socket_data1.AddWrite(client_maker_.MakeAckAndRstPacket( 1666 socket_data1.AddWrite(client_maker_.MakeAckAndRstPacket(
1618 3, false, kClientDataStreamId1, QUIC_STREAM_CANCELLED, 1, 1, 1, true)); 1667 packet_number++, false, kClientDataStreamId1, QUIC_STREAM_CANCELLED, 1, 1,
1668 1, true));
1619 socket_data1.AddSocketDataToFactory(&socket_factory_); 1669 socket_data1.AddSocketDataToFactory(&socket_factory_);
1620 1670
1621 // Trigger connection migration. This should cause a PING frame 1671 // Trigger connection migration. This should cause a PING frame
1622 // to be emitted. 1672 // to be emitted.
1623 scoped_mock_network_change_notifier_->mock_network_change_notifier() 1673 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1624 ->NotifyNetworkDisconnected(kDefaultNetworkForTests); 1674 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1625 1675
1626 // The session should now be marked as going away. Ensure that 1676 // The session should now be marked as going away. Ensure that
1627 // while it is still alive, it is no longer active. 1677 // while it is still alive, it is no longer active.
1628 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); 1678 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
(...skipping 23 matching lines...) Expand all
1652 stream.reset(); 1702 stream.reset();
1653 1703
1654 EXPECT_TRUE(socket_data.AllReadDataConsumed()); 1704 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1655 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 1705 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1656 EXPECT_TRUE(socket_data1.AllReadDataConsumed()); 1706 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1657 EXPECT_TRUE(socket_data1.AllWriteDataConsumed()); 1707 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1658 EXPECT_TRUE(socket_data2.AllReadDataConsumed()); 1708 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1659 EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); 1709 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1660 } 1710 }
1661 1711
1662 TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNoNetworks) { 1712 TEST_P(QuicStreamFactoryTest, OnNetworkDisconnectedNoNetworks) {
1663 NetworkChangeNotifier::NetworkList no_networks(0); 1713 NetworkChangeNotifier::NetworkList no_networks(0);
1664 InitializeConnectionMigrationTest(no_networks); 1714 InitializeConnectionMigrationTest(no_networks);
1665 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); 1715 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1666 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 1716 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1667 1717
1668 MockQuicData socket_data; 1718 MockQuicData socket_data;
1669 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); 1719 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
1670 socket_data.AddWrite(client_maker_.MakeRstPacket( 1720 socket_data.AddWrite(client_maker_.MakeRstPacket(
1671 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT)); 1721 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
1672 socket_data.AddSocketDataToFactory(&socket_factory_); 1722 socket_data.AddSocketDataToFactory(&socket_factory_);
(...skipping 24 matching lines...) Expand all
1697 scoped_mock_network_change_notifier_->mock_network_change_notifier() 1747 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1698 ->NotifyNetworkDisconnected(kDefaultNetworkForTests); 1748 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1699 1749
1700 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); 1750 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1701 EXPECT_FALSE(HasActiveSession(host_port_pair_)); 1751 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1702 1752
1703 EXPECT_TRUE(socket_data.AllReadDataConsumed()); 1753 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1704 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 1754 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1705 } 1755 }
1706 1756
1707 TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNoNewNetwork) { 1757 TEST_P(QuicStreamFactoryTest, OnNetworkDisconnectedNoNewNetwork) {
1708 InitializeConnectionMigrationTest({kDefaultNetworkForTests}); 1758 InitializeConnectionMigrationTest({kDefaultNetworkForTests});
1709 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); 1759 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1710 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 1760 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1711 1761
1712 MockQuicData socket_data; 1762 MockQuicData socket_data;
1713 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); 1763 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
1714 socket_data.AddWrite(client_maker_.MakeRstPacket( 1764 socket_data.AddWrite(client_maker_.MakeRstPacket(
1715 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT)); 1765 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
1716 socket_data.AddSocketDataToFactory(&socket_factory_); 1766 socket_data.AddSocketDataToFactory(&socket_factory_);
1717 1767
(...skipping 23 matching lines...) Expand all
1741 scoped_mock_network_change_notifier_->mock_network_change_notifier() 1791 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1742 ->NotifyNetworkDisconnected(kDefaultNetworkForTests); 1792 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1743 1793
1744 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); 1794 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1745 EXPECT_FALSE(HasActiveSession(host_port_pair_)); 1795 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1746 1796
1747 EXPECT_TRUE(socket_data.AllReadDataConsumed()); 1797 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1748 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 1798 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1749 } 1799 }
1750 1800
1751 TEST_P(QuicStreamFactoryTest, 1801 TEST_P(QuicStreamFactoryTest, OnNetworkMadeDefaultNonMigratableStream) {
1752 OnNetworkChangeNetworkMadeDefaultNonMigratableStream) {
1753 InitializeConnectionMigrationTest( 1802 InitializeConnectionMigrationTest(
1754 {kDefaultNetworkForTests, kNewNetworkForTests}); 1803 {kDefaultNetworkForTests, kNewNetworkForTests});
1755 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); 1804 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1756 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 1805 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1757 1806
1758 MockQuicData socket_data; 1807 MockQuicData socket_data;
1759 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); 1808 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
1760 socket_data.AddWrite(client_maker_.MakeRstPacket( 1809 socket_data.AddWrite(client_maker_.MakeRstPacket(
1761 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED)); 1810 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1762 socket_data.AddSocketDataToFactory(&socket_factory_); 1811 socket_data.AddSocketDataToFactory(&socket_factory_);
(...skipping 27 matching lines...) Expand all
1790 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); 1839 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1791 EXPECT_FALSE(HasActiveSession(host_port_pair_)); 1840 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1792 EXPECT_EQ(1u, session->GetNumActiveStreams()); 1841 EXPECT_EQ(1u, session->GetNumActiveStreams());
1793 1842
1794 stream.reset(); 1843 stream.reset();
1795 1844
1796 EXPECT_TRUE(socket_data.AllReadDataConsumed()); 1845 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1797 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 1846 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1798 } 1847 }
1799 1848
1800 TEST_P(QuicStreamFactoryTest, 1849 TEST_P(QuicStreamFactoryTest, OnNetworkMadeDefaultConnectionMigrationDisabled) {
1801 OnNetworkChangeNetworkMadeDefaultConnectionMigrationDisabled) {
1802 InitializeConnectionMigrationTest( 1850 InitializeConnectionMigrationTest(
1803 {kDefaultNetworkForTests, kNewNetworkForTests}); 1851 {kDefaultNetworkForTests, kNewNetworkForTests});
1804 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); 1852 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1805 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 1853 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1806 1854
1807 MockQuicData socket_data; 1855 MockQuicData socket_data;
1808 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); 1856 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
1809 socket_data.AddWrite(client_maker_.MakeRstPacket( 1857 socket_data.AddWrite(client_maker_.MakeRstPacket(
1810 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED)); 1858 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1811 socket_data.AddSocketDataToFactory(&socket_factory_); 1859 socket_data.AddSocketDataToFactory(&socket_factory_);
(...skipping 30 matching lines...) Expand all
1842 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); 1890 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1843 EXPECT_FALSE(HasActiveSession(host_port_pair_)); 1891 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1844 EXPECT_EQ(1u, session->GetNumActiveStreams()); 1892 EXPECT_EQ(1u, session->GetNumActiveStreams());
1845 1893
1846 stream.reset(); 1894 stream.reset();
1847 1895
1848 EXPECT_TRUE(socket_data.AllReadDataConsumed()); 1896 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1849 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 1897 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1850 } 1898 }
1851 1899
1852 TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNonMigratableStream) { 1900 TEST_P(QuicStreamFactoryTest, OnNetworkDisconnectedNonMigratableStream) {
1853 InitializeConnectionMigrationTest( 1901 InitializeConnectionMigrationTest(
1854 {kDefaultNetworkForTests, kNewNetworkForTests}); 1902 {kDefaultNetworkForTests, kNewNetworkForTests});
1855 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); 1903 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1856 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 1904 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1857 1905
1858 MockQuicData socket_data; 1906 MockQuicData socket_data;
1859 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); 1907 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
1860 socket_data.AddWrite(client_maker_.MakeRstPacket( 1908 socket_data.AddWrite(client_maker_.MakeRstPacket(
1861 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT)); 1909 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
1862 socket_data.AddSocketDataToFactory(&socket_factory_); 1910 socket_data.AddSocketDataToFactory(&socket_factory_);
(...skipping 26 matching lines...) Expand all
1889 ->NotifyNetworkDisconnected(kDefaultNetworkForTests); 1937 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1890 1938
1891 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); 1939 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1892 EXPECT_FALSE(HasActiveSession(host_port_pair_)); 1940 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1893 1941
1894 EXPECT_TRUE(socket_data.AllReadDataConsumed()); 1942 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1895 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 1943 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1896 } 1944 }
1897 1945
1898 TEST_P(QuicStreamFactoryTest, 1946 TEST_P(QuicStreamFactoryTest,
1899 OnNetworkChangeDisconnectedConnectionMigrationDisabled) { 1947 OnNetworkDisconnectedConnectionMigrationDisabled) {
1900 InitializeConnectionMigrationTest( 1948 InitializeConnectionMigrationTest(
1901 {kDefaultNetworkForTests, kNewNetworkForTests}); 1949 {kDefaultNetworkForTests, kNewNetworkForTests});
1902 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); 1950 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1903 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 1951 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1904 1952
1905 MockQuicData socket_data; 1953 MockQuicData socket_data;
1906 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); 1954 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
1907 socket_data.AddWrite(client_maker_.MakeRstPacket( 1955 socket_data.AddWrite(client_maker_.MakeRstPacket(
1908 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT)); 1956 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
1909 socket_data.AddSocketDataToFactory(&socket_factory_); 1957 socket_data.AddSocketDataToFactory(&socket_factory_);
(...skipping 28 matching lines...) Expand all
1938 scoped_mock_network_change_notifier_->mock_network_change_notifier() 1986 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1939 ->NotifyNetworkDisconnected(kDefaultNetworkForTests); 1987 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1940 1988
1941 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); 1989 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1942 EXPECT_FALSE(HasActiveSession(host_port_pair_)); 1990 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1943 1991
1944 EXPECT_TRUE(socket_data.AllReadDataConsumed()); 1992 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1945 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 1993 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1946 } 1994 }
1947 1995
1948 TEST_P(QuicStreamFactoryTest, OnNetworkChangeNetworkMadeDefaultNoOpenStreams) { 1996 TEST_P(QuicStreamFactoryTest, OnNetworkMadeDefaultNoOpenStreams) {
1949 InitializeConnectionMigrationTest( 1997 InitializeConnectionMigrationTest(
1950 {kDefaultNetworkForTests, kNewNetworkForTests}); 1998 {kDefaultNetworkForTests, kNewNetworkForTests});
1951 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); 1999 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1952 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 2000 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1953 2001
1954 MockQuicData socket_data; 2002 MockQuicData socket_data;
1955 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); 2003 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
1956 socket_data.AddSocketDataToFactory(&socket_factory_); 2004 socket_data.AddSocketDataToFactory(&socket_factory_);
1957 2005
1958 // Create request and QuicHttpStream. 2006 // Create request and QuicHttpStream.
(...skipping 16 matching lines...) Expand all
1975 scoped_mock_network_change_notifier_->mock_network_change_notifier() 2023 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1976 ->NotifyNetworkMadeDefault(kNewNetworkForTests); 2024 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
1977 2025
1978 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); 2026 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1979 EXPECT_FALSE(HasActiveSession(host_port_pair_)); 2027 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1980 2028
1981 EXPECT_TRUE(socket_data.AllReadDataConsumed()); 2029 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1982 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 2030 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1983 } 2031 }
1984 2032
1985 TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNoOpenStreams) { 2033 TEST_P(QuicStreamFactoryTest, OnNetworkDisconnectedNoOpenStreams) {
1986 InitializeConnectionMigrationTest( 2034 InitializeConnectionMigrationTest(
1987 {kDefaultNetworkForTests, kNewNetworkForTests}); 2035 {kDefaultNetworkForTests, kNewNetworkForTests});
1988 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); 2036 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1989 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 2037 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1990 2038
1991 MockQuicData socket_data; 2039 MockQuicData socket_data;
1992 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); 2040 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
1993 socket_data.AddSocketDataToFactory(&socket_factory_); 2041 socket_data.AddSocketDataToFactory(&socket_factory_);
1994 2042
1995 // Create request and QuicHttpStream. 2043 // Create request and QuicHttpStream.
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after
2405 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); 2453 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2406 EXPECT_TRUE(HasActiveSession(host_port_pair_)); 2454 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2407 EXPECT_EQ(1u, session->GetNumActiveStreams()); 2455 EXPECT_EQ(1u, session->GetNumActiveStreams());
2408 2456
2409 stream.reset(); 2457 stream.reset();
2410 2458
2411 EXPECT_TRUE(socket_data.AllReadDataConsumed()); 2459 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2412 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 2460 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2413 } 2461 }
2414 2462
2415 TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteError) { 2463 void QuicStreamFactoryTestBase::TestMigrationOnWriteError(
2464 IoMode write_error_mode) {
2416 InitializeConnectionMigrationTest( 2465 InitializeConnectionMigrationTest(
2417 {kDefaultNetworkForTests, kNewNetworkForTests}); 2466 {kDefaultNetworkForTests, kNewNetworkForTests});
2418 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); 2467 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2419 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 2468 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2420 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 2469 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2421 2470
2422 MockQuicData socket_data; 2471 MockQuicData socket_data;
2423 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); 2472 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
2424 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE); 2473 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
2425 socket_data.AddSocketDataToFactory(&socket_factory_); 2474 socket_data.AddSocketDataToFactory(&socket_factory_);
2426 2475
2427 // Create request and QuicHttpStream. 2476 // Create request and QuicHttpStream.
2428 QuicStreamRequest request(factory_.get()); 2477 QuicStreamRequest request(factory_.get());
2429 EXPECT_EQ(ERR_IO_PENDING, 2478 EXPECT_EQ(ERR_IO_PENDING,
2430 request.Request(host_port_pair_, privacy_mode_, 2479 request.Request(host_port_pair_, privacy_mode_,
2431 /*cert_verify_flags=*/0, url_, "GET", net_log_, 2480 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2432 callback_.callback())); 2481 callback_.callback()));
2433 EXPECT_EQ(OK, callback_.WaitForResult()); 2482 EXPECT_EQ(OK, callback_.WaitForResult());
2434 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); 2483 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
(...skipping 24 matching lines...) Expand all
2459 2, false, kClientDataStreamId1, QUIC_STREAM_CANCELLED, 1, 1, 1, true)); 2508 2, false, kClientDataStreamId1, QUIC_STREAM_CANCELLED, 1, 1, 1, true));
2460 socket_data1.AddSocketDataToFactory(&socket_factory_); 2509 socket_data1.AddSocketDataToFactory(&socket_factory_);
2461 2510
2462 // Send GET request on stream. This should cause a write error, which triggers 2511 // Send GET request on stream. This should cause a write error, which triggers
2463 // a connection migration attempt. 2512 // a connection migration attempt.
2464 HttpResponseInfo response; 2513 HttpResponseInfo response;
2465 HttpRequestHeaders request_headers; 2514 HttpRequestHeaders request_headers;
2466 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response, 2515 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
2467 callback_.callback())); 2516 callback_.callback()));
2468 2517
2469 // Run the message loop so that data queued in the new socket is read by the 2518 // Run the message loop so that the migration attempt is executed and
2470 // packet reader. 2519 // data queued in the new socket is read by the packet reader.
2471 base::RunLoop().RunUntilIdle(); 2520 base::RunLoop().RunUntilIdle();
2472 2521
2473 // The session should now be marked as going away. Ensure that 2522 // The session should now be marked as going away. Ensure that
2474 // while it is still alive, it is no longer active. 2523 // while it is still alive, it is no longer active.
2475 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); 2524 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2476 EXPECT_FALSE(HasActiveSession(host_port_pair_)); 2525 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2477 EXPECT_EQ(1u, session->GetNumActiveStreams()); 2526 EXPECT_EQ(1u, session->GetNumActiveStreams());
2478 2527
2479 // Verify that response headers on the migrated socket were delivered to the 2528 // Verify that response headers on the migrated socket were delivered to the
2480 // stream. 2529 // stream.
2481 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback())); 2530 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
2482 EXPECT_EQ(200, response.headers->response_code()); 2531 EXPECT_EQ(200, response.headers->response_code());
2483 2532
2484 stream.reset(); 2533 stream.reset();
2485 2534
2486 EXPECT_TRUE(socket_data.AllReadDataConsumed()); 2535 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2487 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 2536 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2488 EXPECT_TRUE(socket_data1.AllReadDataConsumed()); 2537 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
2489 EXPECT_TRUE(socket_data1.AllWriteDataConsumed()); 2538 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
2490 } 2539 }
2491 2540
2492 TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorNoNewNetwork) { 2541 TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorSynchronous) {
2542 TestMigrationOnWriteError(SYNCHRONOUS);
2543 }
2544
2545 TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorAsync) {
2546 TestMigrationOnWriteError(ASYNC);
2547 }
2548
2549 void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorNoNewNetwork(
2550 IoMode write_error_mode) {
2493 InitializeConnectionMigrationTest({kDefaultNetworkForTests}); 2551 InitializeConnectionMigrationTest({kDefaultNetworkForTests});
2494 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); 2552 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2495 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 2553 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2496 2554
2497 MockQuicData socket_data; 2555 MockQuicData socket_data;
2498 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); 2556 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
2499 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE); 2557 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
2500 socket_data.AddSocketDataToFactory(&socket_factory_); 2558 socket_data.AddSocketDataToFactory(&socket_factory_);
2501 2559
2502 // Create request and QuicHttpStream. 2560 // Create request and QuicHttpStream.
2503 QuicStreamRequest request(factory_.get()); 2561 QuicStreamRequest request(factory_.get());
2504 EXPECT_EQ(ERR_IO_PENDING, 2562 EXPECT_EQ(ERR_IO_PENDING,
2505 request.Request(host_port_pair_, privacy_mode_, 2563 request.Request(host_port_pair_, privacy_mode_,
2506 /*cert_verify_flags=*/0, url_, "GET", net_log_, 2564 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2507 callback_.callback())); 2565 callback_.callback()));
2508 EXPECT_EQ(OK, callback_.WaitForResult()); 2566 EXPECT_EQ(OK, callback_.WaitForResult());
2509 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); 2567 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
2510 EXPECT_TRUE(stream.get()); 2568 EXPECT_TRUE(stream.get());
2511 2569
2512 // Cause QUIC stream to be created. 2570 // Cause QUIC stream to be created.
2513 HttpRequestInfo request_info; 2571 HttpRequestInfo request_info;
2514 request_info.method = "GET"; 2572 request_info.method = "GET";
2515 request_info.url = GURL("https://www.example.org/"); 2573 request_info.url = GURL("https://www.example.org/");
2516 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, 2574 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2517 net_log_, CompletionCallback())); 2575 net_log_, CompletionCallback()));
2518 2576
2519 // Ensure that session is alive and active. 2577 // Ensure that session is alive and active.
2520 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); 2578 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
2521 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); 2579 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2522 EXPECT_TRUE(HasActiveSession(host_port_pair_)); 2580 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2523 2581
2524 // Send GET request on stream. This should cause a write error, which triggers 2582 // Send GET request on stream. This should cause a write error, which triggers
2525 // a connection migration attempt. 2583 // a connection migration attempt.
2526 HttpResponseInfo response; 2584 HttpResponseInfo response;
2527 HttpRequestHeaders request_headers; 2585 HttpRequestHeaders request_headers;
2528 EXPECT_EQ( 2586 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
2529 ERR_QUIC_PROTOCOL_ERROR, 2587 callback_.callback()));
2530 stream->SendRequest(request_headers, &response, callback_.callback())); 2588 // Run message loop to execute migration attempt.
2531 2589 base::RunLoop().RunUntilIdle();
2532 // Migration fails, and session is marked as going away. 2590 // Migration fails, and session is closed and deleted.
2591 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2533 EXPECT_FALSE(HasActiveSession(host_port_pair_)); 2592 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2534 2593
2535 EXPECT_TRUE(socket_data.AllReadDataConsumed()); 2594 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2536 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 2595 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2537 } 2596 }
2538 2597
2539 TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorNonMigratableStream) { 2598 TEST_P(QuicStreamFactoryTest,
2599 MigrateSessionOnWriteErrorNoNewNetworkSynchronous) {
2600 TestMigrationOnWriteErrorNoNewNetwork(SYNCHRONOUS);
2601 }
2602
2603 TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorNoNewNetworkAsync) {
2604 TestMigrationOnWriteErrorNoNewNetwork(ASYNC);
2605 }
2606
2607 void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorNonMigratableStream(
2608 IoMode write_error_mode) {
2609 DVLOG(1) << "Mode: "
2610 << ((write_error_mode == SYNCHRONOUS) ? "SYNCHRONOUS" : "ASYNC");
2540 InitializeConnectionMigrationTest( 2611 InitializeConnectionMigrationTest(
2541 {kDefaultNetworkForTests, kNewNetworkForTests}); 2612 {kDefaultNetworkForTests, kNewNetworkForTests});
2542 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); 2613 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2543 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 2614 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2544 2615
2545 MockQuicData socket_data; 2616 MockQuicData socket_data;
2546 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); 2617 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
2547 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE); 2618 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
2548 socket_data.AddSocketDataToFactory(&socket_factory_); 2619 socket_data.AddSocketDataToFactory(&socket_factory_);
2549 2620
2550 // Create request and QuicHttpStream. 2621 // Create request and QuicHttpStream.
2551 QuicStreamRequest request(factory_.get()); 2622 QuicStreamRequest request(factory_.get());
2552 EXPECT_EQ(ERR_IO_PENDING, 2623 EXPECT_EQ(ERR_IO_PENDING,
2553 request.Request(host_port_pair_, privacy_mode_, 2624 request.Request(host_port_pair_, privacy_mode_,
2554 /*cert_verify_flags=*/0, url_, "GET", net_log_, 2625 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2555 callback_.callback())); 2626 callback_.callback()));
2556 EXPECT_EQ(OK, callback_.WaitForResult()); 2627 EXPECT_EQ(OK, callback_.WaitForResult());
2557 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); 2628 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
2558 EXPECT_TRUE(stream.get()); 2629 EXPECT_TRUE(stream.get());
2559 2630
2560 // Cause QUIC stream to be created, but marked as non-migratable. 2631 // Cause QUIC stream to be created, but marked as non-migratable.
2561 HttpRequestInfo request_info; 2632 HttpRequestInfo request_info;
2562 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION; 2633 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION;
2563 request_info.method = "GET"; 2634 request_info.method = "GET";
2564 request_info.url = GURL("https://www.example.org/"); 2635 request_info.url = GURL("https://www.example.org/");
2565 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, 2636 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2566 net_log_, CompletionCallback())); 2637 net_log_, CompletionCallback()));
2567 2638
2568 // Ensure that session is alive and active. 2639 // Ensure that session is alive and active.
2569 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); 2640 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
2570 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); 2641 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2571 EXPECT_TRUE(HasActiveSession(host_port_pair_)); 2642 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2572 2643
2573 // Send GET request on stream. This should cause a write error, which triggers 2644 // Send GET request on stream. This should cause a write error, which triggers
2574 // a connection migration attempt. 2645 // a connection migration attempt.
2575 HttpResponseInfo response; 2646 HttpResponseInfo response;
2576 HttpRequestHeaders request_headers; 2647 HttpRequestHeaders request_headers;
2577 EXPECT_EQ( 2648 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
2578 ERR_QUIC_PROTOCOL_ERROR, 2649 callback_.callback()));
2579 stream->SendRequest(request_headers, &response, callback_.callback()));
2580 2650
2581 // Migration fails, and session is marked as going away. 2651 // Run message loop to execute migration attempt.
2652 base::RunLoop().RunUntilIdle();
2653
2654 // Migration fails, and session is closed and deleted.
2655 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2582 EXPECT_FALSE(HasActiveSession(host_port_pair_)); 2656 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2583 2657
2584 EXPECT_TRUE(socket_data.AllReadDataConsumed()); 2658 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2585 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 2659 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2586 } 2660 }
2587 2661
2588 TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorMigrationDisabled) { 2662 TEST_P(QuicStreamFactoryTest,
2663 MigrateSessionOnWriteErrorNonMigratableStreamSynchronous) {
2664 TestMigrationOnWriteErrorNonMigratableStream(SYNCHRONOUS);
2665 }
2666
2667 TEST_P(QuicStreamFactoryTest,
2668 MigrateSessionOnWriteErrorNonMigratableStreamAsync) {
2669 TestMigrationOnWriteErrorNonMigratableStream(ASYNC);
2670 }
2671
2672 void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorMigrationDisabled(
2673 IoMode write_error_mode) {
2589 InitializeConnectionMigrationTest( 2674 InitializeConnectionMigrationTest(
2590 {kDefaultNetworkForTests, kNewNetworkForTests}); 2675 {kDefaultNetworkForTests, kNewNetworkForTests});
2591 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); 2676 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2592 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 2677 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2593 2678
2594 MockQuicData socket_data; 2679 MockQuicData socket_data;
2595 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); 2680 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
2596 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE); 2681 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
2597 socket_data.AddSocketDataToFactory(&socket_factory_); 2682 socket_data.AddSocketDataToFactory(&socket_factory_);
2598 2683
2599 // Create request and QuicHttpStream. 2684 // Create request and QuicHttpStream.
2600 QuicStreamRequest request(factory_.get()); 2685 QuicStreamRequest request(factory_.get());
2601 EXPECT_EQ(ERR_IO_PENDING, 2686 EXPECT_EQ(ERR_IO_PENDING,
2602 request.Request(host_port_pair_, privacy_mode_, 2687 request.Request(host_port_pair_, privacy_mode_,
2603 /*cert_verify_flags=*/0, url_, "GET", net_log_, 2688 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2604 callback_.callback())); 2689 callback_.callback()));
2605 EXPECT_EQ(OK, callback_.WaitForResult()); 2690 EXPECT_EQ(OK, callback_.WaitForResult());
2606 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); 2691 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
(...skipping 12 matching lines...) Expand all
2619 EXPECT_TRUE(HasActiveSession(host_port_pair_)); 2704 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2620 2705
2621 // Set session config to have connection migration disabled. 2706 // Set session config to have connection migration disabled.
2622 QuicConfigPeer::SetReceivedDisableConnectionMigration(session->config()); 2707 QuicConfigPeer::SetReceivedDisableConnectionMigration(session->config());
2623 EXPECT_TRUE(session->config()->DisableConnectionMigration()); 2708 EXPECT_TRUE(session->config()->DisableConnectionMigration());
2624 2709
2625 // Send GET request on stream. This should cause a write error, which triggers 2710 // Send GET request on stream. This should cause a write error, which triggers
2626 // a connection migration attempt. 2711 // a connection migration attempt.
2627 HttpResponseInfo response; 2712 HttpResponseInfo response;
2628 HttpRequestHeaders request_headers; 2713 HttpRequestHeaders request_headers;
2629 EXPECT_EQ( 2714 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
2630 ERR_QUIC_PROTOCOL_ERROR, 2715 callback_.callback()));
2631 stream->SendRequest(request_headers, &response, callback_.callback())); 2716 // Run message loop to execute migration attempt.
2632 2717 base::RunLoop().RunUntilIdle();
2633 // Migration fails, and session is marked as going away. 2718 // Migration fails, and session is closed and deleted.
2719 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2634 EXPECT_FALSE(HasActiveSession(host_port_pair_)); 2720 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2635
2636 EXPECT_TRUE(socket_data.AllReadDataConsumed()); 2721 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2637 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 2722 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2638 } 2723 }
2639 2724
2725 TEST_P(QuicStreamFactoryTest,
2726 MigrateSessionOnWriteErrorMigrationDisabledSynchronous) {
2727 TestMigrationOnWriteErrorMigrationDisabled(SYNCHRONOUS);
2728 }
2729
2730 TEST_P(QuicStreamFactoryTest,
2731 MigrateSessionOnWriteErrorMigrationDisabledAsync) {
2732 TestMigrationOnWriteErrorMigrationDisabled(ASYNC);
2733 }
2734
2735 void QuicStreamFactoryTestBase::TestMigrationOnMultipleWriteErrors(
2736 IoMode first_write_error_mode,
2737 IoMode second_write_error_mode) {
2738 const int kMaxReadersPerQuicSession = 5;
2739 InitializeConnectionMigrationTest(
2740 {kDefaultNetworkForTests, kNewNetworkForTests});
2741 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2742 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2743 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2744
2745 // Set up kMaxReadersPerQuicSession socket data providers, since
2746 // migration will cause kMaxReadersPerQuicSession write failures as
2747 // the session hops repeatedly between the two networks.
2748 MockQuicData socket_data[kMaxReadersPerQuicSession + 1];
2749 for (int i = 0; i <= kMaxReadersPerQuicSession; ++i) {
2750 // The last socket is created but never used.
2751 if (i < kMaxReadersPerQuicSession) {
2752 socket_data[i].AddRead(SYNCHRONOUS, ERR_IO_PENDING);
2753 socket_data[i].AddWrite(
2754 (i % 2 == 0) ? first_write_error_mode : second_write_error_mode,
2755 ERR_FAILED);
2756 }
2757 socket_data[i].AddSocketDataToFactory(&socket_factory_);
2758 }
2759
2760 // Create request and QuicHttpStream.
2761 QuicStreamRequest request(factory_.get());
2762 EXPECT_EQ(ERR_IO_PENDING,
2763 request.Request(host_port_pair_, privacy_mode_,
2764 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2765 callback_.callback()));
2766 EXPECT_EQ(OK, callback_.WaitForResult());
2767 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
2768 EXPECT_TRUE(stream.get());
2769
2770 // Cause QUIC stream to be created.
2771 HttpRequestInfo request_info;
2772 request_info.method = "GET";
2773 request_info.url = GURL("https://www.example.org/");
2774 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2775 net_log_, CompletionCallback()));
2776
2777 // Ensure that session is alive and active.
2778 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
2779 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2780 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2781
2782 // Send GET request on stream. This should cause a write error, which triggers
2783 // a connection migration attempt.
2784 HttpResponseInfo response;
2785 HttpRequestHeaders request_headers;
2786 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
2787 callback_.callback()));
2788 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
2789
2790 // Run the message loop so that data queued in the new socket is read by the
2791 // packet reader.
2792 base::RunLoop().RunUntilIdle();
2793
2794 // The connection should be closed because of a write error after migration.
2795 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2796 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2797 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR,
2798 stream->ReadResponseHeaders(callback_.callback()));
2799
2800 stream.reset();
2801 for (int i = 0; i <= kMaxReadersPerQuicSession; ++i) {
2802 DLOG(INFO) << "Socket number: " << i;
2803 EXPECT_TRUE(socket_data[i].AllReadDataConsumed());
2804 EXPECT_TRUE(socket_data[i].AllWriteDataConsumed());
2805 }
2806 }
2807
2808 TEST_P(QuicStreamFactoryTest, MigrateSessionOnMultipleWriteErrorsSyncSync) {
2809 TestMigrationOnMultipleWriteErrors(SYNCHRONOUS, SYNCHRONOUS);
2810 }
2811
2812 TEST_P(QuicStreamFactoryTest, MigrateSessionOnMultipleWriteErrorsSyncAsync) {
2813 TestMigrationOnMultipleWriteErrors(SYNCHRONOUS, ASYNC);
2814 }
2815
2816 TEST_P(QuicStreamFactoryTest, MigrateSessionOnMultipleWriteErrorsAsyncSync) {
2817 TestMigrationOnMultipleWriteErrors(ASYNC, SYNCHRONOUS);
2818 }
2819
2820 TEST_P(QuicStreamFactoryTest, MigrateSessionOnMultipleWriteErrorsAsyncAsync) {
2821 TestMigrationOnMultipleWriteErrors(ASYNC, ASYNC);
2822 }
2823
2824 void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorWithNotificationQueued(
2825 bool disconnected) {
2826 InitializeConnectionMigrationTest(
2827 {kDefaultNetworkForTests, kNewNetworkForTests});
2828 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2829 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2830 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2831
2832 MockQuicData socket_data;
2833 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
2834 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
2835 socket_data.AddSocketDataToFactory(&socket_factory_);
2836
2837 // Create request and QuicHttpStream.
2838 QuicStreamRequest request(factory_.get());
2839 EXPECT_EQ(ERR_IO_PENDING,
2840 request.Request(host_port_pair_, privacy_mode_,
2841 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2842 callback_.callback()));
2843 EXPECT_EQ(OK, callback_.WaitForResult());
2844 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
2845 EXPECT_TRUE(stream.get());
2846
2847 // Cause QUIC stream to be created.
2848 HttpRequestInfo request_info;
2849 request_info.method = "GET";
2850 request_info.url = GURL("https://www.example.org/");
2851 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2852 net_log_, CompletionCallback()));
2853
2854 // Ensure that session is alive and active.
2855 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
2856 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2857 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2858
2859 // Set up second socket data provider that is used after
2860 // migration. The request is rewritten to this new socket, and the
2861 // response to the request is read on this new socket.
2862 MockQuicData socket_data1;
2863 socket_data1.AddWrite(
2864 ConstructGetRequestPacket(1, kClientDataStreamId1, true, true));
2865 socket_data1.AddRead(
2866 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false));
2867 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
2868 socket_data1.AddWrite(client_maker_.MakeAckAndRstPacket(
2869 2, false, kClientDataStreamId1, QUIC_STREAM_CANCELLED, 1, 1, 1, true));
2870 socket_data1.AddSocketDataToFactory(&socket_factory_);
2871
2872 // First queue a network change notification in the message loop.
2873 if (disconnected) {
2874 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2875 ->QueueNetworkDisconnected(kDefaultNetworkForTests);
2876 } else {
2877 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2878 ->QueueNetworkMadeDefault(kNewNetworkForTests);
2879 }
2880 // Send GET request on stream. This should cause a write error,
2881 // which triggers a connection migration attempt. This will queue a
2882 // migration attempt behind the notification in the message loop.
2883 HttpResponseInfo response;
2884 HttpRequestHeaders request_headers;
2885 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
2886 callback_.callback()));
2887
2888 base::RunLoop().RunUntilIdle();
2889 // The session should now be marked as going away. Ensure that
2890 // while it is still alive, it is no longer active.
2891 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2892 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2893 EXPECT_EQ(1u, session->GetNumActiveStreams());
2894
2895 // Verify that response headers on the migrated socket were delivered to the
2896 // stream.
2897 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
2898 EXPECT_EQ(200, response.headers->response_code());
2899
2900 stream.reset();
2901
2902 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2903 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2904 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
2905 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
2906 }
2907
2908 TEST_P(QuicStreamFactoryTest,
2909 MigrateSessionOnWriteErrorWithNetworkDisconnectedQueued) {
2910 TestMigrationOnWriteErrorWithNotificationQueued(/*disconnected=*/true);
2911 }
2912
2913 TEST_P(QuicStreamFactoryTest,
2914 MigrateSessionOnWriteErrorWithNetworkMadeDefaultQueued) {
2915 TestMigrationOnWriteErrorWithNotificationQueued(/*disconnected=*/false);
2916 }
2917
2918 void QuicStreamFactoryTestBase::TestMigrationOnNotificationWithWriteErrorQueued(
2919 bool disconnected) {
2920 InitializeConnectionMigrationTest(
2921 {kDefaultNetworkForTests, kNewNetworkForTests});
2922 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2923 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2924 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2925
2926 MockQuicData socket_data;
2927 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
2928 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
2929 socket_data.AddSocketDataToFactory(&socket_factory_);
2930
2931 // Create request and QuicHttpStream.
2932 QuicStreamRequest request(factory_.get());
2933 EXPECT_EQ(ERR_IO_PENDING,
2934 request.Request(host_port_pair_, privacy_mode_,
2935 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2936 callback_.callback()));
2937 EXPECT_EQ(OK, callback_.WaitForResult());
2938 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
2939 EXPECT_TRUE(stream.get());
2940
2941 // Cause QUIC stream to be created.
2942 HttpRequestInfo request_info;
2943 request_info.method = "GET";
2944 request_info.url = GURL("https://www.example.org/");
2945 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2946 net_log_, CompletionCallback()));
2947
2948 // Ensure that session is alive and active.
2949 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
2950 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2951 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2952
2953 // Set up second socket data provider that is used after
2954 // migration. The request is rewritten to this new socket, and the
2955 // response to the request is read on this new socket.
2956 MockQuicData socket_data1;
2957 socket_data1.AddWrite(
2958 ConstructGetRequestPacket(1, kClientDataStreamId1, true, true));
2959 socket_data1.AddRead(
2960 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false));
2961 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
2962 socket_data1.AddWrite(client_maker_.MakeAckAndRstPacket(
2963 2, false, kClientDataStreamId1, QUIC_STREAM_CANCELLED, 1, 1, 1, true));
2964 socket_data1.AddSocketDataToFactory(&socket_factory_);
2965
2966 // Send GET request on stream. This should cause a write error,
2967 // which triggers a connection migration attempt. This will queue a
2968 // migration attempt in the message loop.
2969 HttpResponseInfo response;
2970 HttpRequestHeaders request_headers;
2971 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
2972 callback_.callback()));
2973
2974 // Now queue a network change notification in the message loop behind
2975 // the migration attempt.
2976 if (disconnected) {
2977 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2978 ->QueueNetworkDisconnected(kDefaultNetworkForTests);
2979 } else {
2980 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2981 ->QueueNetworkMadeDefault(kNewNetworkForTests);
2982 }
2983
2984 base::RunLoop().RunUntilIdle();
2985 // The session should now be marked as going away. Ensure that
2986 // while it is still alive, it is no longer active.
2987 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2988 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2989 EXPECT_EQ(1u, session->GetNumActiveStreams());
2990
2991 // Verify that response headers on the migrated socket were delivered to the
2992 // stream.
2993 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
2994 EXPECT_EQ(200, response.headers->response_code());
2995
2996 stream.reset();
2997
2998 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2999 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3000 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
3001 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
3002 }
3003
3004 TEST_P(QuicStreamFactoryTest,
3005 MigrateSessionOnNetworkDisconnectedWithWriteErrorQueued) {
3006 TestMigrationOnNotificationWithWriteErrorQueued(/*disconnected=*/true);
3007 }
3008
3009 TEST_P(QuicStreamFactoryTest,
3010 MigrateSessionOnNetworkMadeDefaultWithWriteErrorQueued) {
3011 TestMigrationOnNotificationWithWriteErrorQueued(/*disconnected=*/true);
3012 }
3013
2640 TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyToBadSocket) { 3014 TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyToBadSocket) {
2641 // This simulates the case where we attempt to migrate to a new 3015 // This simulates the case where we attempt to migrate to a new
2642 // socket but the socket is unusable, such as an ipv4/ipv6 mismatch. 3016 // socket but the socket is unusable, such as an ipv4/ipv6 mismatch.
2643 InitializeConnectionMigrationTest( 3017 InitializeConnectionMigrationTest(
2644 {kDefaultNetworkForTests, kNewNetworkForTests}); 3018 {kDefaultNetworkForTests, kNewNetworkForTests});
2645 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); 3019 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2646 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 3020 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2647 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 3021 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2648 3022
2649 MockQuicData socket_data; 3023 MockQuicData socket_data;
(...skipping 2485 matching lines...) Expand 10 before | Expand all | Expand 10 after
5135 // Clear all cached states. 5509 // Clear all cached states.
5136 factory_->ClearCachedStatesInCryptoConfig( 5510 factory_->ClearCachedStatesInCryptoConfig(
5137 base::Callback<bool(const GURL&)>()); 5511 base::Callback<bool(const GURL&)>());
5138 EXPECT_TRUE(test_cases[0].state->certs().empty()); 5512 EXPECT_TRUE(test_cases[0].state->certs().empty());
5139 EXPECT_TRUE(test_cases[1].state->certs().empty()); 5513 EXPECT_TRUE(test_cases[1].state->certs().empty());
5140 EXPECT_TRUE(test_cases[2].state->certs().empty()); 5514 EXPECT_TRUE(test_cases[2].state->certs().empty());
5141 } 5515 }
5142 5516
5143 } // namespace test 5517 } // namespace test
5144 } // namespace net 5518 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/chromium/quic_stream_factory.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698