OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |