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

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

Issue 2789093003: Mark QUIC broken when the network blackholes after the handshake (Closed)
Patch Set: jana's comments Created 3 years, 8 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_http_stream.cc ('k') | net/quic/chromium/quic_stream_factory.h » ('j') | 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 <memory> 5 #include <memory>
6 #include <ostream> 6 #include <ostream>
7 #include <string> 7 #include <string>
8 #include <utility> 8 #include <utility>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 23 matching lines...) Expand all
34 #include "net/log/test_net_log.h" 34 #include "net/log/test_net_log.h"
35 #include "net/log/test_net_log_entry.h" 35 #include "net/log/test_net_log_entry.h"
36 #include "net/log/test_net_log_util.h" 36 #include "net/log/test_net_log_util.h"
37 #include "net/proxy/proxy_config_service_fixed.h" 37 #include "net/proxy/proxy_config_service_fixed.h"
38 #include "net/proxy/proxy_resolver.h" 38 #include "net/proxy/proxy_resolver.h"
39 #include "net/proxy/proxy_service.h" 39 #include "net/proxy/proxy_service.h"
40 #include "net/quic/chromium/crypto/proof_verifier_chromium.h" 40 #include "net/quic/chromium/crypto/proof_verifier_chromium.h"
41 #include "net/quic/chromium/mock_crypto_client_stream_factory.h" 41 #include "net/quic/chromium/mock_crypto_client_stream_factory.h"
42 #include "net/quic/chromium/mock_network_change_notifier.h" 42 #include "net/quic/chromium/mock_network_change_notifier.h"
43 #include "net/quic/chromium/mock_quic_data.h" 43 #include "net/quic/chromium/mock_quic_data.h"
44 #include "net/quic/chromium/quic_chromium_alarm_factory.h"
44 #include "net/quic/chromium/quic_http_utils.h" 45 #include "net/quic/chromium/quic_http_utils.h"
46 #include "net/quic/chromium/quic_stream_factory_peer.h"
45 #include "net/quic/chromium/quic_test_packet_maker.h" 47 #include "net/quic/chromium/quic_test_packet_maker.h"
48 #include "net/quic/chromium/test_task_runner.h"
46 #include "net/quic/core/crypto/quic_decrypter.h" 49 #include "net/quic/core/crypto/quic_decrypter.h"
47 #include "net/quic/core/crypto/quic_encrypter.h" 50 #include "net/quic/core/crypto/quic_encrypter.h"
48 #include "net/quic/core/quic_framer.h" 51 #include "net/quic/core/quic_framer.h"
49 #include "net/quic/platform/api/quic_string_piece.h" 52 #include "net/quic/platform/api/quic_string_piece.h"
50 #include "net/quic/test_tools/crypto_test_utils.h" 53 #include "net/quic/test_tools/crypto_test_utils.h"
51 #include "net/quic/test_tools/mock_clock.h" 54 #include "net/quic/test_tools/mock_clock.h"
52 #include "net/quic/test_tools/mock_random.h" 55 #include "net/quic/test_tools/mock_random.h"
53 #include "net/quic/test_tools/quic_test_utils.h" 56 #include "net/quic/test_tools/quic_test_utils.h"
54 #include "net/socket/client_socket_factory.h" 57 #include "net/socket/client_socket_factory.h"
55 #include "net/socket/mock_client_socket_pool_manager.h" 58 #include "net/socket/mock_client_socket_pool_manager.h"
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 289
287 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket( 290 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
288 QuicPacketNumber packet_number, 291 QuicPacketNumber packet_number,
289 QuicPacketNumber largest_received, 292 QuicPacketNumber largest_received,
290 QuicPacketNumber least_unacked) { 293 QuicPacketNumber least_unacked) {
291 return client_maker_.MakeAckPacket(packet_number, largest_received, 294 return client_maker_.MakeAckPacket(packet_number, largest_received,
292 least_unacked, least_unacked, true); 295 least_unacked, least_unacked, true);
293 } 296 }
294 297
295 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket( 298 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
299 QuicPacketNumber packet_number,
300 QuicPacketNumber largest_received,
301 QuicPacketNumber least_unacked,
302 QuicTime::Delta ack_delay_time) {
303 return client_maker_.MakeAckPacket(packet_number, largest_received,
304 least_unacked, least_unacked, true,
305 ack_delay_time);
306 }
307
308 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
296 QuicPacketNumber largest_received, 309 QuicPacketNumber largest_received,
297 QuicPacketNumber least_unacked) { 310 QuicPacketNumber least_unacked) {
298 return client_maker_.MakeAckPacket(2, largest_received, least_unacked, 311 return client_maker_.MakeAckPacket(2, largest_received, least_unacked,
299 least_unacked, true); 312 least_unacked, true);
300 } 313 }
301 314
302 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket( 315 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
303 QuicPacketNumber packet_number, 316 QuicPacketNumber packet_number,
304 QuicPacketNumber largest_received, 317 QuicPacketNumber largest_received,
305 QuicPacketNumber ack_least_unacked, 318 QuicPacketNumber ack_least_unacked,
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after
642 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken( 655 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken(
643 alternative_service_vector[0])); 656 alternative_service_vector[0]));
644 } 657 }
645 658
646 void ExpectQuicAlternateProtocolMapping() { 659 void ExpectQuicAlternateProtocolMapping() {
647 const url::SchemeHostPort server(request_.url); 660 const url::SchemeHostPort server(request_.url);
648 const AlternativeServiceVector alternative_service_vector = 661 const AlternativeServiceVector alternative_service_vector =
649 http_server_properties_.GetAlternativeServices(server); 662 http_server_properties_.GetAlternativeServices(server);
650 EXPECT_EQ(1u, alternative_service_vector.size()); 663 EXPECT_EQ(1u, alternative_service_vector.size());
651 EXPECT_EQ(kProtoQUIC, alternative_service_vector[0].protocol); 664 EXPECT_EQ(kProtoQUIC, alternative_service_vector[0].protocol);
665 EXPECT_FALSE(http_server_properties_.IsAlternativeServiceBroken(
666 alternative_service_vector[0]));
652 } 667 }
653 668
654 void AddHangingNonAlternateProtocolSocketData() { 669 void AddHangingNonAlternateProtocolSocketData() {
655 std::unique_ptr<StaticSocketDataProvider> hanging_data; 670 std::unique_ptr<StaticSocketDataProvider> hanging_data;
656 hanging_data.reset(new StaticSocketDataProvider()); 671 hanging_data.reset(new StaticSocketDataProvider());
657 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING); 672 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
658 hanging_data->set_connect_data(hanging_connect); 673 hanging_data->set_connect_data(hanging_connect);
659 hanging_data_.push_back(std::move(hanging_data)); 674 hanging_data_.push_back(std::move(hanging_data));
660 socket_factory_.AddSocketDataProvider(hanging_data_.back().get()); 675 socket_factory_.AddSocketDataProvider(hanging_data_.back().get());
661 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); 676 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
(...skipping 758 matching lines...) Expand 10 before | Expand all | Expand 10 after
1420 EXPECT_THAT(callback.WaitForResult(), IsOk()); 1435 EXPECT_THAT(callback.WaitForResult(), IsOk());
1421 1436
1422 // Check whether this transaction is correctly marked as received a go-away 1437 // Check whether this transaction is correctly marked as received a go-away
1423 // because of migrating port. 1438 // because of migrating port.
1424 NetErrorDetails details; 1439 NetErrorDetails details;
1425 EXPECT_FALSE(details.quic_port_migration_detected); 1440 EXPECT_FALSE(details.quic_port_migration_detected);
1426 trans.PopulateNetErrorDetails(&details); 1441 trans.PopulateNetErrorDetails(&details);
1427 EXPECT_TRUE(details.quic_port_migration_detected); 1442 EXPECT_TRUE(details.quic_port_migration_detected);
1428 } 1443 }
1429 1444
1445 // Verify that if a QUIC connection times out, the QuicHttpStream will
1446 // return QUIC_PROTOCOL_ERROR.
1447 TEST_P(QuicNetworkTransactionTest, TimeoutAfterHandshakeConfirmed) {
1448 params_.quic_idle_connection_timeout_seconds = 5;
1449
1450 // The request will initially go out over QUIC.
1451 MockQuicData quic_data;
1452 QuicStreamOffset header_stream_offset = 0;
1453 SpdyPriority priority =
1454 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
1455
1456 std::string request_data;
1457 quic_data.AddWrite(client_maker_.MakeRequestHeadersPacketAndSaveData(
1458 1, kClientDataStreamId1, true, true, priority,
1459 GetRequestHeaders("GET", "https", "/"), nullptr, &header_stream_offset,
1460 &request_data));
1461
1462 std::string settings_data;
1463 QuicStreamOffset settings_offset = header_stream_offset;
1464 quic_data.AddWrite(client_maker_.MakeSettingsPacketAndSaveData(
1465 2, SETTINGS_MAX_HEADER_LIST_SIZE, kDefaultMaxUncompressedHeaderSize, true,
1466 &header_stream_offset, &settings_data));
1467 // TLP 1
1468 quic_data.AddWrite(client_maker_.MakeDataPacket(3, kHeadersStreamId, true,
1469 false, 0, request_data));
1470 // TLP 2
1471 quic_data.AddWrite(client_maker_.MakeDataPacket(
1472 4, kHeadersStreamId, true, false, settings_offset, settings_data));
1473 // RTO 1
1474 quic_data.AddWrite(client_maker_.MakeDataPacket(5, kHeadersStreamId, true,
1475 false, 0, request_data));
1476 quic_data.AddWrite(client_maker_.MakeDataPacket(
1477 6, kHeadersStreamId, true, false, settings_offset, settings_data));
1478 // RTO 2
1479 quic_data.AddWrite(client_maker_.MakeDataPacket(7, kHeadersStreamId, true,
1480 false, 0, request_data));
1481 quic_data.AddWrite(client_maker_.MakeDataPacket(
1482 8, kHeadersStreamId, true, false, settings_offset, settings_data));
1483 // RTO 3
1484 quic_data.AddWrite(client_maker_.MakeDataPacket(9, kHeadersStreamId, true,
1485 false, 0, request_data));
1486 quic_data.AddWrite(client_maker_.MakeDataPacket(
1487 10, kHeadersStreamId, true, false, settings_offset, settings_data));
1488
1489 quic_data.AddRead(ASYNC, ERR_IO_PENDING);
1490 quic_data.AddRead(ASYNC, OK);
1491 quic_data.AddSocketDataToFactory(&socket_factory_);
1492
1493 // In order for a new QUIC session to be established via alternate-protocol
1494 // without racing an HTTP connection, we need the host resolution to happen
1495 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1496 // connection to the the server, in this test we require confirmation
1497 // before encrypting so the HTTP job will still start.
1498 host_resolver_.set_synchronous_mode(true);
1499 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
1500 "");
1501 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
1502 AddressList address;
1503 std::unique_ptr<HostResolver::Request> request;
1504 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1505 &request, net_log_.bound());
1506
1507 CreateSession();
1508 // Use a TestTaskRunner to avoid waiting in real time for timeouts.
1509 scoped_refptr<TestTaskRunner> quic_task_runner_(new TestTaskRunner(clock_));
1510 QuicStreamFactoryPeer::SetAlarmFactory(
1511 session_->quic_stream_factory(),
1512 base::MakeUnique<QuicChromiumAlarmFactory>(quic_task_runner_.get(),
1513 clock_));
1514
1515 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1516
1517 HttpNetworkTransaction trans(DEFAULT_PRIORITY, session_.get());
1518 TestCompletionCallback callback;
1519 int rv = trans.Start(&request_, callback.callback(), net_log_.bound());
1520 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1521
1522 // Pump the message loop to get the request started.
1523 base::RunLoop().RunUntilIdle();
1524 // Explicitly confirm the handshake.
1525 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1526 QuicSession::HANDSHAKE_CONFIRMED);
1527
1528 // Run the QUIC session to completion.
1529 quic_task_runner_->RunUntilIdle();
1530
1531 ExpectQuicAlternateProtocolMapping();
1532 ASSERT_TRUE(quic_data.AllWriteDataConsumed());
1533 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_QUIC_PROTOCOL_ERROR));
1534 }
1535
1536 // Verify that if a QUIC connection RTOs, the QuicHttpStream will
1537 // return QUIC_PROTOCOL_ERROR.
1538 TEST_P(QuicNetworkTransactionTest, TooManyRtosAfterHandshakeConfirmed) {
1539 params_.quic_connection_options.push_back(k5RTO);
1540
1541 // The request will initially go out over QUIC.
1542 MockQuicData quic_data;
1543 QuicStreamOffset header_stream_offset = 0;
1544 SpdyPriority priority =
1545 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
1546
1547 std::string request_data;
1548 quic_data.AddWrite(client_maker_.MakeRequestHeadersPacketAndSaveData(
1549 1, kClientDataStreamId1, true, true, priority,
1550 GetRequestHeaders("GET", "https", "/"), nullptr, &header_stream_offset,
1551 &request_data));
1552
1553 std::string settings_data;
1554 QuicStreamOffset settings_offset = header_stream_offset;
1555 quic_data.AddWrite(client_maker_.MakeSettingsPacketAndSaveData(
1556 2, SETTINGS_MAX_HEADER_LIST_SIZE, kDefaultMaxUncompressedHeaderSize, true,
1557 &header_stream_offset, &settings_data));
1558 // TLP 1
1559 quic_data.AddWrite(client_maker_.MakeDataPacket(3, kHeadersStreamId, true,
1560 false, 0, request_data));
1561 // TLP 2
1562 quic_data.AddWrite(client_maker_.MakeDataPacket(
1563 4, kHeadersStreamId, true, false, settings_offset, settings_data));
1564 // RTO 1
1565 quic_data.AddWrite(client_maker_.MakeDataPacket(5, kHeadersStreamId, true,
1566 false, 0, request_data));
1567 quic_data.AddWrite(client_maker_.MakeDataPacket(
1568 6, kHeadersStreamId, true, false, settings_offset, settings_data));
1569 // RTO 2
1570 quic_data.AddWrite(client_maker_.MakeDataPacket(7, kHeadersStreamId, true,
1571 false, 0, request_data));
1572 quic_data.AddWrite(client_maker_.MakeDataPacket(
1573 8, kHeadersStreamId, true, false, settings_offset, settings_data));
1574 // RTO 3
1575 quic_data.AddWrite(client_maker_.MakeDataPacket(9, kHeadersStreamId, true,
1576 false, 0, request_data));
1577 quic_data.AddWrite(client_maker_.MakeDataPacket(
1578 10, kHeadersStreamId, true, false, settings_offset, settings_data));
1579 // RTO 4
1580 quic_data.AddWrite(client_maker_.MakeDataPacket(11, kHeadersStreamId, true,
1581 false, 0, request_data));
1582 quic_data.AddWrite(client_maker_.MakeDataPacket(
1583 12, kHeadersStreamId, true, false, settings_offset, settings_data));
1584 // RTO 5
1585 quic_data.AddWrite(client_maker_.MakeAckAndConnectionClosePacket(
1586 13, true, QuicTime::Delta::Infinite(), 0, 1, QUIC_TOO_MANY_RTOS,
1587 "5 consecutive retransmission timeouts"));
1588
1589 quic_data.AddRead(ASYNC, OK);
1590 quic_data.AddSocketDataToFactory(&socket_factory_);
1591
1592 // In order for a new QUIC session to be established via alternate-protocol
1593 // without racing an HTTP connection, we need the host resolution to happen
1594 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1595 // connection to the the server, in this test we require confirmation
1596 // before encrypting so the HTTP job will still start.
1597 host_resolver_.set_synchronous_mode(true);
1598 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
1599 "");
1600 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
1601 AddressList address;
1602 std::unique_ptr<HostResolver::Request> request;
1603 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1604 &request, net_log_.bound());
1605
1606 CreateSession();
1607 // Use a TestTaskRunner to avoid waiting in real time for timeouts.
1608 scoped_refptr<TestTaskRunner> quic_task_runner_(new TestTaskRunner(clock_));
1609 QuicStreamFactoryPeer::SetAlarmFactory(
1610 session_->quic_stream_factory(),
1611 base::MakeUnique<QuicChromiumAlarmFactory>(quic_task_runner_.get(),
1612 clock_));
1613
1614 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1615
1616 HttpNetworkTransaction trans(DEFAULT_PRIORITY, session_.get());
1617 TestCompletionCallback callback;
1618 int rv = trans.Start(&request_, callback.callback(), net_log_.bound());
1619 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1620
1621 // Pump the message loop to get the request started.
1622 base::RunLoop().RunUntilIdle();
1623 // Explicitly confirm the handshake.
1624 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1625 QuicSession::HANDSHAKE_CONFIRMED);
1626
1627 // Run the QUIC session to completion.
1628 quic_task_runner_->RunUntilIdle();
1629
1630 ExpectQuicAlternateProtocolMapping();
1631 ASSERT_TRUE(quic_data.AllWriteDataConsumed());
1632 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_QUIC_PROTOCOL_ERROR));
1633 }
1634
1635 // Verify that if a QUIC connection RTOs, while there are no active streams
1636 // QUIC will not be marked as broken.
1637 TEST_P(QuicNetworkTransactionTest,
1638 TooManyRtosAfterHandshakeConfirmedAndStreamReset) {
1639 params_.quic_connection_options.push_back(k5RTO);
1640
1641 // The request will initially go out over QUIC.
1642 MockQuicData quic_data;
1643 QuicStreamOffset header_stream_offset = 0;
1644 SpdyPriority priority =
1645 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
1646
1647 std::string request_data;
1648 quic_data.AddWrite(client_maker_.MakeRequestHeadersPacketAndSaveData(
1649 1, kClientDataStreamId1, true, true, priority,
1650 GetRequestHeaders("GET", "https", "/"), nullptr, &header_stream_offset,
1651 &request_data));
1652
1653 std::string settings_data;
1654 QuicStreamOffset settings_offset = header_stream_offset;
1655 quic_data.AddWrite(client_maker_.MakeSettingsPacketAndSaveData(
1656 2, SETTINGS_MAX_HEADER_LIST_SIZE, kDefaultMaxUncompressedHeaderSize, true,
1657 &header_stream_offset, &settings_data));
1658
1659 quic_data.AddWrite(client_maker_.MakeRstPacket(3, true, kClientDataStreamId1,
1660 QUIC_STREAM_CANCELLED));
1661 // TLP 1
1662 quic_data.AddWrite(client_maker_.MakeDataPacket(4, kHeadersStreamId, true,
1663 false, 0, request_data));
1664 // TLP 2
1665 quic_data.AddWrite(client_maker_.MakeDataPacket(
1666 5, kHeadersStreamId, true, false, settings_offset, settings_data));
1667 // RTO 1
1668 quic_data.AddWrite(client_maker_.MakeRstPacket(6, true, kClientDataStreamId1,
1669 QUIC_STREAM_CANCELLED));
1670 quic_data.AddWrite(client_maker_.MakeDataPacket(7, kHeadersStreamId, true,
1671 false, 0, request_data));
1672 // RTO 2
1673 quic_data.AddWrite(client_maker_.MakeDataPacket(
1674 8, kHeadersStreamId, true, false, settings_offset, settings_data));
1675 quic_data.AddWrite(client_maker_.MakeRstPacket(9, true, kClientDataStreamId1,
1676 QUIC_STREAM_CANCELLED));
1677 // RTO 3
1678 quic_data.AddWrite(client_maker_.MakeDataPacket(10, kHeadersStreamId, true,
1679 false, 0, request_data));
1680 quic_data.AddWrite(client_maker_.MakeDataPacket(
1681 11, kHeadersStreamId, true, false, settings_offset, settings_data));
1682 // RTO 4
1683 quic_data.AddWrite(client_maker_.MakeRstPacket(12, true, kClientDataStreamId1,
1684 QUIC_STREAM_CANCELLED));
1685 quic_data.AddWrite(client_maker_.MakeDataPacket(13, kHeadersStreamId, true,
1686 false, 0, request_data));
1687 // RTO 5
1688 quic_data.AddWrite(client_maker_.MakeAckAndConnectionClosePacket(
1689 14, true, QuicTime::Delta::Infinite(), 0, 1, QUIC_TOO_MANY_RTOS,
1690 "5 consecutive retransmission timeouts"));
1691
1692 quic_data.AddRead(ASYNC, OK);
1693 quic_data.AddSocketDataToFactory(&socket_factory_);
1694
1695 // In order for a new QUIC session to be established via alternate-protocol
1696 // without racing an HTTP connection, we need the host resolution to happen
1697 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1698 // connection to the the server, in this test we require confirmation
1699 // before encrypting so the HTTP job will still start.
1700 host_resolver_.set_synchronous_mode(true);
1701 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
1702 "");
1703 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
1704 AddressList address;
1705 std::unique_ptr<HostResolver::Request> request;
1706 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1707 &request, net_log_.bound());
1708
1709 CreateSession();
1710 // Use a TestTaskRunner to avoid waiting in real time for timeouts.
1711 scoped_refptr<TestTaskRunner> quic_task_runner_(new TestTaskRunner(clock_));
1712 QuicStreamFactoryPeer::SetAlarmFactory(
1713 session_->quic_stream_factory(),
1714 base::MakeUnique<QuicChromiumAlarmFactory>(quic_task_runner_.get(),
1715 clock_));
1716
1717 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1718
1719 auto trans = base::MakeUnique<HttpNetworkTransaction>(DEFAULT_PRIORITY,
1720 session_.get());
1721 TestCompletionCallback callback;
1722 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1723 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1724
1725 // Pump the message loop to get the request started.
1726 base::RunLoop().RunUntilIdle();
1727 // Explicitly confirm the handshake.
1728 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1729 QuicSession::HANDSHAKE_CONFIRMED);
1730
1731 // Now cancel the request.
1732 trans.reset();
1733
1734 // Run the QUIC session to completion.
1735 quic_task_runner_->RunUntilIdle();
1736
1737 ExpectQuicAlternateProtocolMapping();
1738
1739 ASSERT_TRUE(quic_data.AllWriteDataConsumed());
1740 }
1741
1742 // Verify that with mark_quic_broken_when_network_blackholes enabled, if a QUIC
1743 // connection times out, then QUIC will be marked as broken and the request
1744 // retried over TCP.
1745 TEST_P(QuicNetworkTransactionTest, TimeoutAfterHandshakeConfirmedThenBroken) {
1746 params_.mark_quic_broken_when_network_blackholes = true;
1747 params_.quic_idle_connection_timeout_seconds = 5;
1748
1749 // The request will initially go out over QUIC.
1750 MockQuicData quic_data;
1751 QuicStreamOffset header_stream_offset = 0;
1752 SpdyPriority priority =
1753 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
1754
1755 std::string request_data;
1756 quic_data.AddWrite(client_maker_.MakeRequestHeadersPacketAndSaveData(
1757 1, kClientDataStreamId1, true, true, priority,
1758 GetRequestHeaders("GET", "https", "/"), nullptr, &header_stream_offset,
1759 &request_data));
1760
1761 std::string settings_data;
1762 QuicStreamOffset settings_offset = header_stream_offset;
1763 quic_data.AddWrite(client_maker_.MakeSettingsPacketAndSaveData(
1764 2, SETTINGS_MAX_HEADER_LIST_SIZE, kDefaultMaxUncompressedHeaderSize, true,
1765 &header_stream_offset, &settings_data));
1766 // TLP 1
1767 quic_data.AddWrite(client_maker_.MakeDataPacket(3, kHeadersStreamId, true,
1768 false, 0, request_data));
1769 // TLP 2
1770 quic_data.AddWrite(client_maker_.MakeDataPacket(
1771 4, kHeadersStreamId, true, false, settings_offset, settings_data));
1772 // RTO 1
1773 quic_data.AddWrite(client_maker_.MakeDataPacket(5, kHeadersStreamId, true,
1774 false, 0, request_data));
1775 quic_data.AddWrite(client_maker_.MakeDataPacket(
1776 6, kHeadersStreamId, true, false, settings_offset, settings_data));
1777 // RTO 2
1778 quic_data.AddWrite(client_maker_.MakeDataPacket(7, kHeadersStreamId, true,
1779 false, 0, request_data));
1780 quic_data.AddWrite(client_maker_.MakeDataPacket(
1781 8, kHeadersStreamId, true, false, settings_offset, settings_data));
1782 // RTO 3
1783 quic_data.AddWrite(client_maker_.MakeDataPacket(9, kHeadersStreamId, true,
1784 false, 0, request_data));
1785 quic_data.AddWrite(client_maker_.MakeDataPacket(
1786 10, kHeadersStreamId, true, false, settings_offset, settings_data));
1787
1788 quic_data.AddRead(ASYNC, ERR_IO_PENDING);
1789 quic_data.AddRead(ASYNC, OK);
1790 quic_data.AddSocketDataToFactory(&socket_factory_);
1791
1792 // After that fails, it will be resent via TCP.
1793 MockWrite http_writes[] = {
1794 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"),
1795 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
1796 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")};
1797
1798 MockRead http_reads[] = {
1799 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
1800 MockRead(SYNCHRONOUS, 4, kQuicAlternativeServiceHeader),
1801 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
1802 SequencedSocketData http_data(http_reads, arraysize(http_reads), http_writes,
1803 arraysize(http_writes));
1804 socket_factory_.AddSocketDataProvider(&http_data);
1805 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1806
1807 // In order for a new QUIC session to be established via alternate-protocol
1808 // without racing an HTTP connection, we need the host resolution to happen
1809 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1810 // connection to the the server, in this test we require confirmation
1811 // before encrypting so the HTTP job will still start.
1812 host_resolver_.set_synchronous_mode(true);
1813 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
1814 "");
1815 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
1816 AddressList address;
1817 std::unique_ptr<HostResolver::Request> request;
1818 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1819 &request, net_log_.bound());
1820
1821 CreateSession();
1822 // Use a TestTaskRunner to avoid waiting in real time for timeouts.
1823 scoped_refptr<TestTaskRunner> quic_task_runner_(new TestTaskRunner(clock_));
1824 QuicStreamFactoryPeer::SetAlarmFactory(
1825 session_->quic_stream_factory(),
1826 base::MakeUnique<QuicChromiumAlarmFactory>(quic_task_runner_.get(),
1827 clock_));
1828
1829 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1830
1831 HttpNetworkTransaction trans(DEFAULT_PRIORITY, session_.get());
1832 TestCompletionCallback callback;
1833 int rv = trans.Start(&request_, callback.callback(), net_log_.bound());
1834 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1835
1836 // Pump the message loop to get the request started.
1837 base::RunLoop().RunUntilIdle();
1838 // Explicitly confirm the handshake.
1839 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1840 QuicSession::HANDSHAKE_CONFIRMED);
1841
1842 // Run the QUIC session to completion.
1843 quic_task_runner_->RunUntilIdle();
1844 ASSERT_TRUE(quic_data.AllWriteDataConsumed());
1845
1846 // Let the transaction proceed which will result in QUIC being marked
1847 // as broken and the request falling back to TCP.
1848 EXPECT_THAT(callback.WaitForResult(), IsOk());
1849
1850 ExpectBrokenAlternateProtocolMapping();
1851 ASSERT_TRUE(quic_data.AllWriteDataConsumed());
1852 ASSERT_FALSE(http_data.AllReadDataConsumed());
1853
1854 // Read the response body over TCP.
1855 CheckResponseData(&trans, "hello world");
1856 ASSERT_TRUE(http_data.AllWriteDataConsumed());
1857 ASSERT_TRUE(http_data.AllReadDataConsumed());
1858 }
1859
1860 // Verify that with mark_quic_broken_when_network_blackholes enabled, if a QUIC
1861 // connection times out, then QUIC will be marked as broken but the request
1862 // will not be retried over TCP.
1863 TEST_P(QuicNetworkTransactionTest,
1864 TimeoutAfterHandshakeConfirmedAndHeadersThenBrokenNotRetried) {
1865 params_.mark_quic_broken_when_network_blackholes = true;
1866 params_.quic_idle_connection_timeout_seconds = 5;
1867
1868 // The request will initially go out over QUIC.
1869 MockQuicData quic_data;
1870 QuicStreamOffset header_stream_offset = 0;
1871 SpdyPriority priority =
1872 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
1873
1874 std::string request_data;
1875 quic_data.AddWrite(client_maker_.MakeRequestHeadersPacketAndSaveData(
1876 1, kClientDataStreamId1, true, true, priority,
1877 GetRequestHeaders("GET", "https", "/"), nullptr, &header_stream_offset,
1878 &request_data));
1879
1880 std::string settings_data;
1881 QuicStreamOffset settings_offset = header_stream_offset;
1882 quic_data.AddWrite(client_maker_.MakeSettingsPacketAndSaveData(
1883 2, SETTINGS_MAX_HEADER_LIST_SIZE, kDefaultMaxUncompressedHeaderSize, true,
1884 &header_stream_offset, &settings_data));
1885
1886 quic_data.AddRead(ConstructServerResponseHeadersPacket(
1887 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1888 // quic_data.AddWrite(ConstructClientAckPacket(3, 1, 1));
1889 quic_data.AddWrite(
1890 ConstructClientAckPacket(3, 1, 1, QuicTime::Delta::FromMilliseconds(25)));
1891
1892 // TLP 1
1893 quic_data.AddWrite(client_maker_.MakeDataPacket(4, kHeadersStreamId, false,
1894 false, 0, request_data));
1895 // TLP 2
1896 quic_data.AddWrite(client_maker_.MakeDataPacket(
1897 5, kHeadersStreamId, false, false, settings_offset, settings_data));
1898 // RTO 1
1899 quic_data.AddWrite(client_maker_.MakeDataPacket(6, kHeadersStreamId, false,
1900 false, 0, request_data));
1901 quic_data.AddWrite(client_maker_.MakeDataPacket(
1902 7, kHeadersStreamId, false, false, settings_offset, settings_data));
1903 // RTO 2
1904 quic_data.AddWrite(client_maker_.MakeDataPacket(8, kHeadersStreamId, false,
1905 false, 0, request_data));
1906 quic_data.AddWrite(client_maker_.MakeDataPacket(
1907 9, kHeadersStreamId, false, false, settings_offset, settings_data));
1908 // RTO 3
1909 quic_data.AddWrite(client_maker_.MakeDataPacket(10, kHeadersStreamId, false,
1910 false, 0, request_data));
1911 quic_data.AddWrite(client_maker_.MakeDataPacket(
1912 11, kHeadersStreamId, false, false, settings_offset, settings_data));
1913
1914 quic_data.AddRead(ASYNC, ERR_IO_PENDING);
1915 quic_data.AddRead(ASYNC, OK);
1916 quic_data.AddSocketDataToFactory(&socket_factory_);
1917
1918 // In order for a new QUIC session to be established via alternate-protocol
1919 // without racing an HTTP connection, we need the host resolution to happen
1920 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1921 // connection to the the server, in this test we require confirmation
1922 // before encrypting so the HTTP job will still start.
1923 host_resolver_.set_synchronous_mode(true);
1924 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
1925 "");
1926 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
1927 AddressList address;
1928 std::unique_ptr<HostResolver::Request> request;
1929 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1930 &request, net_log_.bound());
1931
1932 CreateSession();
1933 // Use a TestTaskRunner to avoid waiting in real time for timeouts.
1934 scoped_refptr<TestTaskRunner> quic_task_runner_(new TestTaskRunner(clock_));
1935 QuicStreamFactoryPeer::SetAlarmFactory(
1936 session_->quic_stream_factory(),
1937 base::MakeUnique<QuicChromiumAlarmFactory>(quic_task_runner_.get(),
1938 clock_));
1939
1940 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1941
1942 HttpNetworkTransaction trans(DEFAULT_PRIORITY, session_.get());
1943 TestCompletionCallback callback;
1944 int rv = trans.Start(&request_, callback.callback(), net_log_.bound());
1945 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1946
1947 // Pump the message loop to get the request started.
1948 base::RunLoop().RunUntilIdle();
1949 // Explicitly confirm the handshake.
1950 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1951 QuicSession::HANDSHAKE_CONFIRMED);
1952
1953 // Pump the message loop to get the request started.
1954 base::RunLoop().RunUntilIdle();
1955
1956 // Run the QUIC session to completion.
1957 quic_task_runner_->RunUntilIdle();
1958 ASSERT_TRUE(quic_data.AllWriteDataConsumed());
1959
1960 // Let the transaction proceed which will result in QUIC being marked
1961 // as broken and the request falling back to TCP.
1962 EXPECT_THAT(callback.WaitForResult(), IsOk());
1963
1964 ExpectBrokenAlternateProtocolMapping();
1965 ASSERT_TRUE(quic_data.AllWriteDataConsumed());
1966
1967 std::string response_data;
1968 ASSERT_THAT(ReadTransaction(&trans, &response_data),
1969 IsError(ERR_QUIC_PROTOCOL_ERROR));
1970 }
1971
1972 // Verify that with mark_quic_broken_when_network_blackholes enabled, if a QUIC
1973 // connection RTOs, then QUIC will be marked as broken and the request retried
1974 // over TCP.
1975 TEST_P(QuicNetworkTransactionTest,
1976 TooManyRtosAfterHandshakeConfirmedThenBroken) {
1977 params_.mark_quic_broken_when_network_blackholes = true;
1978 params_.quic_connection_options.push_back(k5RTO);
1979
1980 // The request will initially go out over QUIC.
1981 MockQuicData quic_data;
1982 QuicStreamOffset header_stream_offset = 0;
1983 SpdyPriority priority =
1984 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
1985
1986 std::string request_data;
1987 quic_data.AddWrite(client_maker_.MakeRequestHeadersPacketAndSaveData(
1988 1, kClientDataStreamId1, true, true, priority,
1989 GetRequestHeaders("GET", "https", "/"), nullptr, &header_stream_offset,
1990 &request_data));
1991
1992 std::string settings_data;
1993 QuicStreamOffset settings_offset = header_stream_offset;
1994 quic_data.AddWrite(client_maker_.MakeSettingsPacketAndSaveData(
1995 2, SETTINGS_MAX_HEADER_LIST_SIZE, kDefaultMaxUncompressedHeaderSize, true,
1996 &header_stream_offset, &settings_data));
1997 // TLP 1
1998 quic_data.AddWrite(client_maker_.MakeDataPacket(3, kHeadersStreamId, true,
1999 false, 0, request_data));
2000 // TLP 2
2001 quic_data.AddWrite(client_maker_.MakeDataPacket(
2002 4, kHeadersStreamId, true, false, settings_offset, settings_data));
2003 // RTO 1
2004 quic_data.AddWrite(client_maker_.MakeDataPacket(5, kHeadersStreamId, true,
2005 false, 0, request_data));
2006 quic_data.AddWrite(client_maker_.MakeDataPacket(
2007 6, kHeadersStreamId, true, false, settings_offset, settings_data));
2008 // RTO 2
2009 quic_data.AddWrite(client_maker_.MakeDataPacket(7, kHeadersStreamId, true,
2010 false, 0, request_data));
2011 quic_data.AddWrite(client_maker_.MakeDataPacket(
2012 8, kHeadersStreamId, true, false, settings_offset, settings_data));
2013 // RTO 3
2014 quic_data.AddWrite(client_maker_.MakeDataPacket(9, kHeadersStreamId, true,
2015 false, 0, request_data));
2016 quic_data.AddWrite(client_maker_.MakeDataPacket(
2017 10, kHeadersStreamId, true, false, settings_offset, settings_data));
2018 // RTO 4
2019 quic_data.AddWrite(client_maker_.MakeDataPacket(11, kHeadersStreamId, true,
2020 false, 0, request_data));
2021 quic_data.AddWrite(client_maker_.MakeDataPacket(
2022 12, kHeadersStreamId, true, false, settings_offset, settings_data));
2023
2024 quic_data.AddWrite(client_maker_.MakeAckAndConnectionClosePacket(
2025 13, true, QuicTime::Delta::Infinite(), 0, 1, QUIC_TOO_MANY_RTOS,
2026 "5 consecutive retransmission timeouts"));
2027
2028 quic_data.AddRead(ASYNC, OK);
2029 quic_data.AddSocketDataToFactory(&socket_factory_);
2030
2031 // After that fails, it will be resent via TCP.
2032 MockWrite http_writes[] = {
2033 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"),
2034 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
2035 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")};
2036
2037 MockRead http_reads[] = {
2038 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
2039 MockRead(SYNCHRONOUS, 4, kQuicAlternativeServiceHeader),
2040 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
2041 SequencedSocketData http_data(http_reads, arraysize(http_reads), http_writes,
2042 arraysize(http_writes));
2043 socket_factory_.AddSocketDataProvider(&http_data);
2044 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
2045
2046 // In order for a new QUIC session to be established via alternate-protocol
2047 // without racing an HTTP connection, we need the host resolution to happen
2048 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
2049 // connection to the the server, in this test we require confirmation
2050 // before encrypting so the HTTP job will still start.
2051 host_resolver_.set_synchronous_mode(true);
2052 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
2053 "");
2054 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
2055 AddressList address;
2056 std::unique_ptr<HostResolver::Request> request;
2057 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
2058 &request, net_log_.bound());
2059
2060 CreateSession();
2061 // Use a TestTaskRunner to avoid waiting in real time for timeouts.
2062 scoped_refptr<TestTaskRunner> quic_task_runner_(new TestTaskRunner(clock_));
2063 QuicStreamFactoryPeer::SetAlarmFactory(
2064 session_->quic_stream_factory(),
2065 base::MakeUnique<QuicChromiumAlarmFactory>(quic_task_runner_.get(),
2066 clock_));
2067
2068 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2069
2070 HttpNetworkTransaction trans(DEFAULT_PRIORITY, session_.get());
2071 TestCompletionCallback callback;
2072 int rv = trans.Start(&request_, callback.callback(), net_log_.bound());
2073 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
2074
2075 // Pump the message loop to get the request started.
2076 base::RunLoop().RunUntilIdle();
2077 // Explicitly confirm the handshake.
2078 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
2079 QuicSession::HANDSHAKE_CONFIRMED);
2080
2081 // Run the QUIC session to completion.
2082 quic_task_runner_->RunUntilIdle();
2083 ASSERT_TRUE(quic_data.AllWriteDataConsumed());
2084
2085 // Let the transaction proceed which will result in QUIC being marked
2086 // as broken and the request falling back to TCP.
2087 EXPECT_THAT(callback.WaitForResult(), IsOk());
2088
2089 ExpectBrokenAlternateProtocolMapping();
2090 ASSERT_TRUE(quic_data.AllWriteDataConsumed());
2091 ASSERT_FALSE(http_data.AllReadDataConsumed());
2092
2093 // Read the response body over TCP.
2094 CheckResponseData(&trans, "hello world");
2095 ASSERT_TRUE(http_data.AllWriteDataConsumed());
2096 ASSERT_TRUE(http_data.AllReadDataConsumed());
2097 }
2098
2099 // Verify that if a QUIC connection RTOs, while there are no active streams
2100 // QUIC will be marked as broken.
2101 TEST_P(QuicNetworkTransactionTest,
2102 TooManyRtosAfterHandshakeConfirmedAndStreamResetThenBroken) {
2103 params_.mark_quic_broken_when_network_blackholes = true;
2104 params_.quic_connection_options.push_back(k5RTO);
2105
2106 // The request will initially go out over QUIC.
2107 MockQuicData quic_data;
2108 QuicStreamOffset header_stream_offset = 0;
2109 SpdyPriority priority =
2110 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
2111
2112 std::string request_data;
2113 quic_data.AddWrite(client_maker_.MakeRequestHeadersPacketAndSaveData(
2114 1, kClientDataStreamId1, true, true, priority,
2115 GetRequestHeaders("GET", "https", "/"), nullptr, &header_stream_offset,
2116 &request_data));
2117
2118 std::string settings_data;
2119 QuicStreamOffset settings_offset = header_stream_offset;
2120 quic_data.AddWrite(client_maker_.MakeSettingsPacketAndSaveData(
2121 2, SETTINGS_MAX_HEADER_LIST_SIZE, kDefaultMaxUncompressedHeaderSize, true,
2122 &header_stream_offset, &settings_data));
2123
2124 quic_data.AddWrite(client_maker_.MakeRstPacket(3, true, kClientDataStreamId1,
2125 QUIC_STREAM_CANCELLED));
2126 // TLP 1
2127 quic_data.AddWrite(client_maker_.MakeDataPacket(4, kHeadersStreamId, true,
2128 false, 0, request_data));
2129 // TLP 2
2130 quic_data.AddWrite(client_maker_.MakeDataPacket(
2131 5, kHeadersStreamId, true, false, settings_offset, settings_data));
2132 // RTO 1
2133 quic_data.AddWrite(client_maker_.MakeRstPacket(6, true, kClientDataStreamId1,
2134 QUIC_STREAM_CANCELLED));
2135 quic_data.AddWrite(client_maker_.MakeDataPacket(7, kHeadersStreamId, true,
2136 false, 0, request_data));
2137 // RTO 2
2138 quic_data.AddWrite(client_maker_.MakeDataPacket(
2139 8, kHeadersStreamId, true, false, settings_offset, settings_data));
2140 quic_data.AddWrite(client_maker_.MakeRstPacket(9, true, kClientDataStreamId1,
2141 QUIC_STREAM_CANCELLED));
2142 // RTO 3
2143 quic_data.AddWrite(client_maker_.MakeDataPacket(10, kHeadersStreamId, true,
2144 false, 0, request_data));
2145 quic_data.AddWrite(client_maker_.MakeDataPacket(
2146 11, kHeadersStreamId, true, false, settings_offset, settings_data));
2147 // RTO 4
2148 quic_data.AddWrite(client_maker_.MakeRstPacket(12, true, kClientDataStreamId1,
2149 QUIC_STREAM_CANCELLED));
2150 quic_data.AddWrite(client_maker_.MakeDataPacket(13, kHeadersStreamId, true,
2151 false, 0, request_data));
2152 // RTO 5
2153 quic_data.AddWrite(client_maker_.MakeAckAndConnectionClosePacket(
2154 14, true, QuicTime::Delta::Infinite(), 0, 1, QUIC_TOO_MANY_RTOS,
2155 "5 consecutive retransmission timeouts"));
2156
2157 quic_data.AddRead(ASYNC, OK);
2158 quic_data.AddSocketDataToFactory(&socket_factory_);
2159
2160 // In order for a new QUIC session to be established via alternate-protocol
2161 // without racing an HTTP connection, we need the host resolution to happen
2162 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
2163 // connection to the the server, in this test we require confirmation
2164 // before encrypting so the HTTP job will still start.
2165 host_resolver_.set_synchronous_mode(true);
2166 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
2167 "");
2168 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
2169 AddressList address;
2170 std::unique_ptr<HostResolver::Request> request;
2171 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
2172 &request, net_log_.bound());
2173
2174 CreateSession();
2175 // Use a TestTaskRunner to avoid waiting in real time for timeouts.
2176 scoped_refptr<TestTaskRunner> quic_task_runner_(new TestTaskRunner(clock_));
2177 QuicStreamFactoryPeer::SetAlarmFactory(
2178 session_->quic_stream_factory(),
2179 base::MakeUnique<QuicChromiumAlarmFactory>(quic_task_runner_.get(),
2180 clock_));
2181
2182 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2183
2184 auto trans = base::MakeUnique<HttpNetworkTransaction>(DEFAULT_PRIORITY,
2185 session_.get());
2186 TestCompletionCallback callback;
2187 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2188 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
2189
2190 // Pump the message loop to get the request started.
2191 base::RunLoop().RunUntilIdle();
2192 // Explicitly confirm the handshake.
2193 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
2194 QuicSession::HANDSHAKE_CONFIRMED);
2195
2196 // Now cancel the request.
2197 trans.reset();
2198
2199 // Run the QUIC session to completion.
2200 quic_task_runner_->RunUntilIdle();
2201
2202 ExpectBrokenAlternateProtocolMapping();
2203
2204 ASSERT_TRUE(quic_data.AllWriteDataConsumed());
2205 }
2206
1430 TEST_P(QuicNetworkTransactionTest, 2207 TEST_P(QuicNetworkTransactionTest,
1431 DoNotUseAlternativeServiceQuicUnsupportedVersion) { 2208 DoNotUseAlternativeServiceQuicUnsupportedVersion) {
1432 std::string altsvc_header = base::StringPrintf( 2209 std::string altsvc_header = base::StringPrintf(
1433 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", version_ - 1); 2210 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", version_ - 1);
1434 MockRead http_reads[] = { 2211 MockRead http_reads[] = {
1435 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()), 2212 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
1436 MockRead("hello world"), 2213 MockRead("hello world"),
1437 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), 2214 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1438 MockRead(ASYNC, OK)}; 2215 MockRead(ASYNC, OK)};
1439 2216
(...skipping 2219 matching lines...) Expand 10 before | Expand all | Expand 10 after
3659 4436
3660 request_.url = GURL("https://mail.example.org/pushed.jpg"); 4437 request_.url = GURL("https://mail.example.org/pushed.jpg");
3661 ChunkedUploadDataStream upload_data(0); 4438 ChunkedUploadDataStream upload_data(0);
3662 upload_data.AppendData("1", 1, true); 4439 upload_data.AppendData("1", 1, true);
3663 request_.upload_data_stream = &upload_data; 4440 request_.upload_data_stream = &upload_data;
3664 SendRequestAndExpectQuicResponse("and hello!"); 4441 SendRequestAndExpectQuicResponse("and hello!");
3665 } 4442 }
3666 4443
3667 } // namespace test 4444 } // namespace test
3668 } // namespace net 4445 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/chromium/quic_http_stream.cc ('k') | net/quic/chromium/quic_stream_factory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698