| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "net/quic/quic_sent_packet_manager.h" | |
| 6 | |
| 7 #include "base/stl_util.h" | |
| 8 #include "net/quic/quic_flags.h" | |
| 9 #include "net/quic/test_tools/quic_config_peer.h" | |
| 10 #include "net/quic/test_tools/quic_sent_packet_manager_peer.h" | |
| 11 #include "net/quic/test_tools/quic_test_utils.h" | |
| 12 #include "testing/gmock/include/gmock/gmock.h" | |
| 13 #include "testing/gtest/include/gtest/gtest.h" | |
| 14 | |
| 15 using std::vector; | |
| 16 using testing::AnyNumber; | |
| 17 using testing::ElementsAre; | |
| 18 using testing::IsEmpty; | |
| 19 using testing::Not; | |
| 20 using testing::Pair; | |
| 21 using testing::Pointwise; | |
| 22 using testing::Return; | |
| 23 using testing::StrictMock; | |
| 24 using testing::_; | |
| 25 | |
| 26 namespace net { | |
| 27 namespace test { | |
| 28 namespace { | |
| 29 | |
| 30 // Default packet length. | |
| 31 const uint32 kDefaultLength = 1000; | |
| 32 | |
| 33 // Matcher to check the key of the key-value pair it receives as first argument | |
| 34 // equals its second argument. | |
| 35 MATCHER(KeyEq, "") { | |
| 36 return std::tr1::get<0>(arg).first == std::tr1::get<1>(arg); | |
| 37 } | |
| 38 | |
| 39 class MockDebugDelegate : public QuicSentPacketManager::DebugDelegate { | |
| 40 public: | |
| 41 MOCK_METHOD2(OnSpuriousPacketRetransmission, | |
| 42 void(TransmissionType transmission_type, | |
| 43 QuicByteCount byte_size)); | |
| 44 }; | |
| 45 | |
| 46 class QuicSentPacketManagerTest : public ::testing::TestWithParam<bool> { | |
| 47 protected: | |
| 48 QuicSentPacketManagerTest() | |
| 49 : manager_(true, &clock_, &stats_, kCubic, kNack, false), | |
| 50 send_algorithm_(new StrictMock<MockSendAlgorithm>), | |
| 51 network_change_visitor_(new StrictMock<MockNetworkChangeVisitor>) { | |
| 52 QuicSentPacketManagerPeer::SetSendAlgorithm(&manager_, send_algorithm_); | |
| 53 // Disable tail loss probes for most tests. | |
| 54 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 0); | |
| 55 // Advance the time 1s so the send times are never QuicTime::Zero. | |
| 56 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000)); | |
| 57 manager_.set_network_change_visitor(network_change_visitor_.get()); | |
| 58 | |
| 59 EXPECT_CALL(*send_algorithm_, HasReliableBandwidthEstimate()) | |
| 60 .Times(AnyNumber()); | |
| 61 EXPECT_CALL(*send_algorithm_, BandwidthEstimate()) | |
| 62 .Times(AnyNumber()) | |
| 63 .WillRepeatedly(Return(QuicBandwidth::Zero())); | |
| 64 EXPECT_CALL(*send_algorithm_, InSlowStart()).Times(AnyNumber()); | |
| 65 EXPECT_CALL(*send_algorithm_, InRecovery()).Times(AnyNumber()); | |
| 66 } | |
| 67 | |
| 68 ~QuicSentPacketManagerTest() override { STLDeleteElements(&packets_); } | |
| 69 | |
| 70 QuicByteCount BytesInFlight() { | |
| 71 return QuicSentPacketManagerPeer::GetBytesInFlight(&manager_); | |
| 72 } | |
| 73 void VerifyUnackedPackets(QuicPacketSequenceNumber* packets, | |
| 74 size_t num_packets) { | |
| 75 if (num_packets == 0) { | |
| 76 EXPECT_FALSE(manager_.HasUnackedPackets()); | |
| 77 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetNumRetransmittablePackets( | |
| 78 &manager_)); | |
| 79 return; | |
| 80 } | |
| 81 | |
| 82 EXPECT_TRUE(manager_.HasUnackedPackets()); | |
| 83 EXPECT_EQ(packets[0], manager_.GetLeastUnacked()); | |
| 84 for (size_t i = 0; i < num_packets; ++i) { | |
| 85 EXPECT_TRUE(manager_.IsUnacked(packets[i])) << packets[i]; | |
| 86 } | |
| 87 } | |
| 88 | |
| 89 void VerifyRetransmittablePackets(QuicPacketSequenceNumber* packets, | |
| 90 size_t num_packets) { | |
| 91 EXPECT_EQ(num_packets, | |
| 92 QuicSentPacketManagerPeer::GetNumRetransmittablePackets( | |
| 93 &manager_)); | |
| 94 for (size_t i = 0; i < num_packets; ++i) { | |
| 95 EXPECT_TRUE(manager_.HasRetransmittableFrames(packets[i])) | |
| 96 << " packets[" << i << "]:" << packets[i]; | |
| 97 } | |
| 98 } | |
| 99 | |
| 100 void ExpectAck(QuicPacketSequenceNumber largest_observed) { | |
| 101 EXPECT_CALL(*send_algorithm_, OnCongestionEvent( | |
| 102 true, _, ElementsAre(Pair(largest_observed, _)), IsEmpty())); | |
| 103 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | |
| 104 EXPECT_CALL(*network_change_visitor_, OnRttChange()); | |
| 105 } | |
| 106 | |
| 107 void ExpectUpdatedRtt(QuicPacketSequenceNumber largest_observed) { | |
| 108 EXPECT_CALL(*send_algorithm_, | |
| 109 OnCongestionEvent(true, _, IsEmpty(), IsEmpty())); | |
| 110 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | |
| 111 EXPECT_CALL(*network_change_visitor_, OnRttChange()); | |
| 112 } | |
| 113 | |
| 114 void ExpectAckAndLoss(bool rtt_updated, | |
| 115 QuicPacketSequenceNumber largest_observed, | |
| 116 QuicPacketSequenceNumber lost_packet) { | |
| 117 EXPECT_CALL(*send_algorithm_, OnCongestionEvent( | |
| 118 rtt_updated, _, ElementsAre(Pair(largest_observed, _)), | |
| 119 ElementsAre(Pair(lost_packet, _)))); | |
| 120 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | |
| 121 EXPECT_CALL(*network_change_visitor_, OnRttChange()); | |
| 122 } | |
| 123 | |
| 124 // |packets_acked| and |packets_lost| should be in sequence number order. | |
| 125 void ExpectAcksAndLosses(bool rtt_updated, | |
| 126 QuicPacketSequenceNumber* packets_acked, | |
| 127 size_t num_packets_acked, | |
| 128 QuicPacketSequenceNumber* packets_lost, | |
| 129 size_t num_packets_lost) { | |
| 130 vector<QuicPacketSequenceNumber> ack_vector; | |
| 131 for (size_t i = 0; i < num_packets_acked; ++i) { | |
| 132 ack_vector.push_back(packets_acked[i]); | |
| 133 } | |
| 134 vector<QuicPacketSequenceNumber> lost_vector; | |
| 135 for (size_t i = 0; i < num_packets_lost; ++i) { | |
| 136 lost_vector.push_back(packets_lost[i]); | |
| 137 } | |
| 138 EXPECT_CALL(*send_algorithm_, | |
| 139 OnCongestionEvent(rtt_updated, _, | |
| 140 Pointwise(KeyEq(), ack_vector), | |
| 141 Pointwise(KeyEq(), lost_vector))); | |
| 142 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()). | |
| 143 Times(AnyNumber()); | |
| 144 EXPECT_CALL(*network_change_visitor_, OnRttChange()).Times(AnyNumber()); | |
| 145 } | |
| 146 | |
| 147 void RetransmitAndSendPacket(QuicPacketSequenceNumber old_sequence_number, | |
| 148 QuicPacketSequenceNumber new_sequence_number) { | |
| 149 QuicSentPacketManagerPeer::MarkForRetransmission( | |
| 150 &manager_, old_sequence_number, TLP_RETRANSMISSION); | |
| 151 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
| 152 QuicSentPacketManager::PendingRetransmission next_retransmission = | |
| 153 manager_.NextPendingRetransmission(); | |
| 154 EXPECT_EQ(old_sequence_number, next_retransmission.sequence_number); | |
| 155 EXPECT_EQ(TLP_RETRANSMISSION, | |
| 156 next_retransmission.transmission_type); | |
| 157 | |
| 158 EXPECT_CALL(*send_algorithm_, | |
| 159 OnPacketSent(_, BytesInFlight(), new_sequence_number, | |
| 160 kDefaultLength, HAS_RETRANSMITTABLE_DATA)) | |
| 161 .WillOnce(Return(true)); | |
| 162 SerializedPacket packet(CreatePacket(new_sequence_number, false)); | |
| 163 manager_.OnPacketSent(&packet, | |
| 164 old_sequence_number, | |
| 165 clock_.Now(), | |
| 166 kDefaultLength, | |
| 167 TLP_RETRANSMISSION, | |
| 168 HAS_RETRANSMITTABLE_DATA); | |
| 169 EXPECT_TRUE(QuicSentPacketManagerPeer::IsRetransmission( | |
| 170 &manager_, new_sequence_number)); | |
| 171 } | |
| 172 | |
| 173 SerializedPacket CreateDataPacket(QuicPacketSequenceNumber sequence_number) { | |
| 174 return CreatePacket(sequence_number, true); | |
| 175 } | |
| 176 | |
| 177 SerializedPacket CreatePacket(QuicPacketSequenceNumber sequence_number, | |
| 178 bool retransmittable) { | |
| 179 packets_.push_back(new QuicEncryptedPacket(nullptr, kDefaultLength)); | |
| 180 return SerializedPacket( | |
| 181 sequence_number, PACKET_6BYTE_SEQUENCE_NUMBER, packets_.back(), 0u, | |
| 182 retransmittable ? new RetransmittableFrames() : nullptr); | |
| 183 } | |
| 184 | |
| 185 SerializedPacket CreateFecPacket(QuicPacketSequenceNumber sequence_number) { | |
| 186 packets_.push_back(new QuicEncryptedPacket(nullptr, kDefaultLength)); | |
| 187 SerializedPacket serialized(sequence_number, PACKET_6BYTE_SEQUENCE_NUMBER, | |
| 188 packets_.back(), 0u, nullptr); | |
| 189 serialized.is_fec_packet = true; | |
| 190 return serialized; | |
| 191 } | |
| 192 | |
| 193 void SendDataPacket(QuicPacketSequenceNumber sequence_number) { | |
| 194 EXPECT_CALL(*send_algorithm_, | |
| 195 OnPacketSent(_, BytesInFlight(), sequence_number, _, _)) | |
| 196 .Times(1).WillOnce(Return(true)); | |
| 197 SerializedPacket packet(CreateDataPacket(sequence_number)); | |
| 198 manager_.OnPacketSent(&packet, 0, clock_.Now(), | |
| 199 packet.packet->length(), NOT_RETRANSMISSION, | |
| 200 HAS_RETRANSMITTABLE_DATA); | |
| 201 } | |
| 202 | |
| 203 void SendCryptoPacket(QuicPacketSequenceNumber sequence_number) { | |
| 204 EXPECT_CALL(*send_algorithm_, | |
| 205 OnPacketSent(_, BytesInFlight(), sequence_number, | |
| 206 kDefaultLength, HAS_RETRANSMITTABLE_DATA)) | |
| 207 .Times(1).WillOnce(Return(true)); | |
| 208 SerializedPacket packet(CreateDataPacket(sequence_number)); | |
| 209 packet.retransmittable_frames->AddStreamFrame( | |
| 210 new QuicStreamFrame(1, false, 0, IOVector())); | |
| 211 packet.retransmittable_frames->set_encryption_level(ENCRYPTION_NONE); | |
| 212 manager_.OnPacketSent(&packet, 0, clock_.Now(), | |
| 213 packet.packet->length(), NOT_RETRANSMISSION, | |
| 214 HAS_RETRANSMITTABLE_DATA); | |
| 215 } | |
| 216 | |
| 217 void SendFecPacket(QuicPacketSequenceNumber sequence_number) { | |
| 218 EXPECT_CALL(*send_algorithm_, | |
| 219 OnPacketSent(_, BytesInFlight(), sequence_number, | |
| 220 kDefaultLength, HAS_RETRANSMITTABLE_DATA)) | |
| 221 .Times(1).WillOnce(Return(true)); | |
| 222 SerializedPacket packet(CreateFecPacket(sequence_number)); | |
| 223 manager_.OnPacketSent(&packet, 0, clock_.Now(), | |
| 224 packet.packet->length(), NOT_RETRANSMISSION, | |
| 225 NO_RETRANSMITTABLE_DATA); | |
| 226 } | |
| 227 | |
| 228 void SendAckPacket(QuicPacketSequenceNumber sequence_number) { | |
| 229 EXPECT_CALL(*send_algorithm_, | |
| 230 OnPacketSent(_, BytesInFlight(), sequence_number, | |
| 231 kDefaultLength, NO_RETRANSMITTABLE_DATA)) | |
| 232 .Times(1).WillOnce(Return(false)); | |
| 233 SerializedPacket packet(CreatePacket(sequence_number, false)); | |
| 234 manager_.OnPacketSent(&packet, 0, clock_.Now(), | |
| 235 packet.packet->length(), NOT_RETRANSMISSION, | |
| 236 NO_RETRANSMITTABLE_DATA); | |
| 237 } | |
| 238 | |
| 239 // Based on QuicConnection's WritePendingRetransmissions. | |
| 240 void RetransmitNextPacket( | |
| 241 QuicPacketSequenceNumber retransmission_sequence_number) { | |
| 242 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
| 243 EXPECT_CALL(*send_algorithm_, | |
| 244 OnPacketSent(_, _, retransmission_sequence_number, | |
| 245 kDefaultLength, HAS_RETRANSMITTABLE_DATA)) | |
| 246 .Times(1).WillOnce(Return(true)); | |
| 247 const QuicSentPacketManager::PendingRetransmission pending = | |
| 248 manager_.NextPendingRetransmission(); | |
| 249 SerializedPacket packet( | |
| 250 CreatePacket(retransmission_sequence_number, false)); | |
| 251 manager_.OnPacketSent(&packet, pending.sequence_number, clock_.Now(), | |
| 252 kDefaultLength, pending.transmission_type, | |
| 253 HAS_RETRANSMITTABLE_DATA); | |
| 254 } | |
| 255 | |
| 256 QuicSentPacketManager manager_; | |
| 257 vector<QuicEncryptedPacket*> packets_; | |
| 258 MockClock clock_; | |
| 259 QuicConnectionStats stats_; | |
| 260 MockSendAlgorithm* send_algorithm_; | |
| 261 scoped_ptr<MockNetworkChangeVisitor> network_change_visitor_; | |
| 262 }; | |
| 263 | |
| 264 TEST_F(QuicSentPacketManagerTest, IsUnacked) { | |
| 265 VerifyUnackedPackets(nullptr, 0); | |
| 266 SendDataPacket(1); | |
| 267 | |
| 268 QuicPacketSequenceNumber unacked[] = { 1 }; | |
| 269 VerifyUnackedPackets(unacked, arraysize(unacked)); | |
| 270 QuicPacketSequenceNumber retransmittable[] = { 1 }; | |
| 271 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable)); | |
| 272 } | |
| 273 | |
| 274 TEST_F(QuicSentPacketManagerTest, IsUnAckedRetransmit) { | |
| 275 SendDataPacket(1); | |
| 276 RetransmitAndSendPacket(1, 2); | |
| 277 | |
| 278 EXPECT_TRUE(QuicSentPacketManagerPeer::IsRetransmission(&manager_, 2)); | |
| 279 QuicPacketSequenceNumber unacked[] = { 1, 2 }; | |
| 280 VerifyUnackedPackets(unacked, arraysize(unacked)); | |
| 281 QuicPacketSequenceNumber retransmittable[] = { 2 }; | |
| 282 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable)); | |
| 283 } | |
| 284 | |
| 285 TEST_F(QuicSentPacketManagerTest, RetransmitThenAck) { | |
| 286 SendDataPacket(1); | |
| 287 RetransmitAndSendPacket(1, 2); | |
| 288 | |
| 289 // Ack 2 but not 1. | |
| 290 QuicAckFrame ack_frame; | |
| 291 ack_frame.largest_observed = 2; | |
| 292 ack_frame.missing_packets.insert(1); | |
| 293 ExpectAck(2); | |
| 294 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
| 295 | |
| 296 // Packet 1 is unacked, pending, but not retransmittable. | |
| 297 QuicPacketSequenceNumber unacked[] = { 1 }; | |
| 298 VerifyUnackedPackets(unacked, arraysize(unacked)); | |
| 299 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | |
| 300 VerifyRetransmittablePackets(nullptr, 0); | |
| 301 } | |
| 302 | |
| 303 TEST_F(QuicSentPacketManagerTest, RetransmitThenAckBeforeSend) { | |
| 304 SendDataPacket(1); | |
| 305 QuicSentPacketManagerPeer::MarkForRetransmission( | |
| 306 &manager_, 1, TLP_RETRANSMISSION); | |
| 307 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
| 308 | |
| 309 // Ack 1. | |
| 310 QuicAckFrame ack_frame; | |
| 311 ack_frame.largest_observed = 1; | |
| 312 ExpectAck(1); | |
| 313 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
| 314 | |
| 315 // There should no longer be a pending retransmission. | |
| 316 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
| 317 | |
| 318 // No unacked packets remain. | |
| 319 VerifyUnackedPackets(nullptr, 0); | |
| 320 VerifyRetransmittablePackets(nullptr, 0); | |
| 321 EXPECT_EQ(0u, stats_.packets_spuriously_retransmitted); | |
| 322 } | |
| 323 | |
| 324 TEST_F(QuicSentPacketManagerTest, RetransmitThenAckPrevious) { | |
| 325 SendDataPacket(1); | |
| 326 RetransmitAndSendPacket(1, 2); | |
| 327 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15); | |
| 328 clock_.AdvanceTime(rtt); | |
| 329 | |
| 330 // Ack 1 but not 2. | |
| 331 ExpectAck(1); | |
| 332 QuicAckFrame ack_frame; | |
| 333 ack_frame.largest_observed = 1; | |
| 334 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
| 335 | |
| 336 // 2 remains unacked, but no packets have retransmittable data. | |
| 337 QuicPacketSequenceNumber unacked[] = { 2 }; | |
| 338 VerifyUnackedPackets(unacked, arraysize(unacked)); | |
| 339 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | |
| 340 VerifyRetransmittablePackets(nullptr, 0); | |
| 341 | |
| 342 EXPECT_EQ(1u, stats_.packets_spuriously_retransmitted); | |
| 343 } | |
| 344 | |
| 345 TEST_F(QuicSentPacketManagerTest, RetransmitThenAckPreviousThenNackRetransmit) { | |
| 346 SendDataPacket(1); | |
| 347 RetransmitAndSendPacket(1, 2); | |
| 348 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15); | |
| 349 clock_.AdvanceTime(rtt); | |
| 350 | |
| 351 // First, ACK packet 1 which makes packet 2 non-retransmittable. | |
| 352 ExpectAck(1); | |
| 353 QuicAckFrame ack_frame; | |
| 354 ack_frame.largest_observed = 1; | |
| 355 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
| 356 | |
| 357 SendDataPacket(3); | |
| 358 SendDataPacket(4); | |
| 359 SendDataPacket(5); | |
| 360 clock_.AdvanceTime(rtt); | |
| 361 | |
| 362 // Next, NACK packet 2 three times. | |
| 363 ack_frame.largest_observed = 3; | |
| 364 ack_frame.missing_packets.insert(2); | |
| 365 ExpectAck(3); | |
| 366 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
| 367 | |
| 368 ack_frame.largest_observed = 4; | |
| 369 ExpectAck(4); | |
| 370 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
| 371 | |
| 372 ack_frame.largest_observed = 5; | |
| 373 ExpectAckAndLoss(true, 5, 2); | |
| 374 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
| 375 | |
| 376 // No packets remain unacked. | |
| 377 VerifyUnackedPackets(nullptr, 0); | |
| 378 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | |
| 379 VerifyRetransmittablePackets(nullptr, 0); | |
| 380 | |
| 381 // Verify that the retransmission alarm would not fire, | |
| 382 // since there is no retransmittable data outstanding. | |
| 383 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime()); | |
| 384 } | |
| 385 | |
| 386 TEST_F(QuicSentPacketManagerTest, | |
| 387 DISABLED_RetransmitTwiceThenAckPreviousBeforeSend) { | |
| 388 SendDataPacket(1); | |
| 389 RetransmitAndSendPacket(1, 2); | |
| 390 | |
| 391 // Fire the RTO, which will mark 2 for retransmission (but will not send it). | |
| 392 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | |
| 393 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | |
| 394 manager_.OnRetransmissionTimeout(); | |
| 395 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
| 396 | |
| 397 // Ack 1 but not 2, before 2 is able to be sent. | |
| 398 // Since 1 has been retransmitted, it has already been lost, and so the | |
| 399 // send algorithm is not informed that it has been ACK'd. | |
| 400 QuicAckFrame ack_frame; | |
| 401 ack_frame.largest_observed = 1; | |
| 402 ExpectUpdatedRtt(1); | |
| 403 EXPECT_CALL(*send_algorithm_, RevertRetransmissionTimeout()); | |
| 404 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
| 405 | |
| 406 // Since 2 was marked for retransmit, when 1 is acked, 2 is kept for RTT. | |
| 407 QuicPacketSequenceNumber unacked[] = { 2 }; | |
| 408 VerifyUnackedPackets(unacked, arraysize(unacked)); | |
| 409 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | |
| 410 VerifyRetransmittablePackets(nullptr, 0); | |
| 411 | |
| 412 // Verify that the retransmission alarm would not fire, | |
| 413 // since there is no retransmittable data outstanding. | |
| 414 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime()); | |
| 415 } | |
| 416 | |
| 417 TEST_F(QuicSentPacketManagerTest, RetransmitTwiceThenAckFirst) { | |
| 418 StrictMock<MockDebugDelegate> debug_delegate; | |
| 419 EXPECT_CALL(debug_delegate, OnSpuriousPacketRetransmission( | |
| 420 TLP_RETRANSMISSION, kDefaultLength)).Times(2); | |
| 421 manager_.set_debug_delegate(&debug_delegate); | |
| 422 | |
| 423 SendDataPacket(1); | |
| 424 RetransmitAndSendPacket(1, 2); | |
| 425 RetransmitAndSendPacket(2, 3); | |
| 426 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15); | |
| 427 clock_.AdvanceTime(rtt); | |
| 428 | |
| 429 // Ack 1 but not 2 or 3. | |
| 430 ExpectAck(1); | |
| 431 QuicAckFrame ack_frame; | |
| 432 ack_frame.largest_observed = 1; | |
| 433 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
| 434 | |
| 435 // 2 and 3 remain unacked, but no packets have retransmittable data. | |
| 436 QuicPacketSequenceNumber unacked[] = { 2, 3 }; | |
| 437 VerifyUnackedPackets(unacked, arraysize(unacked)); | |
| 438 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | |
| 439 VerifyRetransmittablePackets(nullptr, 0); | |
| 440 | |
| 441 // Ensure packet 2 is lost when 4 is sent and 3 and 4 are acked. | |
| 442 SendDataPacket(4); | |
| 443 ack_frame.largest_observed = 4; | |
| 444 ack_frame.missing_packets.insert(2); | |
| 445 QuicPacketSequenceNumber acked[] = { 3, 4 }; | |
| 446 ExpectAcksAndLosses(true, acked, arraysize(acked), nullptr, 0); | |
| 447 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
| 448 | |
| 449 QuicPacketSequenceNumber unacked2[] = { 2 }; | |
| 450 VerifyUnackedPackets(unacked2, arraysize(unacked2)); | |
| 451 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | |
| 452 | |
| 453 SendDataPacket(5); | |
| 454 ack_frame.largest_observed = 5; | |
| 455 ExpectAckAndLoss(true, 5, 2); | |
| 456 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
| 457 | |
| 458 VerifyUnackedPackets(nullptr, 0); | |
| 459 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | |
| 460 EXPECT_EQ(2u, stats_.packets_spuriously_retransmitted); | |
| 461 } | |
| 462 | |
| 463 TEST_F(QuicSentPacketManagerTest, LoseButDontRetransmitRevivedPacket) { | |
| 464 SendDataPacket(1); | |
| 465 SendDataPacket(2); | |
| 466 SendFecPacket(3); | |
| 467 SendDataPacket(4); | |
| 468 | |
| 469 // Ack 2 and 3, and mark 1 as revived. | |
| 470 QuicAckFrame ack_frame; | |
| 471 ack_frame.largest_observed = 3; | |
| 472 ack_frame.missing_packets.insert(1); | |
| 473 ack_frame.revived_packets.insert(1); | |
| 474 QuicPacketSequenceNumber acked[] = { 2, 3 }; | |
| 475 ExpectAcksAndLosses(true, acked, arraysize(acked), nullptr, 0); | |
| 476 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
| 477 | |
| 478 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
| 479 QuicPacketSequenceNumber unacked[] = { 1, 4 }; | |
| 480 VerifyUnackedPackets(unacked, arraysize(unacked)); | |
| 481 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | |
| 482 QuicPacketSequenceNumber retransmittable[] = { 4 }; | |
| 483 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable)); | |
| 484 | |
| 485 // Ack the 4th packet and expect the 1st to be considered lost. | |
| 486 ack_frame.largest_observed = 4; | |
| 487 ExpectAckAndLoss(true, 4, 1); | |
| 488 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
| 489 | |
| 490 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
| 491 VerifyRetransmittablePackets(nullptr, 0); | |
| 492 } | |
| 493 | |
| 494 TEST_F(QuicSentPacketManagerTest, MarkLostThenReviveAndDontRetransmitPacket) { | |
| 495 SendDataPacket(1); | |
| 496 SendDataPacket(2); | |
| 497 SendDataPacket(3); | |
| 498 SendDataPacket(4); | |
| 499 SendFecPacket(5); | |
| 500 | |
| 501 // Ack 2, 3, and 4, and expect the 1st to be considered lost. | |
| 502 QuicAckFrame ack_frame; | |
| 503 ack_frame.largest_observed = 4; | |
| 504 ack_frame.missing_packets.insert(1); | |
| 505 QuicPacketSequenceNumber acked[] = { 2, 3, 4 }; | |
| 506 QuicPacketSequenceNumber lost[] = { 1 }; | |
| 507 ExpectAcksAndLosses(true, acked, arraysize(acked), lost, arraysize(lost)); | |
| 508 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
| 509 | |
| 510 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
| 511 QuicPacketSequenceNumber unacked[] = { 1, 5 }; | |
| 512 VerifyUnackedPackets(unacked, arraysize(unacked)); | |
| 513 QuicPacketSequenceNumber retransmittable[] = { 1 }; | |
| 514 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable)); | |
| 515 | |
| 516 // Ack 5th packet (FEC) and revive 1st packet. 1st packet should now be | |
| 517 // removed from pending retransmissions map. | |
| 518 ack_frame.largest_observed = 5; | |
| 519 ack_frame.revived_packets.insert(1); | |
| 520 ExpectAck(5); | |
| 521 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
| 522 | |
| 523 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
| 524 VerifyRetransmittablePackets(nullptr, 0); | |
| 525 } | |
| 526 | |
| 527 TEST_F(QuicSentPacketManagerTest, TruncatedAck) { | |
| 528 SendDataPacket(1); | |
| 529 RetransmitAndSendPacket(1, 2); | |
| 530 RetransmitAndSendPacket(2, 3); | |
| 531 RetransmitAndSendPacket(3, 4); | |
| 532 RetransmitAndSendPacket(4, 5); | |
| 533 | |
| 534 // Truncated ack with 4 NACKs, so the first packet is lost. | |
| 535 QuicAckFrame ack_frame; | |
| 536 ack_frame.largest_observed = 4; | |
| 537 ack_frame.missing_packets.insert(1); | |
| 538 ack_frame.missing_packets.insert(2); | |
| 539 ack_frame.missing_packets.insert(3); | |
| 540 ack_frame.missing_packets.insert(4); | |
| 541 ack_frame.is_truncated = true; | |
| 542 | |
| 543 QuicPacketSequenceNumber lost[] = { 1 }; | |
| 544 ExpectAcksAndLosses(true, nullptr, 0, lost, arraysize(lost)); | |
| 545 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
| 546 | |
| 547 // High water mark will be raised. | |
| 548 QuicPacketSequenceNumber unacked[] = { 2, 3, 4, 5 }; | |
| 549 VerifyUnackedPackets(unacked, arraysize(unacked)); | |
| 550 QuicPacketSequenceNumber retransmittable[] = { 5 }; | |
| 551 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable)); | |
| 552 } | |
| 553 | |
| 554 TEST_F(QuicSentPacketManagerTest, AckPreviousTransmissionThenTruncatedAck) { | |
| 555 SendDataPacket(1); | |
| 556 RetransmitAndSendPacket(1, 2); | |
| 557 RetransmitAndSendPacket(2, 3); | |
| 558 RetransmitAndSendPacket(3, 4); | |
| 559 SendDataPacket(5); | |
| 560 SendDataPacket(6); | |
| 561 SendDataPacket(7); | |
| 562 SendDataPacket(8); | |
| 563 SendDataPacket(9); | |
| 564 | |
| 565 // Ack previous transmission | |
| 566 { | |
| 567 QuicAckFrame ack_frame; | |
| 568 ack_frame.largest_observed = 2; | |
| 569 ack_frame.missing_packets.insert(1); | |
| 570 ExpectAck(2); | |
| 571 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
| 572 EXPECT_TRUE(manager_.IsUnacked(4)); | |
| 573 } | |
| 574 | |
| 575 // Truncated ack with 4 NACKs | |
| 576 { | |
| 577 QuicAckFrame ack_frame; | |
| 578 ack_frame.largest_observed = 6; | |
| 579 ack_frame.missing_packets.insert(3); | |
| 580 ack_frame.missing_packets.insert(4); | |
| 581 ack_frame.missing_packets.insert(5); | |
| 582 ack_frame.missing_packets.insert(6); | |
| 583 ack_frame.is_truncated = true; | |
| 584 ExpectAckAndLoss(true, 1, 3); | |
| 585 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
| 586 } | |
| 587 | |
| 588 // High water mark will be raised. | |
| 589 QuicPacketSequenceNumber unacked[] = { 4, 5, 6, 7, 8, 9 }; | |
| 590 VerifyUnackedPackets(unacked, arraysize(unacked)); | |
| 591 QuicPacketSequenceNumber retransmittable[] = { 5, 6, 7, 8, 9 }; | |
| 592 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable)); | |
| 593 } | |
| 594 | |
| 595 TEST_F(QuicSentPacketManagerTest, GetLeastUnacked) { | |
| 596 EXPECT_EQ(1u, manager_.GetLeastUnacked()); | |
| 597 } | |
| 598 | |
| 599 TEST_F(QuicSentPacketManagerTest, GetLeastUnackedUnacked) { | |
| 600 SendDataPacket(1); | |
| 601 EXPECT_EQ(1u, manager_.GetLeastUnacked()); | |
| 602 } | |
| 603 | |
| 604 TEST_F(QuicSentPacketManagerTest, GetLeastUnackedUnackedFec) { | |
| 605 SendFecPacket(1); | |
| 606 EXPECT_EQ(1u, manager_.GetLeastUnacked()); | |
| 607 } | |
| 608 | |
| 609 TEST_F(QuicSentPacketManagerTest, GetLeastUnackedAndDiscard) { | |
| 610 VerifyUnackedPackets(nullptr, 0); | |
| 611 | |
| 612 SendFecPacket(1); | |
| 613 EXPECT_EQ(1u, manager_.GetLeastUnacked()); | |
| 614 | |
| 615 SendFecPacket(2); | |
| 616 EXPECT_EQ(1u, manager_.GetLeastUnacked()); | |
| 617 | |
| 618 SendFecPacket(3); | |
| 619 EXPECT_EQ(1u, manager_.GetLeastUnacked()); | |
| 620 | |
| 621 QuicPacketSequenceNumber unacked[] = { 1, 2, 3 }; | |
| 622 VerifyUnackedPackets(unacked, arraysize(unacked)); | |
| 623 VerifyRetransmittablePackets(nullptr, 0); | |
| 624 | |
| 625 // Ack 2, so there's an rtt update. | |
| 626 ExpectAck(2); | |
| 627 QuicAckFrame ack_frame; | |
| 628 ack_frame.largest_observed = 2; | |
| 629 ack_frame.missing_packets.insert(1); | |
| 630 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
| 631 | |
| 632 EXPECT_EQ(1u, manager_.GetLeastUnacked()); | |
| 633 } | |
| 634 | |
| 635 TEST_F(QuicSentPacketManagerTest, GetSentTime) { | |
| 636 VerifyUnackedPackets(nullptr, 0); | |
| 637 | |
| 638 QuicTime sent_time = clock_.Now(); | |
| 639 SendFecPacket(1); | |
| 640 QuicTime sent_time2 = clock_.Now(); | |
| 641 SendFecPacket(2); | |
| 642 QuicPacketSequenceNumber unacked[] = { 1, 2 }; | |
| 643 VerifyUnackedPackets(unacked, arraysize(unacked)); | |
| 644 VerifyRetransmittablePackets(nullptr, 0); | |
| 645 | |
| 646 EXPECT_TRUE(manager_.HasUnackedPackets()); | |
| 647 EXPECT_EQ(sent_time, QuicSentPacketManagerPeer::GetSentTime(&manager_, 1)); | |
| 648 EXPECT_EQ(sent_time2, QuicSentPacketManagerPeer::GetSentTime(&manager_, 2)); | |
| 649 } | |
| 650 | |
| 651 TEST_F(QuicSentPacketManagerTest, AckAckAndUpdateRtt) { | |
| 652 SendDataPacket(1); | |
| 653 SendAckPacket(2); | |
| 654 | |
| 655 // Now ack the ack and expect an RTT update. | |
| 656 QuicAckFrame ack_frame; | |
| 657 ack_frame.largest_observed = 2; | |
| 658 ack_frame.delta_time_largest_observed = | |
| 659 QuicTime::Delta::FromMilliseconds(5); | |
| 660 | |
| 661 ExpectAck(1); | |
| 662 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
| 663 | |
| 664 SendAckPacket(3); | |
| 665 | |
| 666 // Now ack the ack and expect only an RTT update. | |
| 667 ack_frame.largest_observed = 3; | |
| 668 ExpectUpdatedRtt(3); | |
| 669 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
| 670 } | |
| 671 | |
| 672 TEST_F(QuicSentPacketManagerTest, Rtt) { | |
| 673 QuicPacketSequenceNumber sequence_number = 1; | |
| 674 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(15); | |
| 675 SendDataPacket(sequence_number); | |
| 676 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(20)); | |
| 677 | |
| 678 ExpectAck(sequence_number); | |
| 679 QuicAckFrame ack_frame; | |
| 680 ack_frame.largest_observed = sequence_number; | |
| 681 ack_frame.delta_time_largest_observed = | |
| 682 QuicTime::Delta::FromMilliseconds(5); | |
| 683 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
| 684 EXPECT_EQ(expected_rtt, | |
| 685 QuicSentPacketManagerPeer::GetRttStats(&manager_)->latest_rtt()); | |
| 686 } | |
| 687 | |
| 688 TEST_F(QuicSentPacketManagerTest, RttWithInvalidDelta) { | |
| 689 // Expect that the RTT is equal to the local time elapsed, since the | |
| 690 // delta_time_largest_observed is larger than the local time elapsed | |
| 691 // and is hence invalid. | |
| 692 QuicPacketSequenceNumber sequence_number = 1; | |
| 693 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10); | |
| 694 SendDataPacket(sequence_number); | |
| 695 clock_.AdvanceTime(expected_rtt); | |
| 696 | |
| 697 ExpectAck(sequence_number); | |
| 698 QuicAckFrame ack_frame; | |
| 699 ack_frame.largest_observed = sequence_number; | |
| 700 ack_frame.delta_time_largest_observed = | |
| 701 QuicTime::Delta::FromMilliseconds(11); | |
| 702 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
| 703 EXPECT_EQ(expected_rtt, | |
| 704 QuicSentPacketManagerPeer::GetRttStats(&manager_)->latest_rtt()); | |
| 705 } | |
| 706 | |
| 707 TEST_F(QuicSentPacketManagerTest, RttWithInfiniteDelta) { | |
| 708 // Expect that the RTT is equal to the local time elapsed, since the | |
| 709 // delta_time_largest_observed is infinite, and is hence invalid. | |
| 710 QuicPacketSequenceNumber sequence_number = 1; | |
| 711 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10); | |
| 712 SendDataPacket(sequence_number); | |
| 713 clock_.AdvanceTime(expected_rtt); | |
| 714 | |
| 715 ExpectAck(sequence_number); | |
| 716 QuicAckFrame ack_frame; | |
| 717 ack_frame.largest_observed = sequence_number; | |
| 718 ack_frame.delta_time_largest_observed = QuicTime::Delta::Infinite(); | |
| 719 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
| 720 EXPECT_EQ(expected_rtt, | |
| 721 QuicSentPacketManagerPeer::GetRttStats(&manager_)->latest_rtt()); | |
| 722 } | |
| 723 | |
| 724 TEST_F(QuicSentPacketManagerTest, RttZeroDelta) { | |
| 725 // Expect that the RTT is the time between send and receive since the | |
| 726 // delta_time_largest_observed is zero. | |
| 727 QuicPacketSequenceNumber sequence_number = 1; | |
| 728 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10); | |
| 729 SendDataPacket(sequence_number); | |
| 730 clock_.AdvanceTime(expected_rtt); | |
| 731 | |
| 732 ExpectAck(sequence_number); | |
| 733 QuicAckFrame ack_frame; | |
| 734 ack_frame.largest_observed = sequence_number; | |
| 735 ack_frame.delta_time_largest_observed = QuicTime::Delta::Zero(); | |
| 736 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
| 737 EXPECT_EQ(expected_rtt, | |
| 738 QuicSentPacketManagerPeer::GetRttStats(&manager_)->latest_rtt()); | |
| 739 } | |
| 740 | |
| 741 TEST_F(QuicSentPacketManagerTest, TailLossProbeTimeout) { | |
| 742 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2); | |
| 743 | |
| 744 // Send 1 packet. | |
| 745 QuicPacketSequenceNumber sequence_number = 1; | |
| 746 SendDataPacket(sequence_number); | |
| 747 | |
| 748 // The first tail loss probe retransmits 1 packet. | |
| 749 manager_.OnRetransmissionTimeout(); | |
| 750 EXPECT_EQ(QuicTime::Delta::Zero(), | |
| 751 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA)); | |
| 752 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
| 753 manager_.MaybeRetransmitTailLossProbe(); | |
| 754 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
| 755 RetransmitNextPacket(2); | |
| 756 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
| 757 | |
| 758 // The second tail loss probe retransmits 1 packet. | |
| 759 manager_.OnRetransmissionTimeout(); | |
| 760 EXPECT_EQ(QuicTime::Delta::Zero(), | |
| 761 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA)); | |
| 762 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
| 763 manager_.MaybeRetransmitTailLossProbe(); | |
| 764 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
| 765 RetransmitNextPacket(3); | |
| 766 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _)).WillOnce(Return( | |
| 767 QuicTime::Delta::Infinite())); | |
| 768 EXPECT_EQ(QuicTime::Delta::Infinite(), | |
| 769 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA)); | |
| 770 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
| 771 | |
| 772 // Ack the third and ensure the first two are still pending. | |
| 773 ExpectAck(3); | |
| 774 QuicAckFrame ack_frame; | |
| 775 ack_frame.largest_observed = 3; | |
| 776 ack_frame.missing_packets.insert(1); | |
| 777 ack_frame.missing_packets.insert(2); | |
| 778 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
| 779 | |
| 780 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | |
| 781 | |
| 782 // Acking two more packets will lose both of them due to nacks. | |
| 783 ack_frame.largest_observed = 5; | |
| 784 QuicPacketSequenceNumber lost[] = { 1, 2 }; | |
| 785 ExpectAcksAndLosses(false, nullptr, 0, lost, arraysize(lost)); | |
| 786 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
| 787 | |
| 788 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
| 789 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | |
| 790 EXPECT_EQ(2u, stats_.tlp_count); | |
| 791 EXPECT_EQ(0u, stats_.rto_count); | |
| 792 } | |
| 793 | |
| 794 TEST_F(QuicSentPacketManagerTest, TailLossProbeThenRTO) { | |
| 795 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2); | |
| 796 | |
| 797 // Send 100 packets. | |
| 798 const size_t kNumSentPackets = 100; | |
| 799 for (size_t i = 1; i <= kNumSentPackets; ++i) { | |
| 800 SendDataPacket(i); | |
| 801 } | |
| 802 QuicTime rto_packet_time = clock_.Now(); | |
| 803 // Advance the time. | |
| 804 clock_.AdvanceTime(manager_.GetRetransmissionTime().Subtract(clock_.Now())); | |
| 805 | |
| 806 // The first tail loss probe retransmits 1 packet. | |
| 807 manager_.OnRetransmissionTimeout(); | |
| 808 EXPECT_EQ(QuicTime::Delta::Zero(), | |
| 809 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA)); | |
| 810 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
| 811 manager_.MaybeRetransmitTailLossProbe(); | |
| 812 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
| 813 RetransmitNextPacket(101); | |
| 814 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _)).WillOnce(Return( | |
| 815 QuicTime::Delta::Infinite())); | |
| 816 EXPECT_EQ(QuicTime::Delta::Infinite(), | |
| 817 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA)); | |
| 818 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
| 819 clock_.AdvanceTime(manager_.GetRetransmissionTime().Subtract(clock_.Now())); | |
| 820 | |
| 821 // The second tail loss probe retransmits 1 packet. | |
| 822 manager_.OnRetransmissionTimeout(); | |
| 823 EXPECT_EQ(QuicTime::Delta::Zero(), | |
| 824 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA)); | |
| 825 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
| 826 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe()); | |
| 827 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
| 828 RetransmitNextPacket(102); | |
| 829 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _)).WillOnce(Return( | |
| 830 QuicTime::Delta::Infinite())); | |
| 831 EXPECT_EQ(QuicTime::Delta::Infinite(), | |
| 832 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA)); | |
| 833 | |
| 834 // Ensure the RTO is set based on the correct packet. | |
| 835 if (FLAGS_quic_rto_uses_last_sent) { | |
| 836 rto_packet_time = clock_.Now(); | |
| 837 } | |
| 838 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) | |
| 839 .WillOnce(Return(QuicTime::Delta::FromSeconds(1))); | |
| 840 EXPECT_EQ(rto_packet_time.Add(QuicTime::Delta::FromSeconds(1)), | |
| 841 manager_.GetRetransmissionTime()); | |
| 842 | |
| 843 // Advance the time enough to ensure all packets are RTO'd. | |
| 844 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000)); | |
| 845 | |
| 846 if (!FLAGS_quic_use_new_rto) { | |
| 847 // The final RTO abandons all of them. | |
| 848 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | |
| 849 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | |
| 850 } | |
| 851 manager_.OnRetransmissionTimeout(); | |
| 852 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
| 853 EXPECT_EQ(2u, stats_.tlp_count); | |
| 854 EXPECT_EQ(1u, stats_.rto_count); | |
| 855 | |
| 856 // Send and Ack the RTO and ensure OnRetransmissionTimeout is called. | |
| 857 if (FLAGS_quic_use_new_rto) { | |
| 858 EXPECT_EQ(102 * kDefaultLength, | |
| 859 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
| 860 | |
| 861 RetransmitNextPacket(103); | |
| 862 QuicAckFrame ack_frame; | |
| 863 ack_frame.largest_observed = 103; | |
| 864 for (int i = 0; i < 103; ++i) { | |
| 865 ack_frame.missing_packets.insert(i); | |
| 866 } | |
| 867 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | |
| 868 EXPECT_CALL(*send_algorithm_, | |
| 869 OnCongestionEvent(true, _, ElementsAre(Pair(103, _)), _)); | |
| 870 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | |
| 871 EXPECT_CALL(*network_change_visitor_, OnRttChange()); | |
| 872 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
| 873 // All packets before 103 should be lost. | |
| 874 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
| 875 } | |
| 876 } | |
| 877 | |
| 878 TEST_F(QuicSentPacketManagerTest, CryptoHandshakeTimeout) { | |
| 879 // Send 2 crypto packets and 3 data packets. | |
| 880 const size_t kNumSentCryptoPackets = 2; | |
| 881 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) { | |
| 882 SendCryptoPacket(i); | |
| 883 } | |
| 884 const size_t kNumSentDataPackets = 3; | |
| 885 for (size_t i = 1; i <= kNumSentDataPackets; ++i) { | |
| 886 SendDataPacket(kNumSentCryptoPackets + i); | |
| 887 } | |
| 888 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
| 889 | |
| 890 // The first retransmits 2 packets. | |
| 891 manager_.OnRetransmissionTimeout(); | |
| 892 EXPECT_EQ(QuicTime::Delta::Zero(), | |
| 893 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA)); | |
| 894 RetransmitNextPacket(6); | |
| 895 RetransmitNextPacket(7); | |
| 896 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
| 897 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
| 898 | |
| 899 // The second retransmits 2 packets. | |
| 900 manager_.OnRetransmissionTimeout(); | |
| 901 EXPECT_EQ(QuicTime::Delta::Zero(), | |
| 902 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA)); | |
| 903 RetransmitNextPacket(8); | |
| 904 RetransmitNextPacket(9); | |
| 905 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
| 906 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
| 907 | |
| 908 // Now ack the two crypto packets and the speculatively encrypted request, | |
| 909 // and ensure the first four crypto packets get abandoned, but not lost. | |
| 910 QuicPacketSequenceNumber acked[] = { 3, 4, 5, 8, 9 }; | |
| 911 ExpectAcksAndLosses(true, acked, arraysize(acked), nullptr, 0); | |
| 912 QuicAckFrame ack_frame; | |
| 913 ack_frame.largest_observed = 9; | |
| 914 ack_frame.missing_packets.insert(1); | |
| 915 ack_frame.missing_packets.insert(2); | |
| 916 ack_frame.missing_packets.insert(6); | |
| 917 ack_frame.missing_packets.insert(7); | |
| 918 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
| 919 | |
| 920 EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
| 921 } | |
| 922 | |
| 923 TEST_F(QuicSentPacketManagerTest, CryptoHandshakeTimeoutVersionNegotiation) { | |
| 924 // Send 2 crypto packets and 3 data packets. | |
| 925 const size_t kNumSentCryptoPackets = 2; | |
| 926 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) { | |
| 927 SendCryptoPacket(i); | |
| 928 } | |
| 929 const size_t kNumSentDataPackets = 3; | |
| 930 for (size_t i = 1; i <= kNumSentDataPackets; ++i) { | |
| 931 SendDataPacket(kNumSentCryptoPackets + i); | |
| 932 } | |
| 933 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
| 934 | |
| 935 // The first retransmission timeout retransmits 2 crypto packets. | |
| 936 manager_.OnRetransmissionTimeout(); | |
| 937 RetransmitNextPacket(6); | |
| 938 RetransmitNextPacket(7); | |
| 939 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
| 940 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
| 941 | |
| 942 // Now act like a version negotiation packet arrived, which would cause all | |
| 943 // unacked packets to be retransmitted. | |
| 944 manager_.RetransmitUnackedPackets(ALL_UNACKED_RETRANSMISSION); | |
| 945 | |
| 946 // Ensure the first two pending packets are the crypto retransmits. | |
| 947 ASSERT_TRUE(manager_.HasPendingRetransmissions()); | |
| 948 EXPECT_EQ(6u, manager_.NextPendingRetransmission().sequence_number); | |
| 949 RetransmitNextPacket(8); | |
| 950 EXPECT_EQ(7u, manager_.NextPendingRetransmission().sequence_number); | |
| 951 RetransmitNextPacket(9); | |
| 952 | |
| 953 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
| 954 // Send 3 more data packets and ensure the least unacked is raised. | |
| 955 RetransmitNextPacket(10); | |
| 956 RetransmitNextPacket(11); | |
| 957 RetransmitNextPacket(12); | |
| 958 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
| 959 | |
| 960 EXPECT_EQ(8u, manager_.GetLeastUnacked()); | |
| 961 } | |
| 962 | |
| 963 TEST_F(QuicSentPacketManagerTest, CryptoHandshakeSpuriousRetransmission) { | |
| 964 // Send 1 crypto packet. | |
| 965 SendCryptoPacket(1); | |
| 966 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
| 967 | |
| 968 // Retransmit the crypto packet as 2. | |
| 969 manager_.OnRetransmissionTimeout(); | |
| 970 RetransmitNextPacket(2); | |
| 971 | |
| 972 // Retransmit the crypto packet as 3. | |
| 973 manager_.OnRetransmissionTimeout(); | |
| 974 RetransmitNextPacket(3); | |
| 975 | |
| 976 // Now ack the second crypto packet, and ensure the first gets removed, but | |
| 977 // the third does not. | |
| 978 ExpectUpdatedRtt(2); | |
| 979 QuicAckFrame ack_frame; | |
| 980 ack_frame.largest_observed = 2; | |
| 981 ack_frame.missing_packets.insert(1); | |
| 982 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
| 983 | |
| 984 EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
| 985 QuicPacketSequenceNumber unacked[] = { 3 }; | |
| 986 VerifyUnackedPackets(unacked, arraysize(unacked)); | |
| 987 } | |
| 988 | |
| 989 TEST_F(QuicSentPacketManagerTest, CryptoHandshakeTimeoutUnsentDataPacket) { | |
| 990 // Send 2 crypto packets and 1 data packet. | |
| 991 const size_t kNumSentCryptoPackets = 2; | |
| 992 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) { | |
| 993 SendCryptoPacket(i); | |
| 994 } | |
| 995 SendDataPacket(3); | |
| 996 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
| 997 | |
| 998 // Retransmit 2 crypto packets, but not the serialized packet. | |
| 999 manager_.OnRetransmissionTimeout(); | |
| 1000 RetransmitNextPacket(4); | |
| 1001 RetransmitNextPacket(5); | |
| 1002 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
| 1003 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
| 1004 } | |
| 1005 | |
| 1006 TEST_F(QuicSentPacketManagerTest, | |
| 1007 CryptoHandshakeRetransmissionThenRetransmitAll) { | |
| 1008 // Send 1 crypto packet. | |
| 1009 SendCryptoPacket(1); | |
| 1010 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
| 1011 | |
| 1012 // Retransmit the crypto packet as 2. | |
| 1013 manager_.OnRetransmissionTimeout(); | |
| 1014 RetransmitNextPacket(2); | |
| 1015 | |
| 1016 // Now retransmit all the unacked packets, which occurs when there is a | |
| 1017 // version negotiation. | |
| 1018 manager_.RetransmitUnackedPackets(ALL_UNACKED_RETRANSMISSION); | |
| 1019 QuicPacketSequenceNumber unacked[] = { 1, 2 }; | |
| 1020 VerifyUnackedPackets(unacked, arraysize(unacked)); | |
| 1021 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
| 1022 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
| 1023 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | |
| 1024 } | |
| 1025 | |
| 1026 TEST_F(QuicSentPacketManagerTest, | |
| 1027 CryptoHandshakeRetransmissionThenNeuterAndAck) { | |
| 1028 // Send 1 crypto packet. | |
| 1029 SendCryptoPacket(1); | |
| 1030 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
| 1031 | |
| 1032 // Retransmit the crypto packet as 2. | |
| 1033 manager_.OnRetransmissionTimeout(); | |
| 1034 RetransmitNextPacket(2); | |
| 1035 | |
| 1036 // Retransmit the crypto packet as 3. | |
| 1037 manager_.OnRetransmissionTimeout(); | |
| 1038 RetransmitNextPacket(3); | |
| 1039 | |
| 1040 // Now neuter all unacked unencrypted packets, which occurs when the | |
| 1041 // connection goes forward secure. | |
| 1042 manager_.NeuterUnencryptedPackets(); | |
| 1043 QuicPacketSequenceNumber unacked[] = { 1, 2, 3}; | |
| 1044 VerifyUnackedPackets(unacked, arraysize(unacked)); | |
| 1045 VerifyRetransmittablePackets(nullptr, 0); | |
| 1046 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
| 1047 EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
| 1048 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | |
| 1049 | |
| 1050 // Ensure both packets get discarded when packet 2 is acked. | |
| 1051 QuicAckFrame ack_frame; | |
| 1052 ack_frame.largest_observed = 3; | |
| 1053 ack_frame.missing_packets.insert(1); | |
| 1054 ack_frame.missing_packets.insert(2); | |
| 1055 ExpectUpdatedRtt(3); | |
| 1056 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
| 1057 VerifyUnackedPackets(nullptr, 0); | |
| 1058 VerifyRetransmittablePackets(nullptr, 0); | |
| 1059 } | |
| 1060 | |
| 1061 TEST_F(QuicSentPacketManagerTest, ResetRecentMinRTTWithEmptyWindow) { | |
| 1062 QuicTime::Delta min_rtt = QuicTime::Delta::FromMilliseconds(50); | |
| 1063 QuicSentPacketManagerPeer::GetRttStats(&manager_)->UpdateRtt( | |
| 1064 min_rtt, QuicTime::Delta::Zero(), QuicTime::Zero()); | |
| 1065 EXPECT_EQ(min_rtt, | |
| 1066 QuicSentPacketManagerPeer::GetRttStats(&manager_)->min_rtt()); | |
| 1067 EXPECT_EQ(min_rtt, | |
| 1068 QuicSentPacketManagerPeer::GetRttStats( | |
| 1069 &manager_)->recent_min_rtt()); | |
| 1070 | |
| 1071 // Send two packets with no prior bytes in flight. | |
| 1072 SendDataPacket(1); | |
| 1073 SendDataPacket(2); | |
| 1074 | |
| 1075 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(100)); | |
| 1076 // Ack two packets with 100ms RTT observations. | |
| 1077 QuicAckFrame ack_frame; | |
| 1078 ack_frame.delta_time_largest_observed = QuicTime::Delta::Zero(); | |
| 1079 ack_frame.largest_observed = 1; | |
| 1080 ExpectAck(1); | |
| 1081 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
| 1082 | |
| 1083 // First ack does not change recent min rtt. | |
| 1084 EXPECT_EQ(min_rtt, | |
| 1085 QuicSentPacketManagerPeer::GetRttStats( | |
| 1086 &manager_)->recent_min_rtt()); | |
| 1087 | |
| 1088 ack_frame.largest_observed = 2; | |
| 1089 ExpectAck(2); | |
| 1090 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
| 1091 | |
| 1092 EXPECT_EQ(min_rtt, | |
| 1093 QuicSentPacketManagerPeer::GetRttStats(&manager_)->min_rtt()); | |
| 1094 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(100), | |
| 1095 QuicSentPacketManagerPeer::GetRttStats( | |
| 1096 &manager_)->recent_min_rtt()); | |
| 1097 } | |
| 1098 | |
| 1099 TEST_F(QuicSentPacketManagerTest, RetransmissionTimeout) { | |
| 1100 // Send 100 packets. | |
| 1101 const size_t kNumSentPackets = 100; | |
| 1102 for (size_t i = 1; i <= kNumSentPackets; ++i) { | |
| 1103 SendDataPacket(i); | |
| 1104 } | |
| 1105 | |
| 1106 if (!FLAGS_quic_use_new_rto) { | |
| 1107 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | |
| 1108 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | |
| 1109 } | |
| 1110 EXPECT_FALSE(manager_.MaybeRetransmitTailLossProbe()); | |
| 1111 manager_.OnRetransmissionTimeout(); | |
| 1112 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
| 1113 if (FLAGS_quic_use_new_rto) { | |
| 1114 EXPECT_EQ(100 * kDefaultLength, | |
| 1115 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
| 1116 } else { | |
| 1117 // Ensure all are abandoned when the RTO fires. | |
| 1118 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
| 1119 } | |
| 1120 RetransmitNextPacket(101); | |
| 1121 RetransmitNextPacket(102); | |
| 1122 if (FLAGS_quic_use_new_rto) { | |
| 1123 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
| 1124 } else { | |
| 1125 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
| 1126 } | |
| 1127 | |
| 1128 // Ack a retransmission. | |
| 1129 QuicAckFrame ack_frame; | |
| 1130 ack_frame.delta_time_largest_observed = QuicTime::Delta::Zero(); | |
| 1131 ack_frame.largest_observed = 102; | |
| 1132 for (int i = 0; i < 102; ++i) { | |
| 1133 ack_frame.missing_packets.insert(i); | |
| 1134 } | |
| 1135 // Ensure no packets are lost. | |
| 1136 EXPECT_CALL(*send_algorithm_, | |
| 1137 OnCongestionEvent(true, _, ElementsAre(Pair(102, _)), | |
| 1138 /*lost_packets=*/IsEmpty())); | |
| 1139 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | |
| 1140 EXPECT_CALL(*network_change_visitor_, OnRttChange()); | |
| 1141 if (FLAGS_quic_use_new_rto) { | |
| 1142 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | |
| 1143 } | |
| 1144 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
| 1145 } | |
| 1146 | |
| 1147 TEST_F(QuicSentPacketManagerTest, NewRetransmissionTimeout) { | |
| 1148 ValueRestore<bool> old_flag(&FLAGS_quic_use_new_rto, true); | |
| 1149 QuicConfig client_config; | |
| 1150 QuicTagVector options; | |
| 1151 options.push_back(kNRTO); | |
| 1152 QuicSentPacketManagerPeer::SetIsServer(&manager_, false); | |
| 1153 client_config.SetConnectionOptionsToSend(options); | |
| 1154 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | |
| 1155 EXPECT_CALL(*network_change_visitor_, OnRttChange()); | |
| 1156 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _, _)); | |
| 1157 EXPECT_CALL(*send_algorithm_, PacingRate()) | |
| 1158 .WillRepeatedly(Return(QuicBandwidth::Zero())); | |
| 1159 manager_.SetFromConfig(client_config); | |
| 1160 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_)); | |
| 1161 | |
| 1162 // Send 100 packets. | |
| 1163 const size_t kNumSentPackets = 100; | |
| 1164 for (size_t i = 1; i <= kNumSentPackets; ++i) { | |
| 1165 SendDataPacket(i); | |
| 1166 } | |
| 1167 | |
| 1168 EXPECT_FALSE(manager_.MaybeRetransmitTailLossProbe()); | |
| 1169 manager_.OnRetransmissionTimeout(); | |
| 1170 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
| 1171 EXPECT_EQ(100 * kDefaultLength, | |
| 1172 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
| 1173 RetransmitNextPacket(101); | |
| 1174 RetransmitNextPacket(102); | |
| 1175 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
| 1176 | |
| 1177 // Ack a retransmission and expect no call to OnRetransmissionTimeout. | |
| 1178 QuicAckFrame ack_frame; | |
| 1179 ack_frame.delta_time_largest_observed = QuicTime::Delta::Zero(); | |
| 1180 ack_frame.largest_observed = 102; | |
| 1181 for (int i = 0; i < 102; ++i) { | |
| 1182 ack_frame.missing_packets.insert(i); | |
| 1183 } | |
| 1184 // This will include packets in the lost packet map. | |
| 1185 EXPECT_CALL(*send_algorithm_, | |
| 1186 OnCongestionEvent(true, _, ElementsAre(Pair(102, _)), | |
| 1187 /*lost_packets=*/Not(IsEmpty()))); | |
| 1188 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | |
| 1189 EXPECT_CALL(*network_change_visitor_, OnRttChange()); | |
| 1190 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
| 1191 } | |
| 1192 | |
| 1193 TEST_F(QuicSentPacketManagerTest, TwoRetransmissionTimeoutsAckSecond) { | |
| 1194 // Send 1 packet. | |
| 1195 SendDataPacket(1); | |
| 1196 | |
| 1197 if (!FLAGS_quic_use_new_rto) { | |
| 1198 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | |
| 1199 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | |
| 1200 } | |
| 1201 manager_.OnRetransmissionTimeout(); | |
| 1202 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
| 1203 if (FLAGS_quic_use_new_rto) { | |
| 1204 EXPECT_EQ(kDefaultLength, | |
| 1205 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
| 1206 } else { | |
| 1207 // Ensure all are abandoned when the RTO fires. | |
| 1208 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
| 1209 } | |
| 1210 RetransmitNextPacket(2); | |
| 1211 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
| 1212 | |
| 1213 // Rto a second time. | |
| 1214 if (!FLAGS_quic_use_new_rto) { | |
| 1215 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | |
| 1216 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | |
| 1217 } | |
| 1218 manager_.OnRetransmissionTimeout(); | |
| 1219 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
| 1220 if (FLAGS_quic_use_new_rto) { | |
| 1221 EXPECT_EQ(2 * kDefaultLength, | |
| 1222 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
| 1223 } else { | |
| 1224 // Ensure all are abandoned when the RTO fires. | |
| 1225 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
| 1226 } | |
| 1227 RetransmitNextPacket(3); | |
| 1228 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
| 1229 | |
| 1230 // Ack a retransmission and ensure OnRetransmissionTimeout is called. | |
| 1231 if (FLAGS_quic_use_new_rto) { | |
| 1232 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | |
| 1233 } | |
| 1234 QuicAckFrame ack_frame; | |
| 1235 ack_frame.delta_time_largest_observed = QuicTime::Delta::Zero(); | |
| 1236 ack_frame.largest_observed = 2; | |
| 1237 ack_frame.missing_packets.insert(1); | |
| 1238 if (FLAGS_quic_use_new_rto) { | |
| 1239 ExpectAck(2); | |
| 1240 } else { | |
| 1241 ExpectUpdatedRtt(2); | |
| 1242 } | |
| 1243 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
| 1244 | |
| 1245 if (FLAGS_quic_use_new_rto) { | |
| 1246 // The original packet and newest should be outstanding. | |
| 1247 EXPECT_EQ(2 * kDefaultLength, | |
| 1248 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
| 1249 } else { | |
| 1250 EXPECT_EQ(kDefaultLength, | |
| 1251 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
| 1252 } | |
| 1253 } | |
| 1254 | |
| 1255 TEST_F(QuicSentPacketManagerTest, TwoRetransmissionTimeoutsAckFirst) { | |
| 1256 // Send 1 packet. | |
| 1257 SendDataPacket(1); | |
| 1258 | |
| 1259 if (!FLAGS_quic_use_new_rto) { | |
| 1260 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | |
| 1261 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | |
| 1262 } | |
| 1263 manager_.OnRetransmissionTimeout(); | |
| 1264 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
| 1265 if (FLAGS_quic_use_new_rto) { | |
| 1266 EXPECT_EQ(kDefaultLength, | |
| 1267 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
| 1268 } else { | |
| 1269 // Ensure all are abandoned when the RTO fires. | |
| 1270 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
| 1271 } | |
| 1272 RetransmitNextPacket(2); | |
| 1273 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
| 1274 | |
| 1275 // Rto a second time. | |
| 1276 if (!FLAGS_quic_use_new_rto) { | |
| 1277 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | |
| 1278 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | |
| 1279 } | |
| 1280 manager_.OnRetransmissionTimeout(); | |
| 1281 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
| 1282 if (FLAGS_quic_use_new_rto) { | |
| 1283 EXPECT_EQ(2 * kDefaultLength, | |
| 1284 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
| 1285 } else { | |
| 1286 // Ensure all are abandoned when the RTO fires. | |
| 1287 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
| 1288 } | |
| 1289 RetransmitNextPacket(3); | |
| 1290 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
| 1291 | |
| 1292 // Ack a retransmission and ensure OnRetransmissionTimeout is called. | |
| 1293 if (FLAGS_quic_use_new_rto) { | |
| 1294 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | |
| 1295 } | |
| 1296 QuicAckFrame ack_frame; | |
| 1297 ack_frame.delta_time_largest_observed = QuicTime::Delta::Zero(); | |
| 1298 ack_frame.largest_observed = 3; | |
| 1299 ack_frame.missing_packets.insert(1); | |
| 1300 ack_frame.missing_packets.insert(2); | |
| 1301 ExpectAck(3); | |
| 1302 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
| 1303 | |
| 1304 if (FLAGS_quic_use_new_rto) { | |
| 1305 // The first two packets should still be outstanding. | |
| 1306 EXPECT_EQ(2 * kDefaultLength, | |
| 1307 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
| 1308 } else { | |
| 1309 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
| 1310 } | |
| 1311 } | |
| 1312 | |
| 1313 TEST_F(QuicSentPacketManagerTest, GetTransmissionTime) { | |
| 1314 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime()); | |
| 1315 } | |
| 1316 | |
| 1317 TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeCryptoHandshake) { | |
| 1318 SendCryptoPacket(1); | |
| 1319 | |
| 1320 // Check the min. | |
| 1321 RttStats* rtt_stats = QuicSentPacketManagerPeer::GetRttStats(&manager_); | |
| 1322 rtt_stats->set_initial_rtt_us(1 * kNumMicrosPerMilli); | |
| 1323 EXPECT_EQ(clock_.Now().Add(QuicTime::Delta::FromMilliseconds(10)), | |
| 1324 manager_.GetRetransmissionTime()); | |
| 1325 | |
| 1326 // Test with a standard smoothed RTT. | |
| 1327 rtt_stats->set_initial_rtt_us(100 * kNumMicrosPerMilli); | |
| 1328 | |
| 1329 QuicTime::Delta srtt = | |
| 1330 QuicTime::Delta::FromMicroseconds(rtt_stats->initial_rtt_us()); | |
| 1331 QuicTime expected_time = clock_.Now().Add(srtt.Multiply(1.5)); | |
| 1332 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); | |
| 1333 | |
| 1334 // Retransmit the packet by invoking the retransmission timeout. | |
| 1335 clock_.AdvanceTime(srtt.Multiply(1.5)); | |
| 1336 manager_.OnRetransmissionTimeout(); | |
| 1337 RetransmitNextPacket(2); | |
| 1338 | |
| 1339 // The retransmission time should now be twice as far in the future. | |
| 1340 expected_time = clock_.Now().Add(srtt.Multiply(2).Multiply(1.5)); | |
| 1341 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); | |
| 1342 } | |
| 1343 | |
| 1344 TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeTailLossProbe) { | |
| 1345 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2); | |
| 1346 SendDataPacket(1); | |
| 1347 SendDataPacket(2); | |
| 1348 | |
| 1349 // Check the min. | |
| 1350 RttStats* rtt_stats = QuicSentPacketManagerPeer::GetRttStats(&manager_); | |
| 1351 rtt_stats->set_initial_rtt_us(1 * kNumMicrosPerMilli); | |
| 1352 EXPECT_EQ(clock_.Now().Add(QuicTime::Delta::FromMilliseconds(10)), | |
| 1353 manager_.GetRetransmissionTime()); | |
| 1354 | |
| 1355 // Test with a standard smoothed RTT. | |
| 1356 rtt_stats->set_initial_rtt_us(100 * kNumMicrosPerMilli); | |
| 1357 QuicTime::Delta srtt = | |
| 1358 QuicTime::Delta::FromMicroseconds(rtt_stats->initial_rtt_us()); | |
| 1359 QuicTime::Delta expected_tlp_delay = srtt.Multiply(2); | |
| 1360 QuicTime expected_time = clock_.Now().Add(expected_tlp_delay); | |
| 1361 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); | |
| 1362 | |
| 1363 // Retransmit the packet by invoking the retransmission timeout. | |
| 1364 clock_.AdvanceTime(expected_tlp_delay); | |
| 1365 manager_.OnRetransmissionTimeout(); | |
| 1366 EXPECT_EQ(QuicTime::Delta::Zero(), | |
| 1367 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA)); | |
| 1368 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
| 1369 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe()); | |
| 1370 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
| 1371 RetransmitNextPacket(3); | |
| 1372 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _)).WillOnce(Return( | |
| 1373 QuicTime::Delta::Infinite())); | |
| 1374 EXPECT_EQ(QuicTime::Delta::Infinite(), | |
| 1375 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA)); | |
| 1376 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
| 1377 | |
| 1378 expected_time = clock_.Now().Add(expected_tlp_delay); | |
| 1379 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); | |
| 1380 } | |
| 1381 | |
| 1382 TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeSpuriousRTO) { | |
| 1383 QuicSentPacketManagerPeer::GetRttStats(&manager_)->UpdateRtt( | |
| 1384 QuicTime::Delta::FromMilliseconds(100), | |
| 1385 QuicTime::Delta::Zero(), | |
| 1386 QuicTime::Zero()); | |
| 1387 | |
| 1388 SendDataPacket(1); | |
| 1389 SendDataPacket(2); | |
| 1390 SendDataPacket(3); | |
| 1391 SendDataPacket(4); | |
| 1392 | |
| 1393 QuicTime::Delta expected_rto_delay = QuicTime::Delta::FromMilliseconds(500); | |
| 1394 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) | |
| 1395 .WillRepeatedly(Return(expected_rto_delay)); | |
| 1396 QuicTime expected_time = clock_.Now().Add(expected_rto_delay); | |
| 1397 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); | |
| 1398 | |
| 1399 // Retransmit the packet by invoking the retransmission timeout. | |
| 1400 if (!FLAGS_quic_use_new_rto) { | |
| 1401 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | |
| 1402 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | |
| 1403 } | |
| 1404 clock_.AdvanceTime(expected_rto_delay); | |
| 1405 manager_.OnRetransmissionTimeout(); | |
| 1406 if (FLAGS_quic_use_new_rto) { | |
| 1407 // All packets are still considered inflight. | |
| 1408 EXPECT_EQ(4 * kDefaultLength, | |
| 1409 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
| 1410 } else { | |
| 1411 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
| 1412 } | |
| 1413 RetransmitNextPacket(5); | |
| 1414 RetransmitNextPacket(6); | |
| 1415 if (FLAGS_quic_use_new_rto) { | |
| 1416 // All previous packets are inflight, plus two rto retransmissions. | |
| 1417 EXPECT_EQ(6 * kDefaultLength, | |
| 1418 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
| 1419 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
| 1420 } else { | |
| 1421 EXPECT_EQ(2 * kDefaultLength, | |
| 1422 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
| 1423 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
| 1424 } | |
| 1425 | |
| 1426 // The delay should double the second time. | |
| 1427 expected_time = clock_.Now().Add(expected_rto_delay).Add(expected_rto_delay); | |
| 1428 // Once we always base the timer on the right edge, leaving the older packets | |
| 1429 // in flight doesn't change the timeout. | |
| 1430 if (!FLAGS_quic_use_new_rto || FLAGS_quic_rto_uses_last_sent) { | |
| 1431 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); | |
| 1432 } | |
| 1433 | |
| 1434 // Ack a packet before the first RTO and ensure the RTO timeout returns to the | |
| 1435 // original value and OnRetransmissionTimeout is not called or reverted. | |
| 1436 QuicAckFrame ack_frame; | |
| 1437 ack_frame.largest_observed = 2; | |
| 1438 ack_frame.missing_packets.insert(1); | |
| 1439 if (FLAGS_quic_use_new_rto) { | |
| 1440 ExpectAck(2); | |
| 1441 } else { | |
| 1442 ExpectUpdatedRtt(2); | |
| 1443 EXPECT_CALL(*send_algorithm_, RevertRetransmissionTimeout()); | |
| 1444 } | |
| 1445 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
| 1446 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
| 1447 if (FLAGS_quic_use_new_rto) { | |
| 1448 EXPECT_EQ(5 * kDefaultLength, | |
| 1449 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
| 1450 } else { | |
| 1451 EXPECT_EQ(4 * kDefaultLength, | |
| 1452 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
| 1453 } | |
| 1454 | |
| 1455 // Wait 2RTTs from now for the RTO, since it's the max of the RTO time | |
| 1456 // and the TLP time. In production, there would always be two TLP's first. | |
| 1457 // Since retransmission was spurious, smoothed_rtt_ is expired, and replaced | |
| 1458 // by the latest RTT sample of 500ms. | |
| 1459 expected_time = clock_.Now().Add(QuicTime::Delta::FromMilliseconds(1000)); | |
| 1460 // Once we always base the timer on the right edge, leaving the older packets | |
| 1461 // in flight doesn't change the timeout. | |
| 1462 if (!FLAGS_quic_use_new_rto || FLAGS_quic_rto_uses_last_sent) { | |
| 1463 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); | |
| 1464 } | |
| 1465 } | |
| 1466 | |
| 1467 TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayMin) { | |
| 1468 SendDataPacket(1); | |
| 1469 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) | |
| 1470 .WillRepeatedly(Return(QuicTime::Delta::FromMilliseconds(1))); | |
| 1471 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(200); | |
| 1472 | |
| 1473 // If the delay is smaller than the min, ensure it exponentially backs off | |
| 1474 // from the min. | |
| 1475 for (int i = 0; i < 5; ++i) { | |
| 1476 EXPECT_EQ(delay, | |
| 1477 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); | |
| 1478 delay = delay.Add(delay); | |
| 1479 if (!FLAGS_quic_use_new_rto) { | |
| 1480 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | |
| 1481 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | |
| 1482 } | |
| 1483 manager_.OnRetransmissionTimeout(); | |
| 1484 RetransmitNextPacket(i + 2); | |
| 1485 } | |
| 1486 } | |
| 1487 | |
| 1488 TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayMax) { | |
| 1489 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) | |
| 1490 .WillOnce(Return(QuicTime::Delta::FromSeconds(500))); | |
| 1491 | |
| 1492 EXPECT_EQ(QuicTime::Delta::FromSeconds(60), | |
| 1493 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); | |
| 1494 } | |
| 1495 | |
| 1496 TEST_F(QuicSentPacketManagerTest, GetTransmissionDelay) { | |
| 1497 SendDataPacket(1); | |
| 1498 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(500); | |
| 1499 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) | |
| 1500 .WillRepeatedly(Return(delay)); | |
| 1501 | |
| 1502 // Delay should back off exponentially. | |
| 1503 for (int i = 0; i < 5; ++i) { | |
| 1504 EXPECT_EQ(delay, | |
| 1505 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); | |
| 1506 delay = delay.Add(delay); | |
| 1507 if (!FLAGS_quic_use_new_rto) { | |
| 1508 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | |
| 1509 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | |
| 1510 } | |
| 1511 manager_.OnRetransmissionTimeout(); | |
| 1512 RetransmitNextPacket(i + 2); | |
| 1513 } | |
| 1514 } | |
| 1515 | |
| 1516 TEST_F(QuicSentPacketManagerTest, GetLossDelay) { | |
| 1517 MockLossAlgorithm* loss_algorithm = new MockLossAlgorithm(); | |
| 1518 QuicSentPacketManagerPeer::SetLossAlgorithm(&manager_, loss_algorithm); | |
| 1519 | |
| 1520 EXPECT_CALL(*loss_algorithm, GetLossTimeout()) | |
| 1521 .WillRepeatedly(Return(QuicTime::Zero())); | |
| 1522 SendDataPacket(1); | |
| 1523 SendDataPacket(2); | |
| 1524 | |
| 1525 // Handle an ack which causes the loss algorithm to be evaluated and | |
| 1526 // set the loss timeout. | |
| 1527 ExpectAck(2); | |
| 1528 EXPECT_CALL(*loss_algorithm, DetectLostPackets(_, _, _, _)) | |
| 1529 .WillOnce(Return(SequenceNumberSet())); | |
| 1530 QuicAckFrame ack_frame; | |
| 1531 ack_frame.largest_observed = 2; | |
| 1532 ack_frame.missing_packets.insert(1); | |
| 1533 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
| 1534 | |
| 1535 QuicTime timeout(clock_.Now().Add(QuicTime::Delta::FromMilliseconds(10))); | |
| 1536 EXPECT_CALL(*loss_algorithm, GetLossTimeout()) | |
| 1537 .WillRepeatedly(Return(timeout)); | |
| 1538 EXPECT_EQ(timeout, manager_.GetRetransmissionTime()); | |
| 1539 | |
| 1540 // Fire the retransmission timeout and ensure the loss detection algorithm | |
| 1541 // is invoked. | |
| 1542 EXPECT_CALL(*loss_algorithm, DetectLostPackets(_, _, _, _)) | |
| 1543 .WillOnce(Return(SequenceNumberSet())); | |
| 1544 manager_.OnRetransmissionTimeout(); | |
| 1545 } | |
| 1546 | |
| 1547 TEST_F(QuicSentPacketManagerTest, NegotiateTimeLossDetectionFromOptions) { | |
| 1548 EXPECT_EQ(kNack, | |
| 1549 QuicSentPacketManagerPeer::GetLossAlgorithm( | |
| 1550 &manager_)->GetLossDetectionType()); | |
| 1551 | |
| 1552 QuicConfig config; | |
| 1553 QuicTagVector options; | |
| 1554 options.push_back(kTIME); | |
| 1555 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); | |
| 1556 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _, _)); | |
| 1557 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | |
| 1558 EXPECT_CALL(*network_change_visitor_, OnRttChange()); | |
| 1559 manager_.SetFromConfig(config); | |
| 1560 | |
| 1561 EXPECT_EQ(kTime, | |
| 1562 QuicSentPacketManagerPeer::GetLossAlgorithm( | |
| 1563 &manager_)->GetLossDetectionType()); | |
| 1564 } | |
| 1565 | |
| 1566 TEST_F(QuicSentPacketManagerTest, NegotiateCongestionControlFromOptions) { | |
| 1567 ValueRestore<bool> old_flag(&FLAGS_quic_allow_bbr, true); | |
| 1568 QuicConfig config; | |
| 1569 QuicTagVector options; | |
| 1570 | |
| 1571 options.push_back(kRENO); | |
| 1572 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); | |
| 1573 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | |
| 1574 EXPECT_CALL(*network_change_visitor_, OnRttChange()); | |
| 1575 manager_.SetFromConfig(config); | |
| 1576 EXPECT_EQ(kReno, QuicSentPacketManagerPeer::GetSendAlgorithm( | |
| 1577 manager_)->GetCongestionControlType()); | |
| 1578 | |
| 1579 // TODO(rtenneti): Enable the following code after BBR code is checked in. | |
| 1580 #if 0 | |
| 1581 options.clear(); | |
| 1582 options.push_back(kTBBR); | |
| 1583 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); | |
| 1584 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | |
| 1585 EXPECT_CALL(*network_change_visitor_, OnRttChange()); | |
| 1586 manager_.SetFromConfig(config); | |
| 1587 EXPECT_EQ(kBBR, QuicSentPacketManagerPeer::GetSendAlgorithm( | |
| 1588 manager_)->GetCongestionControlType()); | |
| 1589 #endif | |
| 1590 } | |
| 1591 | |
| 1592 TEST_F(QuicSentPacketManagerTest, NegotiateNumConnectionsFromOptions) { | |
| 1593 QuicConfig config; | |
| 1594 QuicTagVector options; | |
| 1595 | |
| 1596 options.push_back(k1CON); | |
| 1597 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); | |
| 1598 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | |
| 1599 EXPECT_CALL(*network_change_visitor_, OnRttChange()); | |
| 1600 EXPECT_CALL(*send_algorithm_, SetNumEmulatedConnections(1)); | |
| 1601 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _, _)); | |
| 1602 manager_.SetFromConfig(config); | |
| 1603 | |
| 1604 QuicSentPacketManagerPeer::SetIsServer(&manager_, false); | |
| 1605 QuicConfig client_config; | |
| 1606 client_config.SetConnectionOptionsToSend(options); | |
| 1607 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | |
| 1608 EXPECT_CALL(*network_change_visitor_, OnRttChange()); | |
| 1609 EXPECT_CALL(*send_algorithm_, SetNumEmulatedConnections(1)); | |
| 1610 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _, _)); | |
| 1611 manager_.SetFromConfig(client_config); | |
| 1612 } | |
| 1613 | |
| 1614 TEST_F(QuicSentPacketManagerTest, NegotiateNConnectionFromOptions) { | |
| 1615 // By default, changing the number of open streams does nothing. | |
| 1616 manager_.SetNumOpenStreams(5); | |
| 1617 | |
| 1618 QuicConfig config; | |
| 1619 QuicTagVector options; | |
| 1620 | |
| 1621 options.push_back(kNCON); | |
| 1622 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); | |
| 1623 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | |
| 1624 EXPECT_CALL(*network_change_visitor_, OnRttChange()); | |
| 1625 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _, _)); | |
| 1626 manager_.SetFromConfig(config); | |
| 1627 | |
| 1628 EXPECT_CALL(*send_algorithm_, SetNumEmulatedConnections(5)); | |
| 1629 manager_.SetNumOpenStreams(5); | |
| 1630 } | |
| 1631 | |
| 1632 TEST_F(QuicSentPacketManagerTest, NegotiateNoTLPFromOptionsAtServer) { | |
| 1633 QuicConfig config; | |
| 1634 QuicTagVector options; | |
| 1635 | |
| 1636 options.push_back(kNTLP); | |
| 1637 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); | |
| 1638 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | |
| 1639 EXPECT_CALL(*network_change_visitor_, OnRttChange()); | |
| 1640 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _, _)); | |
| 1641 manager_.SetFromConfig(config); | |
| 1642 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_)); | |
| 1643 } | |
| 1644 | |
| 1645 TEST_F(QuicSentPacketManagerTest, NegotiateNoTLPFromOptionsAtClient) { | |
| 1646 QuicConfig client_config; | |
| 1647 QuicTagVector options; | |
| 1648 | |
| 1649 options.push_back(kNTLP); | |
| 1650 QuicSentPacketManagerPeer::SetIsServer(&manager_, false); | |
| 1651 client_config.SetConnectionOptionsToSend(options); | |
| 1652 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | |
| 1653 EXPECT_CALL(*network_change_visitor_, OnRttChange()); | |
| 1654 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _, _)); | |
| 1655 manager_.SetFromConfig(client_config); | |
| 1656 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_)); | |
| 1657 } | |
| 1658 | |
| 1659 TEST_F(QuicSentPacketManagerTest, NegotiateNewRTOFromOptionsAtServer) { | |
| 1660 EXPECT_FALSE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_)); | |
| 1661 QuicConfig config; | |
| 1662 QuicTagVector options; | |
| 1663 | |
| 1664 options.push_back(kNRTO); | |
| 1665 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); | |
| 1666 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | |
| 1667 EXPECT_CALL(*network_change_visitor_, OnRttChange()); | |
| 1668 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _, _)); | |
| 1669 manager_.SetFromConfig(config); | |
| 1670 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_)); | |
| 1671 } | |
| 1672 | |
| 1673 TEST_F(QuicSentPacketManagerTest, NegotiateNewRTOFromOptionsAtClient) { | |
| 1674 EXPECT_FALSE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_)); | |
| 1675 QuicConfig client_config; | |
| 1676 QuicTagVector options; | |
| 1677 | |
| 1678 options.push_back(kNRTO); | |
| 1679 QuicSentPacketManagerPeer::SetIsServer(&manager_, false); | |
| 1680 client_config.SetConnectionOptionsToSend(options); | |
| 1681 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | |
| 1682 EXPECT_CALL(*network_change_visitor_, OnRttChange()); | |
| 1683 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _, _)); | |
| 1684 manager_.SetFromConfig(client_config); | |
| 1685 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_)); | |
| 1686 } | |
| 1687 | |
| 1688 TEST_F(QuicSentPacketManagerTest, NegotiatePacingFromOptions) { | |
| 1689 EXPECT_FALSE(manager_.using_pacing()); | |
| 1690 | |
| 1691 QuicConfig config; | |
| 1692 QuicTagVector options; | |
| 1693 options.push_back(kPACE); | |
| 1694 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); | |
| 1695 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | |
| 1696 EXPECT_CALL(*network_change_visitor_, OnRttChange()); | |
| 1697 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _, /*using_pacing=*/true)); | |
| 1698 manager_.SetFromConfig(config); | |
| 1699 | |
| 1700 EXPECT_TRUE(manager_.using_pacing()); | |
| 1701 } | |
| 1702 | |
| 1703 TEST_F(QuicSentPacketManagerTest, EnablePacingViaFlag) { | |
| 1704 EXPECT_FALSE(manager_.using_pacing()); | |
| 1705 | |
| 1706 // If pacing is enabled via command-line flag, it will be turned on, | |
| 1707 // regardless of the contents of the config. | |
| 1708 ValueRestore<bool> old_flag(&FLAGS_quic_enable_pacing, true); | |
| 1709 QuicConfig config; | |
| 1710 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | |
| 1711 EXPECT_CALL(*network_change_visitor_, OnRttChange()); | |
| 1712 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _, /*using_pacing=*/true)); | |
| 1713 manager_.SetFromConfig(config); | |
| 1714 | |
| 1715 EXPECT_TRUE(manager_.using_pacing()); | |
| 1716 } | |
| 1717 | |
| 1718 TEST_F(QuicSentPacketManagerTest, NegotiateReceiveWindowFromOptions) { | |
| 1719 EXPECT_EQ(kDefaultSocketReceiveBuffer, | |
| 1720 QuicSentPacketManagerPeer::GetReceiveWindow(&manager_)); | |
| 1721 | |
| 1722 // Try to set a size below the minimum and ensure it gets set to the min. | |
| 1723 QuicConfig client_config; | |
| 1724 QuicConfigPeer::SetReceivedSocketReceiveBuffer(&client_config, 1024); | |
| 1725 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _, _)); | |
| 1726 EXPECT_CALL(*send_algorithm_, PacingRate()) | |
| 1727 .WillRepeatedly(Return(QuicBandwidth::Zero())); | |
| 1728 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | |
| 1729 EXPECT_CALL(*network_change_visitor_, OnRttChange()); | |
| 1730 manager_.SetFromConfig(client_config); | |
| 1731 | |
| 1732 EXPECT_EQ(kMinSocketReceiveBuffer, | |
| 1733 QuicSentPacketManagerPeer::GetReceiveWindow(&manager_)); | |
| 1734 | |
| 1735 // Ensure the smaller send window only allows 16 packets to be sent. | |
| 1736 for (QuicPacketSequenceNumber i = 1; i <= 16; ++i) { | |
| 1737 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _)).WillOnce(Return( | |
| 1738 QuicTime::Delta::Zero())); | |
| 1739 EXPECT_EQ(QuicTime::Delta::Zero(), | |
| 1740 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA)); | |
| 1741 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, BytesInFlight(), i, | |
| 1742 1024, HAS_RETRANSMITTABLE_DATA)) | |
| 1743 .WillOnce(Return(true)); | |
| 1744 SerializedPacket packet(CreatePacket(i, true)); | |
| 1745 manager_.OnPacketSent(&packet, 0, clock_.Now(), 1024, | |
| 1746 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA); | |
| 1747 } | |
| 1748 EXPECT_EQ(QuicTime::Delta::Infinite(), | |
| 1749 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA)); | |
| 1750 } | |
| 1751 | |
| 1752 TEST_F(QuicSentPacketManagerTest, ReceiveWindowLimited) { | |
| 1753 EXPECT_EQ(kDefaultSocketReceiveBuffer, | |
| 1754 QuicSentPacketManagerPeer::GetReceiveWindow(&manager_)); | |
| 1755 | |
| 1756 // Ensure the smaller send window only allows 256 * 0.95 packets to be sent. | |
| 1757 for (QuicPacketSequenceNumber i = 1; i <= 244; ++i) { | |
| 1758 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _)).WillOnce(Return( | |
| 1759 QuicTime::Delta::Zero())); | |
| 1760 EXPECT_EQ(QuicTime::Delta::Zero(), | |
| 1761 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA)); | |
| 1762 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, BytesInFlight(), i, | |
| 1763 1024, HAS_RETRANSMITTABLE_DATA)) | |
| 1764 .WillOnce(Return(true)); | |
| 1765 SerializedPacket packet(CreatePacket(i, true)); | |
| 1766 manager_.OnPacketSent(&packet, 0, clock_.Now(), 1024, | |
| 1767 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA); | |
| 1768 } | |
| 1769 EXPECT_EQ(QuicTime::Delta::Infinite(), | |
| 1770 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA)); | |
| 1771 } | |
| 1772 | |
| 1773 TEST_F(QuicSentPacketManagerTest, UseInitialRoundTripTimeToSend) { | |
| 1774 uint32 initial_rtt_us = 325000; | |
| 1775 EXPECT_NE(initial_rtt_us, | |
| 1776 manager_.GetRttStats()->smoothed_rtt().ToMicroseconds()); | |
| 1777 | |
| 1778 QuicConfig config; | |
| 1779 config.SetInitialRoundTripTimeUsToSend(initial_rtt_us); | |
| 1780 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _, _)); | |
| 1781 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | |
| 1782 EXPECT_CALL(*network_change_visitor_, OnRttChange()); | |
| 1783 manager_.SetFromConfig(config); | |
| 1784 | |
| 1785 EXPECT_EQ(0, manager_.GetRttStats()->smoothed_rtt().ToMicroseconds()); | |
| 1786 EXPECT_EQ(initial_rtt_us, manager_.GetRttStats()->initial_rtt_us()); | |
| 1787 } | |
| 1788 | |
| 1789 TEST_F(QuicSentPacketManagerTest, ResumeConnectionState) { | |
| 1790 // The sent packet manager should use the RTT from CachedNetworkParameters if | |
| 1791 // it is provided. | |
| 1792 const int kRttMs = 1234; | |
| 1793 CachedNetworkParameters cached_network_params; | |
| 1794 cached_network_params.set_min_rtt_ms(kRttMs); | |
| 1795 | |
| 1796 EXPECT_CALL(*send_algorithm_, ResumeConnectionState(_)); | |
| 1797 manager_.ResumeConnectionState(cached_network_params); | |
| 1798 EXPECT_EQ(kRttMs * kNumMicrosPerMilli, | |
| 1799 static_cast<uint64>(manager_.GetRttStats()->initial_rtt_us())); | |
| 1800 } | |
| 1801 | |
| 1802 } // namespace | |
| 1803 } // namespace test | |
| 1804 } // namespace net | |
| OLD | NEW |