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 |