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 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
106 } | 106 } |
107 | 107 |
108 SerializedPacket CreateFecPacket(QuicPacketSequenceNumber sequence_number) { | 108 SerializedPacket CreateFecPacket(QuicPacketSequenceNumber sequence_number) { |
109 packets_.push_back(QuicPacket::NewFecPacket( | 109 packets_.push_back(QuicPacket::NewFecPacket( |
110 NULL, 0, false, PACKET_8BYTE_GUID, false, | 110 NULL, 0, false, PACKET_8BYTE_GUID, false, |
111 PACKET_6BYTE_SEQUENCE_NUMBER)); | 111 PACKET_6BYTE_SEQUENCE_NUMBER)); |
112 return SerializedPacket(sequence_number, PACKET_6BYTE_SEQUENCE_NUMBER, | 112 return SerializedPacket(sequence_number, PACKET_6BYTE_SEQUENCE_NUMBER, |
113 packets_.back(), 0u, NULL); | 113 packets_.back(), 0u, NULL); |
114 } | 114 } |
115 | 115 |
| 116 void SendDataPacket(QuicPacketSequenceNumber sequence_number) { |
| 117 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, sequence_number, _, _, _)) |
| 118 .Times(1).WillOnce(Return(true)); |
| 119 SerializedPacket packet(CreatePacket(sequence_number)); |
| 120 manager_.OnSerializedPacket(packet, clock_.ApproximateNow()); |
| 121 manager_.OnPacketSent(sequence_number, clock_.ApproximateNow(), |
| 122 packet.packet->length(), NOT_RETRANSMISSION, |
| 123 HAS_RETRANSMITTABLE_DATA); |
| 124 } |
| 125 |
| 126 // Based on QuicConnection's WritePendingRetransmissions. |
| 127 void RetransmitNextPacket( |
| 128 QuicPacketSequenceNumber retransmission_sequence_number) { |
| 129 EXPECT_TRUE(manager_.HasPendingRetransmissions()); |
| 130 EXPECT_CALL(*send_algorithm_, |
| 131 OnPacketSent(_, retransmission_sequence_number, _, _, _)) |
| 132 .Times(1).WillOnce(Return(true)); |
| 133 const QuicSentPacketManager::PendingRetransmission pending = |
| 134 manager_.NextPendingRetransmission(); |
| 135 manager_.OnRetransmittedPacket( |
| 136 pending.sequence_number, retransmission_sequence_number); |
| 137 manager_.OnPacketSent(retransmission_sequence_number, |
| 138 clock_.ApproximateNow(), 1000, |
| 139 pending.transmission_type, HAS_RETRANSMITTABLE_DATA); |
| 140 } |
| 141 |
116 testing::StrictMock<MockHelper> helper_; | 142 testing::StrictMock<MockHelper> helper_; |
117 QuicSentPacketManager manager_; | 143 QuicSentPacketManager manager_; |
118 vector<QuicPacket*> packets_; | 144 vector<QuicPacket*> packets_; |
119 MockClock clock_; | 145 MockClock clock_; |
120 MockSendAlgorithm* send_algorithm_; | 146 MockSendAlgorithm* send_algorithm_; |
121 }; | 147 }; |
122 | 148 |
123 TEST_F(QuicSentPacketManagerTest, IsUnacked) { | 149 TEST_F(QuicSentPacketManagerTest, IsUnacked) { |
124 VerifyUnackedPackets(NULL, 0); | 150 VerifyUnackedPackets(NULL, 0); |
125 | 151 |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
195 // Ack 1 but not 2. | 221 // Ack 1 but not 2. |
196 ReceivedPacketInfo received_info; | 222 ReceivedPacketInfo received_info; |
197 received_info.largest_observed = 1; | 223 received_info.largest_observed = 1; |
198 EXPECT_CALL(helper_, GetNextPacketSequenceNumber()).WillOnce(Return(3u)); | 224 EXPECT_CALL(helper_, GetNextPacketSequenceNumber()).WillOnce(Return(3u)); |
199 manager_.OnIncomingAck(received_info, QuicTime::Zero()); | 225 manager_.OnIncomingAck(received_info, QuicTime::Zero()); |
200 | 226 |
201 // 2 remains unacked, but no packets have retransmittable data. | 227 // 2 remains unacked, but no packets have retransmittable data. |
202 QuicPacketSequenceNumber unacked[] = { 2 }; | 228 QuicPacketSequenceNumber unacked[] = { 2 }; |
203 VerifyUnackedPackets(unacked, arraysize(unacked)); | 229 VerifyUnackedPackets(unacked, arraysize(unacked)); |
204 VerifyRetransmittablePackets(NULL, 0); | 230 VerifyRetransmittablePackets(NULL, 0); |
| 231 |
| 232 // Verify that if the retransmission alarm does fire to abandon packet 2, |
| 233 // the sent packet manager is not notified, since there is no retransmittable |
| 234 // data outstanding. |
| 235 manager_.OnRetransmissionTimeout(); |
205 } | 236 } |
206 | 237 |
207 TEST_F(QuicSentPacketManagerTest, RetransmitTwiceThenAckFirst) { | 238 TEST_F(QuicSentPacketManagerTest, RetransmitTwiceThenAckFirst) { |
208 SerializedPacket serialized_packet(CreatePacket(1)); | 239 SerializedPacket serialized_packet(CreatePacket(1)); |
209 | 240 |
210 manager_.OnSerializedPacket(serialized_packet, QuicTime::Zero()); | 241 manager_.OnSerializedPacket(serialized_packet, QuicTime::Zero()); |
211 RetransmitPacket(1, 2); | 242 RetransmitPacket(1, 2); |
212 RetransmitPacket(2, 3); | 243 RetransmitPacket(2, 3); |
213 | 244 |
214 // Ack 1 but not 2 or 3. | 245 // Ack 1 but not 2 or 3. |
215 ReceivedPacketInfo received_info; | 246 ReceivedPacketInfo received_info; |
216 received_info.largest_observed = 1; | 247 received_info.largest_observed = 1; |
217 EXPECT_CALL(helper_, GetNextPacketSequenceNumber()).WillOnce(Return(4u)); | 248 EXPECT_CALL(helper_, GetNextPacketSequenceNumber()).WillOnce(Return(4u)); |
218 manager_.OnIncomingAck(received_info, QuicTime::Zero()); | 249 manager_.OnIncomingAck(received_info, QuicTime::Zero()); |
219 | 250 |
220 // 3 remains unacked, but no packets have retransmittable data. | 251 // 3 remains unacked, but no packets have retransmittable data. |
221 QuicPacketSequenceNumber unacked[] = { 3 }; | 252 QuicPacketSequenceNumber unacked[] = { 3 }; |
222 VerifyUnackedPackets(unacked, arraysize(unacked)); | 253 VerifyUnackedPackets(unacked, arraysize(unacked)); |
223 VerifyRetransmittablePackets(NULL, 0); | 254 VerifyRetransmittablePackets(NULL, 0); |
| 255 |
| 256 // Verify that if the retransmission alarm does fire to abandon packet 3, |
| 257 // the sent packet manager is not notified, since there is no retransmittable |
| 258 // data outstanding. |
| 259 manager_.OnRetransmissionTimeout(); |
224 } | 260 } |
225 | 261 |
226 TEST_F(QuicSentPacketManagerTest, TruncatedAck) { | 262 TEST_F(QuicSentPacketManagerTest, TruncatedAck) { |
227 SerializedPacket serialized_packet(CreatePacket(1)); | 263 SerializedPacket serialized_packet(CreatePacket(1)); |
228 | 264 |
229 manager_.OnSerializedPacket(serialized_packet, QuicTime::Zero()); | 265 manager_.OnSerializedPacket(serialized_packet, QuicTime::Zero()); |
230 RetransmitPacket(1, 2); | 266 RetransmitPacket(1, 2); |
231 RetransmitPacket(2, 3); | 267 RetransmitPacket(2, 3); |
232 RetransmitPacket(3, 4); | 268 RetransmitPacket(3, 4); |
233 | 269 |
(...skipping 555 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
789 TEST_F(QuicSentPacketManagerTest, RetransmissionTimeout) { | 825 TEST_F(QuicSentPacketManagerTest, RetransmissionTimeout) { |
790 // Send 100 packets and then ensure all are abandoned when the RTO fires. | 826 // Send 100 packets and then ensure all are abandoned when the RTO fires. |
791 const size_t kNumSentPackets = 100; | 827 const size_t kNumSentPackets = 100; |
792 for (size_t i = 1; i <= kNumSentPackets; ++i) { | 828 for (size_t i = 1; i <= kNumSentPackets; ++i) { |
793 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 829 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
794 .Times(1).WillOnce(Return(true)); | 830 .Times(1).WillOnce(Return(true)); |
795 manager_.OnPacketSent(i, clock_.Now(), 1000, | 831 manager_.OnPacketSent(i, clock_.Now(), 1000, |
796 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA); | 832 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA); |
797 } | 833 } |
798 | 834 |
799 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout()); | |
800 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(kNumSentPackets); | 835 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(kNumSentPackets); |
801 | 836 |
802 manager_.OnRetransmissionTimeout(); | 837 manager_.OnRetransmissionTimeout(); |
803 } | 838 } |
804 | 839 |
805 TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayMin) { | 840 TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayMin) { |
806 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout()); | |
807 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(1); | 841 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(1); |
808 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) | 842 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) |
809 .WillOnce(Return(delay)); | 843 .WillOnce(Return(delay)); |
810 | 844 |
811 manager_.OnRetransmissionTimeout(); | 845 manager_.OnRetransmissionTimeout(); |
812 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), | 846 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), |
813 manager_.GetRetransmissionDelay()); | 847 manager_.GetRetransmissionDelay()); |
814 } | 848 } |
815 | 849 |
816 TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayMax) { | 850 TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayMax) { |
817 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout()); | |
818 QuicTime::Delta delay = QuicTime::Delta::FromSeconds(500); | 851 QuicTime::Delta delay = QuicTime::Delta::FromSeconds(500); |
819 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) | 852 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) |
820 .WillOnce(Return(delay)); | 853 .WillOnce(Return(delay)); |
821 | 854 |
822 manager_.OnRetransmissionTimeout(); | 855 manager_.OnRetransmissionTimeout(); |
823 EXPECT_EQ(QuicTime::Delta::FromSeconds(60), | 856 EXPECT_EQ(QuicTime::Delta::FromSeconds(60), |
824 manager_.GetRetransmissionDelay()); | 857 manager_.GetRetransmissionDelay()); |
825 } | 858 } |
826 | 859 |
827 TEST_F(QuicSentPacketManagerTest, GetTransmissionDelay) { | 860 TEST_F(QuicSentPacketManagerTest, GetTransmissionDelay) { |
| 861 SendDataPacket(1); |
828 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(500); | 862 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(500); |
829 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) | 863 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) |
830 .WillRepeatedly(Return(delay)); | 864 .WillRepeatedly(Return(delay)); |
831 | 865 |
832 // Delay should back off exponentially. | 866 // Delay should back off exponentially. |
833 for (int i = 0; i < 5; ++i) { | 867 for (int i = 0; i < 5; ++i) { |
834 EXPECT_EQ(delay, manager_.GetRetransmissionDelay()); | 868 EXPECT_EQ(delay, manager_.GetRetransmissionDelay()); |
835 delay = delay.Add(delay); | 869 delay = delay.Add(delay); |
| 870 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(i + 1, _)); |
836 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout()); | 871 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout()); |
837 manager_.OnRetransmissionTimeout(); | 872 manager_.OnRetransmissionTimeout(); |
| 873 RetransmitNextPacket(i + 2); |
838 } | 874 } |
839 } | 875 } |
840 | 876 |
841 TEST_F(QuicSentPacketManagerTest, GetTestTransmissionDelayTailDrop) { | 877 TEST_F(QuicSentPacketManagerTest, GetTestTransmissionDelayTailDrop) { |
842 FLAGS_limit_rto_increase_for_tests = true; | 878 FLAGS_limit_rto_increase_for_tests = true; |
843 | 879 |
| 880 SendDataPacket(1); |
844 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(500); | 881 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(500); |
845 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) | 882 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) |
846 .WillRepeatedly(Return(delay)); | 883 .WillRepeatedly(Return(delay)); |
847 | 884 |
848 // No backoff for the first 5 retransmissions. | 885 // No backoff for the first 5 retransmissions. |
849 for (int i = 0; i < 5; ++i) { | 886 for (int i = 0; i < 5; ++i) { |
850 EXPECT_EQ(delay, manager_.GetRetransmissionDelay()); | 887 EXPECT_EQ(delay, manager_.GetRetransmissionDelay()); |
| 888 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(i + 1, _)); |
851 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout()); | 889 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout()); |
852 manager_.OnRetransmissionTimeout(); | 890 manager_.OnRetransmissionTimeout(); |
| 891 RetransmitNextPacket(i + 2); |
853 } | 892 } |
854 | 893 |
855 // Then backoff starts | 894 // Then backoff starts |
856 EXPECT_EQ(delay.Add(delay), manager_.GetRetransmissionDelay()); | 895 EXPECT_EQ(delay.Add(delay), manager_.GetRetransmissionDelay()); |
857 } | 896 } |
858 | 897 |
859 } // namespace | 898 } // namespace |
860 } // namespace test | 899 } // namespace test |
861 } // namespace net | 900 } // namespace net |
OLD | NEW |