| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/quic/core/quic_sent_packet_manager.h" | 5 #include "net/quic/core/quic_sent_packet_manager.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include "base/memory/ptr_util.h" | 8 #include "base/memory/ptr_util.h" |
| 9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
| 10 #include "net/quic/core/quic_flags.h" | 10 #include "net/quic/core/quic_flags.h" |
| (...skipping 546 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 557 ExpectAck(4); | 557 ExpectAck(4); |
| 558 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _)); | 558 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _)); |
| 559 manager_.OnIncomingAck(ack_frame, clock_.Now()); | 559 manager_.OnIncomingAck(ack_frame, clock_.Now()); |
| 560 RetransmitAndSendPacket(3, 5, LOSS_RETRANSMISSION); | 560 RetransmitAndSendPacket(3, 5, LOSS_RETRANSMISSION); |
| 561 } | 561 } |
| 562 | 562 |
| 563 // Ack 3, which causes SpuriousRetransmitDetected to be called. | 563 // Ack 3, which causes SpuriousRetransmitDetected to be called. |
| 564 { | 564 { |
| 565 QuicAckFrame ack_frame = InitAckFrame(4); | 565 QuicAckFrame ack_frame = InitAckFrame(4); |
| 566 NackPackets(2, 3, &ack_frame); | 566 NackPackets(2, 3, &ack_frame); |
| 567 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _)); | |
| 568 EXPECT_CALL(*loss_algorithm, SpuriousRetransmitDetected(_, _, _, 5)); | |
| 569 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
| 570 } | 567 } |
| 571 } | 568 } |
| 572 | 569 |
| 573 TEST_P(QuicSentPacketManagerTest, AckPreviousTransmissionThenTruncatedAck) { | |
| 574 FLAGS_quic_loss_recovery_use_largest_acked = false; | |
| 575 if (!GetParam().missing) { | |
| 576 return; | |
| 577 } | |
| 578 SendDataPacket(1); | |
| 579 RetransmitAndSendPacket(1, 2); | |
| 580 RetransmitAndSendPacket(2, 3); | |
| 581 RetransmitAndSendPacket(3, 4); | |
| 582 SendDataPacket(5); | |
| 583 SendDataPacket(6); | |
| 584 SendDataPacket(7); | |
| 585 SendDataPacket(8); | |
| 586 SendDataPacket(9); | |
| 587 | |
| 588 // Ack previous transmission | |
| 589 { | |
| 590 QuicAckFrame ack_frame = InitAckFrame(2); | |
| 591 NackPackets(1, 2, &ack_frame); | |
| 592 ExpectAck(2); | |
| 593 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
| 594 EXPECT_TRUE(QuicSentPacketManagerPeer::IsUnacked(&manager_, 4)); | |
| 595 } | |
| 596 | |
| 597 // Truncated ack with 4 NACKs | |
| 598 { | |
| 599 QuicAckFrame ack_frame = InitAckFrame(6); | |
| 600 NackPackets(3, 7, &ack_frame); | |
| 601 ack_frame.is_truncated = true; | |
| 602 ExpectAckAndLoss(true, 1, 3); | |
| 603 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
| 604 } | |
| 605 | |
| 606 // High water mark will be raised. | |
| 607 QuicPacketNumber unacked[] = {4, 5, 6, 7, 8, 9}; | |
| 608 VerifyUnackedPackets(unacked, arraysize(unacked)); | |
| 609 QuicPacketNumber retransmittable[] = {5, 6, 7, 8, 9}; | |
| 610 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable)); | |
| 611 } | |
| 612 | |
| 613 TEST_P(QuicSentPacketManagerTest, GetLeastUnacked) { | 570 TEST_P(QuicSentPacketManagerTest, GetLeastUnacked) { |
| 614 EXPECT_EQ(1u, manager_.GetLeastUnacked(kDefaultPathId)); | 571 EXPECT_EQ(1u, manager_.GetLeastUnacked(kDefaultPathId)); |
| 615 } | 572 } |
| 616 | 573 |
| 617 TEST_P(QuicSentPacketManagerTest, GetLeastUnackedUnacked) { | 574 TEST_P(QuicSentPacketManagerTest, GetLeastUnackedUnacked) { |
| 618 SendDataPacket(1); | 575 SendDataPacket(1); |
| 619 EXPECT_EQ(1u, manager_.GetLeastUnacked(kDefaultPathId)); | 576 EXPECT_EQ(1u, manager_.GetLeastUnacked(kDefaultPathId)); |
| 620 } | 577 } |
| 621 | 578 |
| 622 TEST_P(QuicSentPacketManagerTest, AckAckAndUpdateRtt) { | 579 TEST_P(QuicSentPacketManagerTest, AckAckAndUpdateRtt) { |
| (...skipping 916 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1539 options.push_back(kNRTO); | 1496 options.push_back(kNRTO); |
| 1540 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT); | 1497 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT); |
| 1541 client_config.SetConnectionOptionsToSend(options); | 1498 client_config.SetConnectionOptionsToSend(options); |
| 1542 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); | 1499 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); |
| 1543 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | 1500 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); |
| 1544 manager_.SetFromConfig(client_config); | 1501 manager_.SetFromConfig(client_config); |
| 1545 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_)); | 1502 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_)); |
| 1546 } | 1503 } |
| 1547 | 1504 |
| 1548 TEST_P(QuicSentPacketManagerTest, NegotiateUndoFromOptionsAtServer) { | 1505 TEST_P(QuicSentPacketManagerTest, NegotiateUndoFromOptionsAtServer) { |
| 1549 FLAGS_quic_loss_recovery_use_largest_acked = true; | |
| 1550 EXPECT_FALSE(QuicSentPacketManagerPeer::GetUndoRetransmits(&manager_)); | 1506 EXPECT_FALSE(QuicSentPacketManagerPeer::GetUndoRetransmits(&manager_)); |
| 1551 QuicConfig config; | 1507 QuicConfig config; |
| 1552 QuicTagVector options; | 1508 QuicTagVector options; |
| 1553 | 1509 |
| 1554 options.push_back(kUNDO); | 1510 options.push_back(kUNDO); |
| 1555 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); | 1511 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); |
| 1556 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); | 1512 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); |
| 1557 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | 1513 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); |
| 1558 manager_.SetFromConfig(config); | 1514 manager_.SetFromConfig(config); |
| 1559 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUndoRetransmits(&manager_)); | 1515 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUndoRetransmits(&manager_)); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1591 // Ack 1 and ensure the retransmissions are cancelled and put back in flight. | 1547 // Ack 1 and ensure the retransmissions are cancelled and put back in flight. |
| 1592 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _)); | 1548 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _)); |
| 1593 ack_frame = InitAckFrame(5); | 1549 ack_frame = InitAckFrame(5); |
| 1594 NackPackets(2, kNumSentPackets, &ack_frame); | 1550 NackPackets(2, kNumSentPackets, &ack_frame); |
| 1595 manager_.OnIncomingAck(ack_frame, clock_.Now()); | 1551 manager_.OnIncomingAck(ack_frame, clock_.Now()); |
| 1596 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | 1552 EXPECT_FALSE(manager_.HasPendingRetransmissions()); |
| 1597 EXPECT_EQ(3u * kDefaultLength, BytesInFlight()); | 1553 EXPECT_EQ(3u * kDefaultLength, BytesInFlight()); |
| 1598 } | 1554 } |
| 1599 | 1555 |
| 1600 TEST_P(QuicSentPacketManagerTest, NegotiateUndoFromOptionsAtClient) { | 1556 TEST_P(QuicSentPacketManagerTest, NegotiateUndoFromOptionsAtClient) { |
| 1601 FLAGS_quic_loss_recovery_use_largest_acked = true; | |
| 1602 EXPECT_FALSE(QuicSentPacketManagerPeer::GetUndoRetransmits(&manager_)); | 1557 EXPECT_FALSE(QuicSentPacketManagerPeer::GetUndoRetransmits(&manager_)); |
| 1603 QuicConfig client_config; | 1558 QuicConfig client_config; |
| 1604 QuicTagVector options; | 1559 QuicTagVector options; |
| 1605 | 1560 |
| 1606 options.push_back(kUNDO); | 1561 options.push_back(kUNDO); |
| 1607 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT); | 1562 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT); |
| 1608 client_config.SetConnectionOptionsToSend(options); | 1563 client_config.SetConnectionOptionsToSend(options); |
| 1609 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); | 1564 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); |
| 1610 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | 1565 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); |
| 1611 manager_.SetFromConfig(client_config); | 1566 manager_.SetFromConfig(client_config); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1645 int64_t default_init_rtt = rtt_stats->initial_rtt_us(); | 1600 int64_t default_init_rtt = rtt_stats->initial_rtt_us(); |
| 1646 rtt_stats->set_initial_rtt_us(default_init_rtt * 2); | 1601 rtt_stats->set_initial_rtt_us(default_init_rtt * 2); |
| 1647 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt_us()); | 1602 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt_us()); |
| 1648 | 1603 |
| 1649 QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, 1); | 1604 QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, 1); |
| 1650 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount()); | 1605 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount()); |
| 1651 QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, 2); | 1606 QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, 2); |
| 1652 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount()); | 1607 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount()); |
| 1653 | 1608 |
| 1654 EXPECT_CALL(*send_algorithm_, OnConnectionMigration()); | 1609 EXPECT_CALL(*send_algorithm_, OnConnectionMigration()); |
| 1655 manager_.OnConnectionMigration(kDefaultPathId, UNSPECIFIED_CHANGE); | 1610 manager_.OnConnectionMigration(kDefaultPathId, IPV4_TO_IPV4_CHANGE); |
| 1656 | 1611 |
| 1657 EXPECT_EQ(default_init_rtt, rtt_stats->initial_rtt_us()); | 1612 EXPECT_EQ(default_init_rtt, rtt_stats->initial_rtt_us()); |
| 1658 EXPECT_EQ(0u, manager_.GetConsecutiveRtoCount()); | 1613 EXPECT_EQ(0u, manager_.GetConsecutiveRtoCount()); |
| 1659 EXPECT_EQ(0u, manager_.GetConsecutiveTlpCount()); | 1614 EXPECT_EQ(0u, manager_.GetConsecutiveTlpCount()); |
| 1660 } | 1615 } |
| 1661 | 1616 |
| 1662 TEST_P(QuicSentPacketManagerTest, ConnectionMigrationIPSubnetChange) { | 1617 TEST_P(QuicSentPacketManagerTest, ConnectionMigrationIPSubnetChange) { |
| 1663 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats()); | 1618 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats()); |
| 1664 int64_t default_init_rtt = rtt_stats->initial_rtt_us(); | 1619 int64_t default_init_rtt = rtt_stats->initial_rtt_us(); |
| 1665 rtt_stats->set_initial_rtt_us(default_init_rtt * 2); | 1620 rtt_stats->set_initial_rtt_us(default_init_rtt * 2); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1708 ExpectAck(1); | 1663 ExpectAck(1); |
| 1709 EXPECT_CALL(*network_change_visitor_, | 1664 EXPECT_CALL(*network_change_visitor_, |
| 1710 OnPathMtuIncreased(kDefaultLength + 100)); | 1665 OnPathMtuIncreased(kDefaultLength + 100)); |
| 1711 QuicAckFrame ack_frame = InitAckFrame(1); | 1666 QuicAckFrame ack_frame = InitAckFrame(1); |
| 1712 manager_.OnIncomingAck(ack_frame, clock_.Now()); | 1667 manager_.OnIncomingAck(ack_frame, clock_.Now()); |
| 1713 } | 1668 } |
| 1714 | 1669 |
| 1715 } // namespace | 1670 } // namespace |
| 1716 } // namespace test | 1671 } // namespace test |
| 1717 } // namespace net | 1672 } // namespace net |
| OLD | NEW |