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

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

Powered by Google App Engine
This is Rietveld 408576698