| 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/quic_sent_packet_manager.h" | 5 #include "net/quic/quic_sent_packet_manager.h" |
| 6 | 6 |
| 7 #include "base/stl_util.h" | 7 #include "base/stl_util.h" |
| 8 #include "net/quic/test_tools/quic_sent_packet_manager_peer.h" | 8 #include "net/quic/test_tools/quic_sent_packet_manager_peer.h" |
| 9 #include "net/quic/test_tools/quic_test_utils.h" | 9 #include "net/quic/test_tools/quic_test_utils.h" |
| 10 #include "testing/gmock/include/gmock/gmock.h" | 10 #include "testing/gmock/include/gmock/gmock.h" |
| (...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 613 QuicPacketSequenceNumber unacked[] = { 1, 2 }; | 613 QuicPacketSequenceNumber unacked[] = { 1, 2 }; |
| 614 VerifyUnackedPackets(unacked, arraysize(unacked)); | 614 VerifyUnackedPackets(unacked, arraysize(unacked)); |
| 615 VerifyRetransmittablePackets(NULL, 0); | 615 VerifyRetransmittablePackets(NULL, 0); |
| 616 | 616 |
| 617 EXPECT_TRUE(manager_.HasUnackedPackets()); | 617 EXPECT_TRUE(manager_.HasUnackedPackets()); |
| 618 EXPECT_EQ(QuicTime::Zero(), | 618 EXPECT_EQ(QuicTime::Zero(), |
| 619 QuicSentPacketManagerPeer::GetSentTime(&manager_, 1)); | 619 QuicSentPacketManagerPeer::GetSentTime(&manager_, 1)); |
| 620 EXPECT_EQ(sent_time, QuicSentPacketManagerPeer::GetSentTime(&manager_, 2)); | 620 EXPECT_EQ(sent_time, QuicSentPacketManagerPeer::GetSentTime(&manager_, 2)); |
| 621 } | 621 } |
| 622 | 622 |
| 623 TEST_F(QuicSentPacketManagerTest, NackRetransmit1Packet) { | |
| 624 const size_t kNumSentPackets = 4; | |
| 625 // Transmit 4 packets. | |
| 626 for (size_t i = 1; i <= kNumSentPackets; ++i) { | |
| 627 SendDataPacket(i); | |
| 628 } | |
| 629 EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
| 630 | |
| 631 // Nack the first packet 3 times with increasing largest observed. | |
| 632 ReceivedPacketInfo received_info; | |
| 633 received_info.delta_time_largest_observed = | |
| 634 QuicTime::Delta::FromMilliseconds(5); | |
| 635 received_info.missing_packets.insert(1); | |
| 636 for (QuicPacketSequenceNumber i = 1; i <= 3; ++i) { | |
| 637 received_info.largest_observed = i + 1; | |
| 638 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); | |
| 639 EXPECT_CALL(*send_algorithm_, OnPacketAcked(i + 1, _)).Times(1); | |
| 640 if (i == 3) { | |
| 641 EXPECT_CALL(*send_algorithm_, OnPacketLost(1, _)).Times(1); | |
| 642 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _)).Times(1); | |
| 643 } | |
| 644 manager_.OnIncomingAck(received_info, clock_.Now()); | |
| 645 EXPECT_EQ( | |
| 646 i == 3 ? 1u : 0u, | |
| 647 QuicSentPacketManagerPeer::GetPendingRetransmissionCount(&manager_)); | |
| 648 EXPECT_EQ(i, QuicSentPacketManagerPeer::GetNackCount(&manager_, 1)); | |
| 649 } | |
| 650 EXPECT_EQ(1u, stats_.packets_lost); | |
| 651 } | |
| 652 | |
| 653 // A stretch ack is an ack that covers more than 1 packet of previously | |
| 654 // unacknowledged data. | |
| 655 TEST_F(QuicSentPacketManagerTest, NackRetransmit1PacketWith1StretchAck) { | |
| 656 const size_t kNumSentPackets = 4; | |
| 657 // Transmit 4 packets. | |
| 658 for (size_t i = 1; i <= kNumSentPackets; ++i) { | |
| 659 SendDataPacket(i); | |
| 660 } | |
| 661 | |
| 662 // Nack the first packet 3 times in a single StretchAck. | |
| 663 ReceivedPacketInfo received_info; | |
| 664 received_info.delta_time_largest_observed = | |
| 665 QuicTime::Delta::FromMilliseconds(5); | |
| 666 received_info.missing_packets.insert(1); | |
| 667 received_info.largest_observed = kNumSentPackets; | |
| 668 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); | |
| 669 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(3); | |
| 670 EXPECT_CALL(*send_algorithm_, OnPacketLost(1, _)).Times(1); | |
| 671 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _)).Times(1); | |
| 672 manager_.OnIncomingAck(received_info, clock_.Now()); | |
| 673 EXPECT_EQ( | |
| 674 1u, QuicSentPacketManagerPeer::GetPendingRetransmissionCount(&manager_)); | |
| 675 EXPECT_EQ(3u, QuicSentPacketManagerPeer::GetNackCount(&manager_, 1)); | |
| 676 EXPECT_EQ(1u, stats_.packets_lost); | |
| 677 } | |
| 678 | |
| 679 // Ack a packet 3 packets ahead, causing a retransmit. | |
| 680 TEST_F(QuicSentPacketManagerTest, NackRetransmit1PacketSingleAck) { | |
| 681 const size_t kNumSentPackets = 5; | |
| 682 // Transmit 5 packets. | |
| 683 for (size_t i = 1; i <= kNumSentPackets; ++i) { | |
| 684 SendDataPacket(i); | |
| 685 } | |
| 686 | |
| 687 // Nack the first packet 3 times in an AckFrame with three missing packets. | |
| 688 ReceivedPacketInfo received_info; | |
| 689 received_info.delta_time_largest_observed = | |
| 690 QuicTime::Delta::FromMilliseconds(5); | |
| 691 received_info.missing_packets.insert(1); | |
| 692 received_info.missing_packets.insert(2); | |
| 693 received_info.missing_packets.insert(3); | |
| 694 received_info.largest_observed = 4; | |
| 695 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); | |
| 696 EXPECT_CALL(*send_algorithm_, OnPacketAcked(4, _)).Times(1); | |
| 697 EXPECT_CALL(*send_algorithm_, OnPacketLost(1, _)).Times(1); | |
| 698 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _)).Times(1); | |
| 699 manager_.OnIncomingAck(received_info, clock_.Now()); | |
| 700 EXPECT_EQ( | |
| 701 1u, QuicSentPacketManagerPeer::GetPendingRetransmissionCount(&manager_)); | |
| 702 EXPECT_EQ(3u, QuicSentPacketManagerPeer::GetNackCount(&manager_, 1)); | |
| 703 EXPECT_EQ(1u, stats_.packets_lost); | |
| 704 } | |
| 705 | |
| 706 TEST_F(QuicSentPacketManagerTest, EarlyRetransmit1Packet) { | |
| 707 const size_t kNumSentPackets = 2; | |
| 708 // Transmit 2 packets. | |
| 709 for (size_t i = 1; i <= kNumSentPackets; ++i) { | |
| 710 SendDataPacket(i); | |
| 711 } | |
| 712 | |
| 713 // Early retransmit when the final packet gets acked and the first is nacked. | |
| 714 ReceivedPacketInfo received_info; | |
| 715 received_info.delta_time_largest_observed = | |
| 716 QuicTime::Delta::FromMilliseconds(5); | |
| 717 received_info.missing_packets.insert(1); | |
| 718 received_info.largest_observed = kNumSentPackets; | |
| 719 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); | |
| 720 EXPECT_CALL(*send_algorithm_, OnPacketAcked(kNumSentPackets, _)).Times(1); | |
| 721 EXPECT_CALL(*send_algorithm_, OnPacketLost(1, _)).Times(1); | |
| 722 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _)).Times(1); | |
| 723 manager_.OnIncomingAck(received_info, clock_.Now()); | |
| 724 EXPECT_EQ( | |
| 725 1u, QuicSentPacketManagerPeer::GetPendingRetransmissionCount(&manager_)); | |
| 726 EXPECT_EQ(1u, QuicSentPacketManagerPeer::GetNackCount(&manager_, 1)); | |
| 727 EXPECT_EQ(1u, stats_.packets_lost); | |
| 728 } | |
| 729 | |
| 730 TEST_F(QuicSentPacketManagerTest, EarlyRetransmitAllPackets) { | |
| 731 const size_t kNumSentPackets = 5; | |
| 732 for (size_t i = 1; i <= kNumSentPackets; ++i) { | |
| 733 SendDataPacket(i); | |
| 734 } | |
| 735 | |
| 736 // Early retransmit all packets when the final packet arrives, since we do | |
| 737 // not expect to receive any more acks. | |
| 738 ReceivedPacketInfo received_info; | |
| 739 received_info.delta_time_largest_observed = | |
| 740 QuicTime::Delta::FromMilliseconds(5); | |
| 741 received_info.missing_packets.insert(1); | |
| 742 received_info.missing_packets.insert(2); | |
| 743 received_info.missing_packets.insert(3); | |
| 744 received_info.missing_packets.insert(4); | |
| 745 received_info.largest_observed = kNumSentPackets; | |
| 746 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); | |
| 747 EXPECT_CALL(*send_algorithm_, OnPacketAcked(5, _)).Times(1); | |
| 748 EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)).Times(4); | |
| 749 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(4); | |
| 750 manager_.OnIncomingAck(received_info, clock_.Now()); | |
| 751 EXPECT_EQ( | |
| 752 4u, QuicSentPacketManagerPeer::GetPendingRetransmissionCount(&manager_)); | |
| 753 EXPECT_EQ(4u, QuicSentPacketManagerPeer::GetNackCount(&manager_, 1)); | |
| 754 EXPECT_EQ(4u, stats_.packets_lost); | |
| 755 } | |
| 756 | |
| 757 TEST_F(QuicSentPacketManagerTest, NackRetransmit2Packets) { | 623 TEST_F(QuicSentPacketManagerTest, NackRetransmit2Packets) { |
| 758 const size_t kNumSentPackets = 25; | 624 const size_t kNumSentPackets = 25; |
| 759 // Transmit 25 packets. | 625 // Transmit 25 packets. |
| 760 for (QuicPacketSequenceNumber i = 1; i <= kNumSentPackets; ++i) { | 626 for (QuicPacketSequenceNumber i = 1; i <= kNumSentPackets; ++i) { |
| 761 SendDataPacket(i); | 627 SendDataPacket(i); |
| 762 } | 628 } |
| 763 | 629 |
| 764 // Nack the first 19 packets 3 times, which does not trigger early retransmit. | 630 // Nack the first 19 packets 3 times, which does not trigger early retransmit. |
| 765 const size_t kLargestObserved = 20; | 631 const size_t kLargestObserved = 20; |
| 766 ReceivedPacketInfo received_info; | 632 ReceivedPacketInfo received_info; |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 820 } | 686 } |
| 821 | 687 |
| 822 // Ensure only the odd packets were retransmitted, since the others were not | 688 // Ensure only the odd packets were retransmitted, since the others were not |
| 823 // retransmittable(ie: acks). | 689 // retransmittable(ie: acks). |
| 824 for (size_t i = 0; i < 13; ++i) { | 690 for (size_t i = 0; i < 13; ++i) { |
| 825 EXPECT_EQ(1 + 2 * i, manager_.NextPendingRetransmission().sequence_number); | 691 EXPECT_EQ(1 + 2 * i, manager_.NextPendingRetransmission().sequence_number); |
| 826 manager_.OnRetransmittedPacket(1 + 2 * i, kNumSentPackets + 1 + i); | 692 manager_.OnRetransmittedPacket(1 + 2 * i, kNumSentPackets + 1 + i); |
| 827 } | 693 } |
| 828 } | 694 } |
| 829 | 695 |
| 830 TEST_F(QuicSentPacketManagerTest, NackTwiceThenAck) { | |
| 831 // Transmit 4 packets. | |
| 832 for (QuicPacketSequenceNumber i = 1; i <= 4; ++i) { | |
| 833 SendDataPacket(i); | |
| 834 } | |
| 835 | |
| 836 // Nack the first packet 2 times, then ack it. | |
| 837 ReceivedPacketInfo received_info; | |
| 838 received_info.missing_packets.insert(1); | |
| 839 for (size_t i = 1; i <= 3; ++i) { | |
| 840 if (i == 3) { | |
| 841 received_info.missing_packets.clear(); | |
| 842 } | |
| 843 received_info.largest_observed = i + 1; | |
| 844 received_info.delta_time_largest_observed = | |
| 845 QuicTime::Delta::FromMilliseconds(5); | |
| 846 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); | |
| 847 EXPECT_CALL(*send_algorithm_, | |
| 848 OnPacketAcked(_, _)).Times(i == 3 ? 2 : 1); | |
| 849 manager_.OnIncomingAck(received_info, clock_.Now()); | |
| 850 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
| 851 // The nack count is not available once the packet has been acked. | |
| 852 if (i != 3) { | |
| 853 EXPECT_EQ(i, QuicSentPacketManagerPeer::GetNackCount(&manager_, 1)); | |
| 854 } | |
| 855 } | |
| 856 } | |
| 857 | |
| 858 TEST_F(QuicSentPacketManagerTest, Rtt) { | 696 TEST_F(QuicSentPacketManagerTest, Rtt) { |
| 859 QuicPacketSequenceNumber sequence_number = 1; | 697 QuicPacketSequenceNumber sequence_number = 1; |
| 860 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(15); | 698 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(15); |
| 861 SendDataPacket(sequence_number); | 699 SendDataPacket(sequence_number); |
| 862 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(20)); | 700 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(20)); |
| 863 | 701 |
| 864 EXPECT_CALL(*send_algorithm_, UpdateRtt(expected_rtt)); | 702 EXPECT_CALL(*send_algorithm_, UpdateRtt(expected_rtt)); |
| 865 EXPECT_CALL(*send_algorithm_, | 703 EXPECT_CALL(*send_algorithm_, |
| 866 OnPacketAcked(sequence_number, _)).Times(1); | 704 OnPacketAcked(sequence_number, _)).Times(1); |
| 867 ReceivedPacketInfo received_info; | 705 ReceivedPacketInfo received_info; |
| (...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1278 delay = delay.Add(delay); | 1116 delay = delay.Add(delay); |
| 1279 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | 1117 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); |
| 1280 manager_.OnRetransmissionTimeout(); | 1118 manager_.OnRetransmissionTimeout(); |
| 1281 RetransmitNextPacket(i + 2); | 1119 RetransmitNextPacket(i + 2); |
| 1282 } | 1120 } |
| 1283 } | 1121 } |
| 1284 | 1122 |
| 1285 } // namespace | 1123 } // namespace |
| 1286 } // namespace test | 1124 } // namespace test |
| 1287 } // namespace net | 1125 } // namespace net |
| OLD | NEW |