| 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 <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
| 10 #include "net/quic/quic_flags.h" | 10 #include "net/quic/quic_flags.h" |
| (...skipping 748 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 759 TEST_P(QuicSentPacketManagerTest, TailLossProbeThenRTO) { | 759 TEST_P(QuicSentPacketManagerTest, TailLossProbeThenRTO) { |
| 760 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2); | 760 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2); |
| 761 | 761 |
| 762 // Send 100 packets. | 762 // Send 100 packets. |
| 763 const size_t kNumSentPackets = 100; | 763 const size_t kNumSentPackets = 100; |
| 764 for (size_t i = 1; i <= kNumSentPackets; ++i) { | 764 for (size_t i = 1; i <= kNumSentPackets; ++i) { |
| 765 SendDataPacket(i); | 765 SendDataPacket(i); |
| 766 } | 766 } |
| 767 QuicTime rto_packet_time = clock_.Now(); | 767 QuicTime rto_packet_time = clock_.Now(); |
| 768 // Advance the time. | 768 // Advance the time. |
| 769 clock_.AdvanceTime(manager_.GetRetransmissionTime().Subtract(clock_.Now())); | 769 clock_.AdvanceTime(manager_.GetRetransmissionTime() - clock_.Now()); |
| 770 | 770 |
| 771 // The first tail loss probe retransmits 1 packet. | 771 // The first tail loss probe retransmits 1 packet. |
| 772 manager_.OnRetransmissionTimeout(); | 772 manager_.OnRetransmissionTimeout(); |
| 773 QuicPathId path_id = kInvalidPathId; | 773 QuicPathId path_id = kInvalidPathId; |
| 774 EXPECT_EQ( | 774 EXPECT_EQ( |
| 775 QuicTime::Delta::Zero(), | 775 QuicTime::Delta::Zero(), |
| 776 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA, &path_id)); | 776 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA, &path_id)); |
| 777 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | 777 EXPECT_FALSE(manager_.HasPendingRetransmissions()); |
| 778 manager_.MaybeRetransmitTailLossProbe(); | 778 manager_.MaybeRetransmitTailLossProbe(); |
| 779 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | 779 EXPECT_TRUE(manager_.HasPendingRetransmissions()); |
| 780 RetransmitNextPacket(101); | 780 RetransmitNextPacket(101); |
| 781 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _)) | 781 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _)) |
| 782 .WillOnce(Return(QuicTime::Delta::Infinite())); | 782 .WillOnce(Return(QuicTime::Delta::Infinite())); |
| 783 EXPECT_EQ( | 783 EXPECT_EQ( |
| 784 QuicTime::Delta::Infinite(), | 784 QuicTime::Delta::Infinite(), |
| 785 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA, &path_id)); | 785 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA, &path_id)); |
| 786 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | 786 EXPECT_FALSE(manager_.HasPendingRetransmissions()); |
| 787 clock_.AdvanceTime(manager_.GetRetransmissionTime().Subtract(clock_.Now())); | 787 clock_.AdvanceTime(manager_.GetRetransmissionTime() - clock_.Now()); |
| 788 | 788 |
| 789 // The second tail loss probe retransmits 1 packet. | 789 // The second tail loss probe retransmits 1 packet. |
| 790 manager_.OnRetransmissionTimeout(); | 790 manager_.OnRetransmissionTimeout(); |
| 791 EXPECT_EQ( | 791 EXPECT_EQ( |
| 792 QuicTime::Delta::Zero(), | 792 QuicTime::Delta::Zero(), |
| 793 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA, &path_id)); | 793 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA, &path_id)); |
| 794 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | 794 EXPECT_FALSE(manager_.HasPendingRetransmissions()); |
| 795 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe()); | 795 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe()); |
| 796 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | 796 EXPECT_TRUE(manager_.HasPendingRetransmissions()); |
| 797 RetransmitNextPacket(102); | 797 RetransmitNextPacket(102); |
| 798 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _)) | 798 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _)) |
| 799 .WillOnce(Return(QuicTime::Delta::Infinite())); | 799 .WillOnce(Return(QuicTime::Delta::Infinite())); |
| 800 EXPECT_EQ( | 800 EXPECT_EQ( |
| 801 QuicTime::Delta::Infinite(), | 801 QuicTime::Delta::Infinite(), |
| 802 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA, &path_id)); | 802 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA, &path_id)); |
| 803 | 803 |
| 804 // Ensure the RTO is set based on the correct packet. | 804 // Ensure the RTO is set based on the correct packet. |
| 805 rto_packet_time = clock_.Now(); | 805 rto_packet_time = clock_.Now(); |
| 806 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) | 806 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) |
| 807 .WillOnce(Return(QuicTime::Delta::FromSeconds(1))); | 807 .WillOnce(Return(QuicTime::Delta::FromSeconds(1))); |
| 808 EXPECT_EQ(rto_packet_time.Add(QuicTime::Delta::FromSeconds(1)), | 808 EXPECT_EQ(rto_packet_time + QuicTime::Delta::FromSeconds(1), |
| 809 manager_.GetRetransmissionTime()); | 809 manager_.GetRetransmissionTime()); |
| 810 | 810 |
| 811 // Advance the time enough to ensure all packets are RTO'd. | 811 // Advance the time enough to ensure all packets are RTO'd. |
| 812 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000)); | 812 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000)); |
| 813 | 813 |
| 814 manager_.OnRetransmissionTimeout(); | 814 manager_.OnRetransmissionTimeout(); |
| 815 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | 815 EXPECT_TRUE(manager_.HasPendingRetransmissions()); |
| 816 EXPECT_EQ(2u, stats_.tlp_count); | 816 EXPECT_EQ(2u, stats_.tlp_count); |
| 817 EXPECT_EQ(1u, stats_.rto_count); | 817 EXPECT_EQ(1u, stats_.rto_count); |
| 818 | 818 |
| (...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1188 TEST_P(QuicSentPacketManagerTest, GetTransmissionTime) { | 1188 TEST_P(QuicSentPacketManagerTest, GetTransmissionTime) { |
| 1189 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime()); | 1189 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime()); |
| 1190 } | 1190 } |
| 1191 | 1191 |
| 1192 TEST_P(QuicSentPacketManagerTest, GetTransmissionTimeCryptoHandshake) { | 1192 TEST_P(QuicSentPacketManagerTest, GetTransmissionTimeCryptoHandshake) { |
| 1193 SendCryptoPacket(1); | 1193 SendCryptoPacket(1); |
| 1194 | 1194 |
| 1195 // Check the min. | 1195 // Check the min. |
| 1196 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats()); | 1196 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats()); |
| 1197 rtt_stats->set_initial_rtt_us(1 * kNumMicrosPerMilli); | 1197 rtt_stats->set_initial_rtt_us(1 * kNumMicrosPerMilli); |
| 1198 EXPECT_EQ(clock_.Now().Add(QuicTime::Delta::FromMilliseconds(10)), | 1198 EXPECT_EQ(clock_.Now() + QuicTime::Delta::FromMilliseconds(10), |
| 1199 manager_.GetRetransmissionTime()); | 1199 manager_.GetRetransmissionTime()); |
| 1200 | 1200 |
| 1201 // Test with a standard smoothed RTT. | 1201 // Test with a standard smoothed RTT. |
| 1202 rtt_stats->set_initial_rtt_us(100 * kNumMicrosPerMilli); | 1202 rtt_stats->set_initial_rtt_us(100 * kNumMicrosPerMilli); |
| 1203 | 1203 |
| 1204 QuicTime::Delta srtt = | 1204 QuicTime::Delta srtt = |
| 1205 QuicTime::Delta::FromMicroseconds(rtt_stats->initial_rtt_us()); | 1205 QuicTime::Delta::FromMicroseconds(rtt_stats->initial_rtt_us()); |
| 1206 QuicTime expected_time = clock_.Now().Add(srtt.Multiply(1.5)); | 1206 QuicTime expected_time = clock_.Now() + 1.5 * srtt; |
| 1207 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); | 1207 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); |
| 1208 | 1208 |
| 1209 // Retransmit the packet by invoking the retransmission timeout. | 1209 // Retransmit the packet by invoking the retransmission timeout. |
| 1210 clock_.AdvanceTime(srtt.Multiply(1.5)); | 1210 clock_.AdvanceTime(1.5 * srtt); |
| 1211 manager_.OnRetransmissionTimeout(); | 1211 manager_.OnRetransmissionTimeout(); |
| 1212 RetransmitNextPacket(2); | 1212 RetransmitNextPacket(2); |
| 1213 | 1213 |
| 1214 // The retransmission time should now be twice as far in the future. | 1214 // The retransmission time should now be twice as far in the future. |
| 1215 expected_time = clock_.Now().Add(srtt.Multiply(2).Multiply(1.5)); | 1215 expected_time = clock_.Now() + srtt * 2 * 1.5; |
| 1216 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); | 1216 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); |
| 1217 } | 1217 } |
| 1218 | 1218 |
| 1219 TEST_P(QuicSentPacketManagerTest, GetTransmissionTimeTailLossProbe) { | 1219 TEST_P(QuicSentPacketManagerTest, GetTransmissionTimeTailLossProbe) { |
| 1220 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2); | 1220 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2); |
| 1221 SendDataPacket(1); | 1221 SendDataPacket(1); |
| 1222 SendDataPacket(2); | 1222 SendDataPacket(2); |
| 1223 | 1223 |
| 1224 // Check the min. | 1224 // Check the min. |
| 1225 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats()); | 1225 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats()); |
| 1226 rtt_stats->set_initial_rtt_us(1 * kNumMicrosPerMilli); | 1226 rtt_stats->set_initial_rtt_us(1 * kNumMicrosPerMilli); |
| 1227 EXPECT_EQ(clock_.Now().Add(QuicTime::Delta::FromMilliseconds(10)), | 1227 EXPECT_EQ(clock_.Now() + QuicTime::Delta::FromMilliseconds(10), |
| 1228 manager_.GetRetransmissionTime()); | 1228 manager_.GetRetransmissionTime()); |
| 1229 | 1229 |
| 1230 // Test with a standard smoothed RTT. | 1230 // Test with a standard smoothed RTT. |
| 1231 rtt_stats->set_initial_rtt_us(100 * kNumMicrosPerMilli); | 1231 rtt_stats->set_initial_rtt_us(100 * kNumMicrosPerMilli); |
| 1232 QuicTime::Delta srtt = | 1232 QuicTime::Delta srtt = |
| 1233 QuicTime::Delta::FromMicroseconds(rtt_stats->initial_rtt_us()); | 1233 QuicTime::Delta::FromMicroseconds(rtt_stats->initial_rtt_us()); |
| 1234 QuicTime::Delta expected_tlp_delay = srtt.Multiply(2); | 1234 QuicTime::Delta expected_tlp_delay = 2 * srtt; |
| 1235 QuicTime expected_time = clock_.Now().Add(expected_tlp_delay); | 1235 QuicTime expected_time = clock_.Now() + expected_tlp_delay; |
| 1236 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); | 1236 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); |
| 1237 | 1237 |
| 1238 // Retransmit the packet by invoking the retransmission timeout. | 1238 // Retransmit the packet by invoking the retransmission timeout. |
| 1239 clock_.AdvanceTime(expected_tlp_delay); | 1239 clock_.AdvanceTime(expected_tlp_delay); |
| 1240 manager_.OnRetransmissionTimeout(); | 1240 manager_.OnRetransmissionTimeout(); |
| 1241 QuicPathId path_id = kInvalidPathId; | 1241 QuicPathId path_id = kInvalidPathId; |
| 1242 EXPECT_EQ( | 1242 EXPECT_EQ( |
| 1243 QuicTime::Delta::Zero(), | 1243 QuicTime::Delta::Zero(), |
| 1244 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA, &path_id)); | 1244 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA, &path_id)); |
| 1245 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | 1245 EXPECT_FALSE(manager_.HasPendingRetransmissions()); |
| 1246 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe()); | 1246 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe()); |
| 1247 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | 1247 EXPECT_TRUE(manager_.HasPendingRetransmissions()); |
| 1248 RetransmitNextPacket(3); | 1248 RetransmitNextPacket(3); |
| 1249 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _)) | 1249 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _)) |
| 1250 .WillOnce(Return(QuicTime::Delta::Infinite())); | 1250 .WillOnce(Return(QuicTime::Delta::Infinite())); |
| 1251 EXPECT_EQ( | 1251 EXPECT_EQ( |
| 1252 QuicTime::Delta::Infinite(), | 1252 QuicTime::Delta::Infinite(), |
| 1253 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA, &path_id)); | 1253 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA, &path_id)); |
| 1254 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | 1254 EXPECT_FALSE(manager_.HasPendingRetransmissions()); |
| 1255 | 1255 |
| 1256 expected_time = clock_.Now().Add(expected_tlp_delay); | 1256 expected_time = clock_.Now() + expected_tlp_delay; |
| 1257 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); | 1257 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); |
| 1258 } | 1258 } |
| 1259 | 1259 |
| 1260 TEST_P(QuicSentPacketManagerTest, GetTransmissionTimeSpuriousRTO) { | 1260 TEST_P(QuicSentPacketManagerTest, GetTransmissionTimeSpuriousRTO) { |
| 1261 const_cast<RttStats*>(manager_.GetRttStats()) | 1261 const_cast<RttStats*>(manager_.GetRttStats()) |
| 1262 ->UpdateRtt(QuicTime::Delta::FromMilliseconds(100), | 1262 ->UpdateRtt(QuicTime::Delta::FromMilliseconds(100), |
| 1263 QuicTime::Delta::Zero(), QuicTime::Zero()); | 1263 QuicTime::Delta::Zero(), QuicTime::Zero()); |
| 1264 SendDataPacket(1); | 1264 SendDataPacket(1); |
| 1265 SendDataPacket(2); | 1265 SendDataPacket(2); |
| 1266 SendDataPacket(3); | 1266 SendDataPacket(3); |
| 1267 SendDataPacket(4); | 1267 SendDataPacket(4); |
| 1268 | 1268 |
| 1269 QuicTime::Delta expected_rto_delay = QuicTime::Delta::FromMilliseconds(500); | 1269 QuicTime::Delta expected_rto_delay = QuicTime::Delta::FromMilliseconds(500); |
| 1270 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) | 1270 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) |
| 1271 .WillRepeatedly(Return(expected_rto_delay)); | 1271 .WillRepeatedly(Return(expected_rto_delay)); |
| 1272 QuicTime expected_time = clock_.Now().Add(expected_rto_delay); | 1272 QuicTime expected_time = clock_.Now() + expected_rto_delay; |
| 1273 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); | 1273 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); |
| 1274 | 1274 |
| 1275 // Retransmit the packet by invoking the retransmission timeout. | 1275 // Retransmit the packet by invoking the retransmission timeout. |
| 1276 clock_.AdvanceTime(expected_rto_delay); | 1276 clock_.AdvanceTime(expected_rto_delay); |
| 1277 manager_.OnRetransmissionTimeout(); | 1277 manager_.OnRetransmissionTimeout(); |
| 1278 // All packets are still considered inflight. | 1278 // All packets are still considered inflight. |
| 1279 EXPECT_EQ(4 * kDefaultLength, | 1279 EXPECT_EQ(4 * kDefaultLength, |
| 1280 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | 1280 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); |
| 1281 RetransmitNextPacket(5); | 1281 RetransmitNextPacket(5); |
| 1282 RetransmitNextPacket(6); | 1282 RetransmitNextPacket(6); |
| 1283 // All previous packets are inflight, plus two rto retransmissions. | 1283 // All previous packets are inflight, plus two rto retransmissions. |
| 1284 EXPECT_EQ(6 * kDefaultLength, | 1284 EXPECT_EQ(6 * kDefaultLength, |
| 1285 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | 1285 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); |
| 1286 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | 1286 EXPECT_FALSE(manager_.HasPendingRetransmissions()); |
| 1287 | 1287 |
| 1288 // The delay should double the second time. | 1288 // The delay should double the second time. |
| 1289 expected_time = clock_.Now().Add(expected_rto_delay).Add(expected_rto_delay); | 1289 expected_time = clock_.Now() + expected_rto_delay + expected_rto_delay; |
| 1290 // Once we always base the timer on the right edge, leaving the older packets | 1290 // Once we always base the timer on the right edge, leaving the older packets |
| 1291 // in flight doesn't change the timeout. | 1291 // in flight doesn't change the timeout. |
| 1292 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); | 1292 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); |
| 1293 | 1293 |
| 1294 // Ack a packet before the first RTO and ensure the RTO timeout returns to the | 1294 // Ack a packet before the first RTO and ensure the RTO timeout returns to the |
| 1295 // original value and OnRetransmissionTimeout is not called or reverted. | 1295 // original value and OnRetransmissionTimeout is not called or reverted. |
| 1296 QuicAckFrame ack_frame = InitAckFrame(2); | 1296 QuicAckFrame ack_frame = InitAckFrame(2); |
| 1297 NackPackets(1, 2, &ack_frame); | 1297 NackPackets(1, 2, &ack_frame); |
| 1298 ExpectAck(2); | 1298 ExpectAck(2); |
| 1299 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | 1299 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); |
| 1300 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | 1300 EXPECT_FALSE(manager_.HasPendingRetransmissions()); |
| 1301 EXPECT_EQ(5 * kDefaultLength, | 1301 EXPECT_EQ(5 * kDefaultLength, |
| 1302 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | 1302 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); |
| 1303 | 1303 |
| 1304 // Wait 2RTTs from now for the RTO, since it's the max of the RTO time | 1304 // Wait 2RTTs from now for the RTO, since it's the max of the RTO time |
| 1305 // and the TLP time. In production, there would always be two TLP's first. | 1305 // and the TLP time. In production, there would always be two TLP's first. |
| 1306 // Since retransmission was spurious, smoothed_rtt_ is expired, and replaced | 1306 // Since retransmission was spurious, smoothed_rtt_ is expired, and replaced |
| 1307 // by the latest RTT sample of 500ms. | 1307 // by the latest RTT sample of 500ms. |
| 1308 expected_time = clock_.Now().Add(QuicTime::Delta::FromMilliseconds(1000)); | 1308 expected_time = clock_.Now() + QuicTime::Delta::FromMilliseconds(1000); |
| 1309 // Once we always base the timer on the right edge, leaving the older packets | 1309 // Once we always base the timer on the right edge, leaving the older packets |
| 1310 // in flight doesn't change the timeout. | 1310 // in flight doesn't change the timeout. |
| 1311 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); | 1311 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); |
| 1312 } | 1312 } |
| 1313 | 1313 |
| 1314 TEST_P(QuicSentPacketManagerTest, GetTransmissionDelayMin) { | 1314 TEST_P(QuicSentPacketManagerTest, GetTransmissionDelayMin) { |
| 1315 SendDataPacket(1); | 1315 SendDataPacket(1); |
| 1316 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) | 1316 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) |
| 1317 .WillRepeatedly(Return(QuicTime::Delta::FromMilliseconds(1))); | 1317 .WillRepeatedly(Return(QuicTime::Delta::FromMilliseconds(1))); |
| 1318 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(200); | 1318 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(200); |
| 1319 | 1319 |
| 1320 // If the delay is smaller than the min, ensure it exponentially backs off | 1320 // If the delay is smaller than the min, ensure it exponentially backs off |
| 1321 // from the min. | 1321 // from the min. |
| 1322 EXPECT_CALL(*network_change_visitor_, OnPathDegrading()); | 1322 EXPECT_CALL(*network_change_visitor_, OnPathDegrading()); |
| 1323 for (int i = 0; i < 5; ++i) { | 1323 for (int i = 0; i < 5; ++i) { |
| 1324 EXPECT_EQ(delay, | 1324 EXPECT_EQ(delay, |
| 1325 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); | 1325 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); |
| 1326 delay = delay.Add(delay); | 1326 delay = delay + delay; |
| 1327 manager_.OnRetransmissionTimeout(); | 1327 manager_.OnRetransmissionTimeout(); |
| 1328 RetransmitNextPacket(i + 2); | 1328 RetransmitNextPacket(i + 2); |
| 1329 } | 1329 } |
| 1330 } | 1330 } |
| 1331 | 1331 |
| 1332 TEST_P(QuicSentPacketManagerTest, GetTransmissionDelayMax) { | 1332 TEST_P(QuicSentPacketManagerTest, GetTransmissionDelayMax) { |
| 1333 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) | 1333 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) |
| 1334 .WillOnce(Return(QuicTime::Delta::FromSeconds(500))); | 1334 .WillOnce(Return(QuicTime::Delta::FromSeconds(500))); |
| 1335 | 1335 |
| 1336 EXPECT_EQ(QuicTime::Delta::FromSeconds(60), | 1336 EXPECT_EQ(QuicTime::Delta::FromSeconds(60), |
| 1337 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); | 1337 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); |
| 1338 } | 1338 } |
| 1339 | 1339 |
| 1340 TEST_P(QuicSentPacketManagerTest, GetTransmissionDelay) { | 1340 TEST_P(QuicSentPacketManagerTest, GetTransmissionDelay) { |
| 1341 SendDataPacket(1); | 1341 SendDataPacket(1); |
| 1342 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(500); | 1342 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(500); |
| 1343 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) | 1343 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) |
| 1344 .WillRepeatedly(Return(delay)); | 1344 .WillRepeatedly(Return(delay)); |
| 1345 | 1345 |
| 1346 // Delay should back off exponentially. | 1346 // Delay should back off exponentially. |
| 1347 EXPECT_CALL(*network_change_visitor_, OnPathDegrading()); | 1347 EXPECT_CALL(*network_change_visitor_, OnPathDegrading()); |
| 1348 for (int i = 0; i < 5; ++i) { | 1348 for (int i = 0; i < 5; ++i) { |
| 1349 EXPECT_EQ(delay, | 1349 EXPECT_EQ(delay, |
| 1350 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); | 1350 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); |
| 1351 delay = delay.Add(delay); | 1351 delay = delay + delay; |
| 1352 manager_.OnRetransmissionTimeout(); | 1352 manager_.OnRetransmissionTimeout(); |
| 1353 RetransmitNextPacket(i + 2); | 1353 RetransmitNextPacket(i + 2); |
| 1354 } | 1354 } |
| 1355 } | 1355 } |
| 1356 | 1356 |
| 1357 TEST_P(QuicSentPacketManagerTest, GetLossDelay) { | 1357 TEST_P(QuicSentPacketManagerTest, GetLossDelay) { |
| 1358 MockLossAlgorithm* loss_algorithm = new MockLossAlgorithm(); | 1358 MockLossAlgorithm* loss_algorithm = new MockLossAlgorithm(); |
| 1359 QuicSentPacketManagerPeer::SetLossAlgorithm(&manager_, loss_algorithm); | 1359 QuicSentPacketManagerPeer::SetLossAlgorithm(&manager_, loss_algorithm); |
| 1360 | 1360 |
| 1361 EXPECT_CALL(*loss_algorithm, GetLossTimeout()) | 1361 EXPECT_CALL(*loss_algorithm, GetLossTimeout()) |
| 1362 .WillRepeatedly(Return(QuicTime::Zero())); | 1362 .WillRepeatedly(Return(QuicTime::Zero())); |
| 1363 SendDataPacket(1); | 1363 SendDataPacket(1); |
| 1364 SendDataPacket(2); | 1364 SendDataPacket(2); |
| 1365 | 1365 |
| 1366 // Handle an ack which causes the loss algorithm to be evaluated and | 1366 // Handle an ack which causes the loss algorithm to be evaluated and |
| 1367 // set the loss timeout. | 1367 // set the loss timeout. |
| 1368 ExpectAck(2); | 1368 ExpectAck(2); |
| 1369 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _)); | 1369 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _)); |
| 1370 QuicAckFrame ack_frame = InitAckFrame(2); | 1370 QuicAckFrame ack_frame = InitAckFrame(2); |
| 1371 NackPackets(1, 2, &ack_frame); | 1371 NackPackets(1, 2, &ack_frame); |
| 1372 manager_.OnIncomingAck(ack_frame, clock_.Now()); | 1372 manager_.OnIncomingAck(ack_frame, clock_.Now()); |
| 1373 | 1373 |
| 1374 QuicTime timeout(clock_.Now().Add(QuicTime::Delta::FromMilliseconds(10))); | 1374 QuicTime timeout(clock_.Now() + QuicTime::Delta::FromMilliseconds(10)); |
| 1375 EXPECT_CALL(*loss_algorithm, GetLossTimeout()) | 1375 EXPECT_CALL(*loss_algorithm, GetLossTimeout()) |
| 1376 .WillRepeatedly(Return(timeout)); | 1376 .WillRepeatedly(Return(timeout)); |
| 1377 EXPECT_EQ(timeout, manager_.GetRetransmissionTime()); | 1377 EXPECT_EQ(timeout, manager_.GetRetransmissionTime()); |
| 1378 | 1378 |
| 1379 // Fire the retransmission timeout and ensure the loss detection algorithm | 1379 // Fire the retransmission timeout and ensure the loss detection algorithm |
| 1380 // is invoked. | 1380 // is invoked. |
| 1381 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _)); | 1381 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _)); |
| 1382 manager_.OnRetransmissionTimeout(); | 1382 manager_.OnRetransmissionTimeout(); |
| 1383 } | 1383 } |
| 1384 | 1384 |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1615 | 1615 |
| 1616 options.push_back(kUNDO); | 1616 options.push_back(kUNDO); |
| 1617 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT); | 1617 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT); |
| 1618 client_config.SetConnectionOptionsToSend(options); | 1618 client_config.SetConnectionOptionsToSend(options); |
| 1619 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); | 1619 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); |
| 1620 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | 1620 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); |
| 1621 manager_.SetFromConfig(client_config); | 1621 manager_.SetFromConfig(client_config); |
| 1622 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUndoRetransmits(&manager_)); | 1622 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUndoRetransmits(&manager_)); |
| 1623 } | 1623 } |
| 1624 | 1624 |
| 1625 TEST_P(QuicSentPacketManagerTest, | |
| 1626 NegotiateConservativeReceiveWindowFromOptions) { | |
| 1627 ValueRestore<bool> old_flag(&FLAGS_quic_ignore_srbf, false); | |
| 1628 EXPECT_EQ(kDefaultSocketReceiveBuffer, | |
| 1629 QuicSentPacketManagerPeer::GetReceiveWindow(&manager_)); | |
| 1630 | |
| 1631 // Try to set a size below the minimum and ensure it gets set to the min. | |
| 1632 QuicConfig client_config; | |
| 1633 QuicConfigPeer::SetReceivedSocketReceiveBuffer(&client_config, 1024); | |
| 1634 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | |
| 1635 EXPECT_CALL(*send_algorithm_, | |
| 1636 SetMaxCongestionWindow(kMinSocketReceiveBuffer * 0.6)); | |
| 1637 EXPECT_CALL(*send_algorithm_, PacingRate(_)) | |
| 1638 .WillRepeatedly(Return(QuicBandwidth::Zero())); | |
| 1639 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) | |
| 1640 .WillOnce(Return(10 * kDefaultTCPMSS)); | |
| 1641 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); | |
| 1642 manager_.SetFromConfig(client_config); | |
| 1643 | |
| 1644 EXPECT_EQ(kMinSocketReceiveBuffer, | |
| 1645 QuicSentPacketManagerPeer::GetReceiveWindow(&manager_)); | |
| 1646 | |
| 1647 // Ensure the smaller send window only allows 16 packets to be sent. | |
| 1648 QuicPathId path_id = kInvalidPathId; | |
| 1649 for (QuicPacketNumber i = 1; i <= 16; ++i) { | |
| 1650 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _)) | |
| 1651 .WillOnce(Return(QuicTime::Delta::Zero())); | |
| 1652 EXPECT_EQ(QuicTime::Delta::Zero(), | |
| 1653 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA, | |
| 1654 &path_id)); | |
| 1655 EXPECT_CALL(*send_algorithm_, | |
| 1656 OnPacketSent(_, BytesInFlight(), i, kDefaultLength, | |
| 1657 HAS_RETRANSMITTABLE_DATA)) | |
| 1658 .WillOnce(Return(true)); | |
| 1659 SerializedPacket packet(CreatePacket(i, true)); | |
| 1660 manager_.OnPacketSent(&packet, kInvalidPathId, 0, clock_.Now(), | |
| 1661 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA); | |
| 1662 } | |
| 1663 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _)) | |
| 1664 .WillOnce(Return(QuicTime::Delta::Infinite())); | |
| 1665 EXPECT_EQ( | |
| 1666 QuicTime::Delta::Infinite(), | |
| 1667 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA, &path_id)); | |
| 1668 } | |
| 1669 | |
| 1670 TEST_P(QuicSentPacketManagerTest, ReceiveWindowLimited) { | |
| 1671 ValueRestore<bool> old_flag(&FLAGS_quic_ignore_srbf, false); | |
| 1672 EXPECT_EQ(kDefaultSocketReceiveBuffer, | |
| 1673 QuicSentPacketManagerPeer::GetReceiveWindow(&manager_)); | |
| 1674 | |
| 1675 // Ensure the smaller send window only allows 256 * 0.95 packets to be sent. | |
| 1676 QuicPathId path_id = kInvalidPathId; | |
| 1677 for (QuicPacketNumber i = 1; i <= 244; ++i) { | |
| 1678 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _)) | |
| 1679 .WillOnce(Return(QuicTime::Delta::Zero())); | |
| 1680 EXPECT_EQ(QuicTime::Delta::Zero(), | |
| 1681 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA, | |
| 1682 &path_id)); | |
| 1683 EXPECT_CALL(*send_algorithm_, | |
| 1684 OnPacketSent(_, BytesInFlight(), i, kDefaultLength, | |
| 1685 HAS_RETRANSMITTABLE_DATA)) | |
| 1686 .WillOnce(Return(true)); | |
| 1687 SerializedPacket packet(CreatePacket(i, true)); | |
| 1688 manager_.OnPacketSent(&packet, kInvalidPathId, 0, clock_.Now(), | |
| 1689 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA); | |
| 1690 } | |
| 1691 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _)) | |
| 1692 .WillOnce(Return(QuicTime::Delta::Infinite())); | |
| 1693 EXPECT_EQ( | |
| 1694 QuicTime::Delta::Infinite(), | |
| 1695 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA, &path_id)); | |
| 1696 } | |
| 1697 | |
| 1698 TEST_P(QuicSentPacketManagerTest, UseInitialRoundTripTimeToSend) { | 1625 TEST_P(QuicSentPacketManagerTest, UseInitialRoundTripTimeToSend) { |
| 1699 uint32_t initial_rtt_us = 325000; | 1626 uint32_t initial_rtt_us = 325000; |
| 1700 EXPECT_NE(initial_rtt_us, | 1627 EXPECT_NE(initial_rtt_us, |
| 1701 manager_.GetRttStats()->smoothed_rtt().ToMicroseconds()); | 1628 manager_.GetRttStats()->smoothed_rtt().ToMicroseconds()); |
| 1702 | 1629 |
| 1703 QuicConfig config; | 1630 QuicConfig config; |
| 1704 config.SetInitialRoundTripTimeUsToSend(initial_rtt_us); | 1631 config.SetInitialRoundTripTimeUsToSend(initial_rtt_us); |
| 1705 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | 1632 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); |
| 1706 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); | 1633 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); |
| 1707 manager_.SetFromConfig(config); | 1634 manager_.SetFromConfig(config); |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1792 ExpectAck(1); | 1719 ExpectAck(1); |
| 1793 EXPECT_CALL(*network_change_visitor_, | 1720 EXPECT_CALL(*network_change_visitor_, |
| 1794 OnPathMtuIncreased(kDefaultLength + 100)); | 1721 OnPathMtuIncreased(kDefaultLength + 100)); |
| 1795 QuicAckFrame ack_frame = InitAckFrame(1); | 1722 QuicAckFrame ack_frame = InitAckFrame(1); |
| 1796 manager_.OnIncomingAck(ack_frame, clock_.Now()); | 1723 manager_.OnIncomingAck(ack_frame, clock_.Now()); |
| 1797 } | 1724 } |
| 1798 | 1725 |
| 1799 } // namespace | 1726 } // namespace |
| 1800 } // namespace test | 1727 } // namespace test |
| 1801 } // namespace net | 1728 } // namespace net |
| OLD | NEW |