| 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 17 matching lines...) Expand all Loading... |
| 28 // Disable tail loss probes for most tests. | 28 // Disable tail loss probes for most tests. |
| 29 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 0); | 29 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 0); |
| 30 // Advance the time 1s so the send times are never QuicTime::Zero. | 30 // Advance the time 1s so the send times are never QuicTime::Zero. |
| 31 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000)); | 31 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000)); |
| 32 } | 32 } |
| 33 | 33 |
| 34 virtual ~QuicSentPacketManagerTest() { | 34 virtual ~QuicSentPacketManagerTest() { |
| 35 STLDeleteElements(&packets_); | 35 STLDeleteElements(&packets_); |
| 36 } | 36 } |
| 37 | 37 |
| 38 virtual void SetUp() { |
| 39 // Ack handling requests a smoothed rtt for loss detection. |
| 40 EXPECT_CALL(*send_algorithm_, SmoothedRtt()) |
| 41 .WillRepeatedly(Return(QuicTime::Delta::FromMilliseconds(1))); |
| 42 } |
| 43 |
| 38 void VerifyUnackedPackets(QuicPacketSequenceNumber* packets, | 44 void VerifyUnackedPackets(QuicPacketSequenceNumber* packets, |
| 39 size_t num_packets) { | 45 size_t num_packets) { |
| 40 if (num_packets == 0) { | 46 if (num_packets == 0) { |
| 41 EXPECT_FALSE(manager_.HasUnackedPackets()); | 47 EXPECT_FALSE(manager_.HasUnackedPackets()); |
| 42 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetNumRetransmittablePackets( | 48 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetNumRetransmittablePackets( |
| 43 &manager_)); | 49 &manager_)); |
| 44 return; | 50 return; |
| 45 } | 51 } |
| 46 | 52 |
| 47 EXPECT_TRUE(manager_.HasUnackedPackets()); | 53 EXPECT_TRUE(manager_.HasUnackedPackets()); |
| (...skipping 559 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 607 QuicPacketSequenceNumber unacked[] = { 1, 2 }; | 613 QuicPacketSequenceNumber unacked[] = { 1, 2 }; |
| 608 VerifyUnackedPackets(unacked, arraysize(unacked)); | 614 VerifyUnackedPackets(unacked, arraysize(unacked)); |
| 609 VerifyRetransmittablePackets(NULL, 0); | 615 VerifyRetransmittablePackets(NULL, 0); |
| 610 | 616 |
| 611 EXPECT_TRUE(manager_.HasUnackedPackets()); | 617 EXPECT_TRUE(manager_.HasUnackedPackets()); |
| 612 EXPECT_EQ(QuicTime::Zero(), | 618 EXPECT_EQ(QuicTime::Zero(), |
| 613 QuicSentPacketManagerPeer::GetSentTime(&manager_, 1)); | 619 QuicSentPacketManagerPeer::GetSentTime(&manager_, 1)); |
| 614 EXPECT_EQ(sent_time, QuicSentPacketManagerPeer::GetSentTime(&manager_, 2)); | 620 EXPECT_EQ(sent_time, QuicSentPacketManagerPeer::GetSentTime(&manager_, 2)); |
| 615 } | 621 } |
| 616 | 622 |
| 617 TEST_F(QuicSentPacketManagerTest, NackRetransmit1Packet) { | |
| 618 const size_t kNumSentPackets = 4; | |
| 619 // Transmit 4 packets. | |
| 620 for (size_t i = 1; i <= kNumSentPackets; ++i) { | |
| 621 SendDataPacket(i); | |
| 622 } | |
| 623 EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
| 624 | |
| 625 // Nack the first packet 3 times with increasing largest observed. | |
| 626 ReceivedPacketInfo received_info; | |
| 627 received_info.delta_time_largest_observed = | |
| 628 QuicTime::Delta::FromMilliseconds(5); | |
| 629 received_info.missing_packets.insert(1); | |
| 630 for (QuicPacketSequenceNumber i = 1; i <= 3; ++i) { | |
| 631 received_info.largest_observed = i + 1; | |
| 632 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); | |
| 633 EXPECT_CALL(*send_algorithm_, OnPacketAcked(i + 1, _)).Times(1); | |
| 634 if (i == 3) { | |
| 635 EXPECT_CALL(*send_algorithm_, OnPacketLost(1, _)).Times(1); | |
| 636 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _)).Times(1); | |
| 637 } | |
| 638 manager_.OnIncomingAck(received_info, clock_.Now()); | |
| 639 EXPECT_EQ( | |
| 640 i == 3 ? 1u : 0u, | |
| 641 QuicSentPacketManagerPeer::GetPendingRetransmissionCount(&manager_)); | |
| 642 EXPECT_EQ(i, QuicSentPacketManagerPeer::GetNackCount(&manager_, 1)); | |
| 643 } | |
| 644 EXPECT_EQ(1u, stats_.packets_lost); | |
| 645 } | |
| 646 | |
| 647 // A stretch ack is an ack that covers more than 1 packet of previously | |
| 648 // unacknowledged data. | |
| 649 TEST_F(QuicSentPacketManagerTest, NackRetransmit1PacketWith1StretchAck) { | |
| 650 const size_t kNumSentPackets = 4; | |
| 651 // Transmit 4 packets. | |
| 652 for (size_t i = 1; i <= kNumSentPackets; ++i) { | |
| 653 SendDataPacket(i); | |
| 654 } | |
| 655 | |
| 656 // Nack the first packet 3 times in a single StretchAck. | |
| 657 ReceivedPacketInfo received_info; | |
| 658 received_info.delta_time_largest_observed = | |
| 659 QuicTime::Delta::FromMilliseconds(5); | |
| 660 received_info.missing_packets.insert(1); | |
| 661 received_info.largest_observed = kNumSentPackets; | |
| 662 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); | |
| 663 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(3); | |
| 664 EXPECT_CALL(*send_algorithm_, OnPacketLost(1, _)).Times(1); | |
| 665 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _)).Times(1); | |
| 666 manager_.OnIncomingAck(received_info, clock_.Now()); | |
| 667 EXPECT_EQ( | |
| 668 1u, QuicSentPacketManagerPeer::GetPendingRetransmissionCount(&manager_)); | |
| 669 EXPECT_EQ(3u, QuicSentPacketManagerPeer::GetNackCount(&manager_, 1)); | |
| 670 EXPECT_EQ(1u, stats_.packets_lost); | |
| 671 } | |
| 672 | |
| 673 // Ack a packet 3 packets ahead, causing a retransmit. | |
| 674 TEST_F(QuicSentPacketManagerTest, NackRetransmit1PacketSingleAck) { | |
| 675 const size_t kNumSentPackets = 5; | |
| 676 // Transmit 5 packets. | |
| 677 for (size_t i = 1; i <= kNumSentPackets; ++i) { | |
| 678 SendDataPacket(i); | |
| 679 } | |
| 680 | |
| 681 // Nack the first packet 3 times in an AckFrame with three missing packets. | |
| 682 ReceivedPacketInfo received_info; | |
| 683 received_info.delta_time_largest_observed = | |
| 684 QuicTime::Delta::FromMilliseconds(5); | |
| 685 received_info.missing_packets.insert(1); | |
| 686 received_info.missing_packets.insert(2); | |
| 687 received_info.missing_packets.insert(3); | |
| 688 received_info.largest_observed = 4; | |
| 689 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); | |
| 690 EXPECT_CALL(*send_algorithm_, OnPacketAcked(4, _)).Times(1); | |
| 691 EXPECT_CALL(*send_algorithm_, OnPacketLost(1, _)).Times(1); | |
| 692 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _)).Times(1); | |
| 693 manager_.OnIncomingAck(received_info, clock_.Now()); | |
| 694 EXPECT_EQ( | |
| 695 1u, QuicSentPacketManagerPeer::GetPendingRetransmissionCount(&manager_)); | |
| 696 EXPECT_EQ(3u, QuicSentPacketManagerPeer::GetNackCount(&manager_, 1)); | |
| 697 EXPECT_EQ(1u, stats_.packets_lost); | |
| 698 } | |
| 699 | |
| 700 TEST_F(QuicSentPacketManagerTest, EarlyRetransmit1Packet) { | |
| 701 const size_t kNumSentPackets = 2; | |
| 702 // Transmit 2 packets. | |
| 703 for (size_t i = 1; i <= kNumSentPackets; ++i) { | |
| 704 SendDataPacket(i); | |
| 705 } | |
| 706 | |
| 707 // Early retransmit when the final packet gets acked and the first is nacked. | |
| 708 ReceivedPacketInfo received_info; | |
| 709 received_info.delta_time_largest_observed = | |
| 710 QuicTime::Delta::FromMilliseconds(5); | |
| 711 received_info.missing_packets.insert(1); | |
| 712 received_info.largest_observed = kNumSentPackets; | |
| 713 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); | |
| 714 EXPECT_CALL(*send_algorithm_, OnPacketAcked(kNumSentPackets, _)).Times(1); | |
| 715 EXPECT_CALL(*send_algorithm_, OnPacketLost(1, _)).Times(1); | |
| 716 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _)).Times(1); | |
| 717 manager_.OnIncomingAck(received_info, clock_.Now()); | |
| 718 EXPECT_EQ( | |
| 719 1u, QuicSentPacketManagerPeer::GetPendingRetransmissionCount(&manager_)); | |
| 720 EXPECT_EQ(1u, QuicSentPacketManagerPeer::GetNackCount(&manager_, 1)); | |
| 721 EXPECT_EQ(1u, stats_.packets_lost); | |
| 722 } | |
| 723 | |
| 724 TEST_F(QuicSentPacketManagerTest, EarlyRetransmitAllPackets) { | |
| 725 const size_t kNumSentPackets = 5; | |
| 726 for (size_t i = 1; i <= kNumSentPackets; ++i) { | |
| 727 SendDataPacket(i); | |
| 728 } | |
| 729 | |
| 730 // Early retransmit all packets when the final packet arrives, since we do | |
| 731 // not expect to receive any more acks. | |
| 732 ReceivedPacketInfo received_info; | |
| 733 received_info.delta_time_largest_observed = | |
| 734 QuicTime::Delta::FromMilliseconds(5); | |
| 735 received_info.missing_packets.insert(1); | |
| 736 received_info.missing_packets.insert(2); | |
| 737 received_info.missing_packets.insert(3); | |
| 738 received_info.missing_packets.insert(4); | |
| 739 received_info.largest_observed = kNumSentPackets; | |
| 740 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); | |
| 741 EXPECT_CALL(*send_algorithm_, OnPacketAcked(5, _)).Times(1); | |
| 742 EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)).Times(4); | |
| 743 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(4); | |
| 744 manager_.OnIncomingAck(received_info, clock_.Now()); | |
| 745 EXPECT_EQ( | |
| 746 4u, QuicSentPacketManagerPeer::GetPendingRetransmissionCount(&manager_)); | |
| 747 EXPECT_EQ(4u, QuicSentPacketManagerPeer::GetNackCount(&manager_, 1)); | |
| 748 EXPECT_EQ(4u, stats_.packets_lost); | |
| 749 } | |
| 750 | |
| 751 TEST_F(QuicSentPacketManagerTest, NackRetransmit2Packets) { | 623 TEST_F(QuicSentPacketManagerTest, NackRetransmit2Packets) { |
| 752 const size_t kNumSentPackets = 25; | 624 const size_t kNumSentPackets = 25; |
| 753 // Transmit 25 packets. | 625 // Transmit 25 packets. |
| 754 for (QuicPacketSequenceNumber i = 1; i <= kNumSentPackets; ++i) { | 626 for (QuicPacketSequenceNumber i = 1; i <= kNumSentPackets; ++i) { |
| 755 SendDataPacket(i); | 627 SendDataPacket(i); |
| 756 } | 628 } |
| 757 | 629 |
| 758 // 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. |
| 759 const size_t kLargestObserved = 20; | 631 const size_t kLargestObserved = 20; |
| 760 ReceivedPacketInfo received_info; | 632 ReceivedPacketInfo received_info; |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 814 } | 686 } |
| 815 | 687 |
| 816 // 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 |
| 817 // retransmittable(ie: acks). | 689 // retransmittable(ie: acks). |
| 818 for (size_t i = 0; i < 13; ++i) { | 690 for (size_t i = 0; i < 13; ++i) { |
| 819 EXPECT_EQ(1 + 2 * i, manager_.NextPendingRetransmission().sequence_number); | 691 EXPECT_EQ(1 + 2 * i, manager_.NextPendingRetransmission().sequence_number); |
| 820 manager_.OnRetransmittedPacket(1 + 2 * i, kNumSentPackets + 1 + i); | 692 manager_.OnRetransmittedPacket(1 + 2 * i, kNumSentPackets + 1 + i); |
| 821 } | 693 } |
| 822 } | 694 } |
| 823 | 695 |
| 824 TEST_F(QuicSentPacketManagerTest, NackTwiceThenAck) { | |
| 825 // Transmit 4 packets. | |
| 826 for (QuicPacketSequenceNumber i = 1; i <= 4; ++i) { | |
| 827 SendDataPacket(i); | |
| 828 } | |
| 829 | |
| 830 // Nack the first packet 2 times, then ack it. | |
| 831 ReceivedPacketInfo received_info; | |
| 832 received_info.missing_packets.insert(1); | |
| 833 for (size_t i = 1; i <= 3; ++i) { | |
| 834 if (i == 3) { | |
| 835 received_info.missing_packets.clear(); | |
| 836 } | |
| 837 received_info.largest_observed = i + 1; | |
| 838 received_info.delta_time_largest_observed = | |
| 839 QuicTime::Delta::FromMilliseconds(5); | |
| 840 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); | |
| 841 EXPECT_CALL(*send_algorithm_, | |
| 842 OnPacketAcked(_, _)).Times(i == 3 ? 2 : 1); | |
| 843 manager_.OnIncomingAck(received_info, clock_.Now()); | |
| 844 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
| 845 // The nack count is not available once the packet has been acked. | |
| 846 if (i != 3) { | |
| 847 EXPECT_EQ(i, QuicSentPacketManagerPeer::GetNackCount(&manager_, 1)); | |
| 848 } | |
| 849 } | |
| 850 } | |
| 851 | |
| 852 TEST_F(QuicSentPacketManagerTest, Rtt) { | 696 TEST_F(QuicSentPacketManagerTest, Rtt) { |
| 853 QuicPacketSequenceNumber sequence_number = 1; | 697 QuicPacketSequenceNumber sequence_number = 1; |
| 854 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(15); | 698 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(15); |
| 855 SendDataPacket(sequence_number); | 699 SendDataPacket(sequence_number); |
| 856 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(20)); | 700 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(20)); |
| 857 | 701 |
| 858 EXPECT_CALL(*send_algorithm_, UpdateRtt(expected_rtt)); | 702 EXPECT_CALL(*send_algorithm_, UpdateRtt(expected_rtt)); |
| 859 EXPECT_CALL(*send_algorithm_, | 703 EXPECT_CALL(*send_algorithm_, |
| 860 OnPacketAcked(sequence_number, _)).Times(1); | 704 OnPacketAcked(sequence_number, _)).Times(1); |
| 861 ReceivedPacketInfo received_info; | 705 ReceivedPacketInfo received_info; |
| (...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1272 delay = delay.Add(delay); | 1116 delay = delay.Add(delay); |
| 1273 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | 1117 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); |
| 1274 manager_.OnRetransmissionTimeout(); | 1118 manager_.OnRetransmissionTimeout(); |
| 1275 RetransmitNextPacket(i + 2); | 1119 RetransmitNextPacket(i + 2); |
| 1276 } | 1120 } |
| 1277 } | 1121 } |
| 1278 | 1122 |
| 1279 } // namespace | 1123 } // namespace |
| 1280 } // namespace test | 1124 } // namespace test |
| 1281 } // namespace net | 1125 } // namespace net |
| OLD | NEW |