| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <algorithm> | 5 #include <algorithm> |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
| 9 #include "net/quic/congestion_control/rtt_stats.h" | 9 #include "net/quic/congestion_control/rtt_stats.h" |
| 10 #include "net/quic/congestion_control/tcp_cubic_sender.h" | 10 #include "net/quic/congestion_control/tcp_cubic_sender.h" |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 124 MockClock clock_; | 124 MockClock clock_; |
| 125 scoped_ptr<TcpCubicSenderPeer> sender_; | 125 scoped_ptr<TcpCubicSenderPeer> sender_; |
| 126 scoped_ptr<TcpReceiver> receiver_; | 126 scoped_ptr<TcpReceiver> receiver_; |
| 127 QuicPacketSequenceNumber sequence_number_; | 127 QuicPacketSequenceNumber sequence_number_; |
| 128 QuicPacketSequenceNumber acked_sequence_number_; | 128 QuicPacketSequenceNumber acked_sequence_number_; |
| 129 QuicByteCount bytes_in_flight_; | 129 QuicByteCount bytes_in_flight_; |
| 130 TransmissionInfo standard_packet_; | 130 TransmissionInfo standard_packet_; |
| 131 }; | 131 }; |
| 132 | 132 |
| 133 TEST_F(TcpCubicSenderTest, SimpleSender) { | 133 TEST_F(TcpCubicSenderTest, SimpleSender) { |
| 134 QuicCongestionFeedbackFrame feedback; | |
| 135 // At startup make sure we are at the default. | 134 // At startup make sure we are at the default. |
| 136 EXPECT_EQ(kDefaultWindowTCP, sender_->GetCongestionWindow()); | 135 EXPECT_EQ(kDefaultWindowTCP, sender_->GetCongestionWindow()); |
| 137 // At startup make sure we can send. | 136 // At startup make sure we can send. |
| 138 EXPECT_TRUE(sender_->TimeUntilSend(clock_.Now(), | 137 EXPECT_TRUE(sender_->TimeUntilSend(clock_.Now(), |
| 139 0, | 138 0, |
| 140 HAS_RETRANSMITTABLE_DATA).IsZero()); | 139 HAS_RETRANSMITTABLE_DATA).IsZero()); |
| 141 // Get default QuicCongestionFeedbackFrame from receiver. | |
| 142 ASSERT_TRUE(receiver_->GenerateCongestionFeedback(&feedback)); | |
| 143 sender_->OnIncomingQuicCongestionFeedbackFrame(feedback, clock_.Now()); | |
| 144 // Make sure we can send. | 140 // Make sure we can send. |
| 145 EXPECT_TRUE(sender_->TimeUntilSend(clock_.Now(), | 141 EXPECT_TRUE(sender_->TimeUntilSend(clock_.Now(), |
| 146 0, | 142 0, |
| 147 HAS_RETRANSMITTABLE_DATA).IsZero()); | 143 HAS_RETRANSMITTABLE_DATA).IsZero()); |
| 148 // And that window is un-affected. | 144 // And that window is un-affected. |
| 149 EXPECT_EQ(kDefaultWindowTCP, sender_->GetCongestionWindow()); | 145 EXPECT_EQ(kDefaultWindowTCP, sender_->GetCongestionWindow()); |
| 150 | 146 |
| 151 // Fill the send window with data, then verify that we can't send. | 147 // Fill the send window with data, then verify that we can't send. |
| 152 SendAvailableSendWindow(); | 148 SendAvailableSendWindow(); |
| 153 EXPECT_FALSE(sender_->TimeUntilSend(clock_.Now(), | 149 EXPECT_FALSE(sender_->TimeUntilSend(clock_.Now(), |
| 154 sender_->GetCongestionWindow(), | 150 sender_->GetCongestionWindow(), |
| 155 HAS_RETRANSMITTABLE_DATA).IsZero()); | 151 HAS_RETRANSMITTABLE_DATA).IsZero()); |
| 156 } | 152 } |
| 157 | 153 |
| 158 TEST_F(TcpCubicSenderTest, ApplicationLimitedSlowStart) { | 154 TEST_F(TcpCubicSenderTest, ApplicationLimitedSlowStart) { |
| 159 // Send exactly 10 packets and ensure the CWND ends at 14 packets. | 155 // Send exactly 10 packets and ensure the CWND ends at 14 packets. |
| 160 const int kNumberOfAcks = 5; | 156 const int kNumberOfAcks = 5; |
| 161 QuicCongestionFeedbackFrame feedback; | |
| 162 // At startup make sure we can send. | 157 // At startup make sure we can send. |
| 163 EXPECT_TRUE(sender_->TimeUntilSend(clock_.Now(), | 158 EXPECT_TRUE(sender_->TimeUntilSend(clock_.Now(), |
| 164 0, | 159 0, |
| 165 HAS_RETRANSMITTABLE_DATA).IsZero()); | 160 HAS_RETRANSMITTABLE_DATA).IsZero()); |
| 166 // Get default QuicCongestionFeedbackFrame from receiver. | |
| 167 ASSERT_TRUE(receiver_->GenerateCongestionFeedback(&feedback)); | |
| 168 sender_->OnIncomingQuicCongestionFeedbackFrame(feedback, clock_.Now()); | |
| 169 // Make sure we can send. | 161 // Make sure we can send. |
| 170 EXPECT_TRUE(sender_->TimeUntilSend(clock_.Now(), | 162 EXPECT_TRUE(sender_->TimeUntilSend(clock_.Now(), |
| 171 0, | 163 0, |
| 172 HAS_RETRANSMITTABLE_DATA).IsZero()); | 164 HAS_RETRANSMITTABLE_DATA).IsZero()); |
| 173 | 165 |
| 174 SendAvailableSendWindow(); | 166 SendAvailableSendWindow(); |
| 175 for (int i = 0; i < kNumberOfAcks; ++i) { | 167 for (int i = 0; i < kNumberOfAcks; ++i) { |
| 176 AckNPackets(2); | 168 AckNPackets(2); |
| 177 } | 169 } |
| 178 QuicByteCount bytes_to_send = sender_->SendWindow(); | 170 QuicByteCount bytes_to_send = sender_->SendWindow(); |
| 179 // It's expected 2 acks will arrive when the bytes_in_flight are greater than | 171 // It's expected 2 acks will arrive when the bytes_in_flight are greater than |
| 180 // half the CWND. | 172 // half the CWND. |
| 181 EXPECT_EQ(kDefaultWindowTCP + kDefaultTCPMSS * 2 * 2, | 173 EXPECT_EQ(kDefaultWindowTCP + kDefaultTCPMSS * 2 * 2, |
| 182 bytes_to_send); | 174 bytes_to_send); |
| 183 } | 175 } |
| 184 | 176 |
| 185 TEST_F(TcpCubicSenderTest, ExponentialSlowStart) { | 177 TEST_F(TcpCubicSenderTest, ExponentialSlowStart) { |
| 186 const int kNumberOfAcks = 20; | 178 const int kNumberOfAcks = 20; |
| 187 QuicCongestionFeedbackFrame feedback; | |
| 188 // At startup make sure we can send. | 179 // At startup make sure we can send. |
| 189 EXPECT_TRUE(sender_->TimeUntilSend(clock_.Now(), | 180 EXPECT_TRUE(sender_->TimeUntilSend(clock_.Now(), |
| 190 0, | 181 0, |
| 191 HAS_RETRANSMITTABLE_DATA).IsZero()); | 182 HAS_RETRANSMITTABLE_DATA).IsZero()); |
| 192 // Get default QuicCongestionFeedbackFrame from receiver. | |
| 193 ASSERT_TRUE(receiver_->GenerateCongestionFeedback(&feedback)); | |
| 194 sender_->OnIncomingQuicCongestionFeedbackFrame(feedback, clock_.Now()); | |
| 195 // Make sure we can send. | 183 // Make sure we can send. |
| 196 EXPECT_TRUE(sender_->TimeUntilSend(clock_.Now(), | 184 EXPECT_TRUE(sender_->TimeUntilSend(clock_.Now(), |
| 197 0, | 185 0, |
| 198 HAS_RETRANSMITTABLE_DATA).IsZero()); | 186 HAS_RETRANSMITTABLE_DATA).IsZero()); |
| 199 | 187 |
| 200 for (int i = 0; i < kNumberOfAcks; ++i) { | 188 for (int i = 0; i < kNumberOfAcks; ++i) { |
| 201 // Send our full send window. | 189 // Send our full send window. |
| 202 SendAvailableSendWindow(); | 190 SendAvailableSendWindow(); |
| 203 AckNPackets(2); | 191 AckNPackets(2); |
| 204 } | 192 } |
| 205 QuicByteCount bytes_to_send = sender_->SendWindow(); | 193 QuicByteCount bytes_to_send = sender_->SendWindow(); |
| 206 EXPECT_EQ(kDefaultWindowTCP + kDefaultTCPMSS * 2 * kNumberOfAcks, | 194 EXPECT_EQ(kDefaultWindowTCP + kDefaultTCPMSS * 2 * kNumberOfAcks, |
| 207 bytes_to_send); | 195 bytes_to_send); |
| 208 } | 196 } |
| 209 | 197 |
| 210 TEST_F(TcpCubicSenderTest, SlowStartAckTrain) { | 198 TEST_F(TcpCubicSenderTest, SlowStartAckTrain) { |
| 211 EXPECT_EQ(kDefaultMaxCongestionWindowTCP * kDefaultTCPMSS, | 199 EXPECT_EQ(kDefaultMaxCongestionWindowTCP * kDefaultTCPMSS, |
| 212 sender_->GetSlowStartThreshold()); | 200 sender_->GetSlowStartThreshold()); |
| 213 | 201 |
| 214 // Make sure that we fall out of slow start when we send ACK train longer | 202 // Make sure that we fall out of slow start when we send ACK train longer |
| 215 // than half the RTT, in this test case 30ms, which is more than 30 calls to | 203 // than half the RTT, in this test case 30ms, which is more than 30 calls to |
| 216 // Ack2Packets in one round. | 204 // Ack2Packets in one round. |
| 217 // Since we start at 10 packet first round will be 5 second round 10 etc | 205 // Since we start at 10 packet first round will be 5 second round 10 etc |
| 218 // Hence we should pass 30 at 65 = 5 + 10 + 20 + 30 | 206 // Hence we should pass 30 at 65 = 5 + 10 + 20 + 30 |
| 219 const int kNumberOfAcks = 65; | 207 const int kNumberOfAcks = 65; |
| 220 QuicCongestionFeedbackFrame feedback; | |
| 221 // Get default QuicCongestionFeedbackFrame from receiver. | |
| 222 ASSERT_TRUE(receiver_->GenerateCongestionFeedback(&feedback)); | |
| 223 sender_->OnIncomingQuicCongestionFeedbackFrame(feedback, clock_.Now()); | |
| 224 | |
| 225 for (int i = 0; i < kNumberOfAcks; ++i) { | 208 for (int i = 0; i < kNumberOfAcks; ++i) { |
| 226 // Send our full send window. | 209 // Send our full send window. |
| 227 SendAvailableSendWindow(); | 210 SendAvailableSendWindow(); |
| 228 AckNPackets(2); | 211 AckNPackets(2); |
| 229 } | 212 } |
| 230 QuicByteCount expected_send_window = | 213 QuicByteCount expected_send_window = |
| 231 kDefaultWindowTCP + (kDefaultTCPMSS * 2 * kNumberOfAcks); | 214 kDefaultWindowTCP + (kDefaultTCPMSS * 2 * kNumberOfAcks); |
| 232 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); | 215 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
| 233 | 216 |
| 234 // We should now have fallen out of slow start. | 217 // We should now have fallen out of slow start. |
| (...skipping 21 matching lines...) Expand all Loading... |
| 256 EXPECT_EQ(expected_send_window / 2 / kDefaultTCPMSS, | 239 EXPECT_EQ(expected_send_window / 2 / kDefaultTCPMSS, |
| 257 sender_->slowstart_threshold()); | 240 sender_->slowstart_threshold()); |
| 258 | 241 |
| 259 // Now revert the RTO and ensure the CWND and slowstart threshold revert. | 242 // Now revert the RTO and ensure the CWND and slowstart threshold revert. |
| 260 sender_->RevertRetransmissionTimeout(); | 243 sender_->RevertRetransmissionTimeout(); |
| 261 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); | 244 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
| 262 EXPECT_EQ(140u, sender_->slowstart_threshold()); | 245 EXPECT_EQ(140u, sender_->slowstart_threshold()); |
| 263 } | 246 } |
| 264 | 247 |
| 265 TEST_F(TcpCubicSenderTest, SlowStartPacketLoss) { | 248 TEST_F(TcpCubicSenderTest, SlowStartPacketLoss) { |
| 266 // Make sure that we fall out of slow start when we encounter a packet loss. | |
| 267 QuicCongestionFeedbackFrame feedback; | |
| 268 // Get default QuicCongestionFeedbackFrame from receiver. | |
| 269 ASSERT_TRUE(receiver_->GenerateCongestionFeedback(&feedback)); | |
| 270 sender_->OnIncomingQuicCongestionFeedbackFrame(feedback, clock_.Now()); | |
| 271 | |
| 272 const int kNumberOfAcks = 10; | 249 const int kNumberOfAcks = 10; |
| 273 for (int i = 0; i < kNumberOfAcks; ++i) { | 250 for (int i = 0; i < kNumberOfAcks; ++i) { |
| 274 // Send our full send window. | 251 // Send our full send window. |
| 275 SendAvailableSendWindow(); | 252 SendAvailableSendWindow(); |
| 276 AckNPackets(2); | 253 AckNPackets(2); |
| 277 } | 254 } |
| 278 SendAvailableSendWindow(); | 255 SendAvailableSendWindow(); |
| 279 QuicByteCount expected_send_window = kDefaultWindowTCP + | 256 QuicByteCount expected_send_window = kDefaultWindowTCP + |
| 280 (kDefaultTCPMSS * 2 * kNumberOfAcks); | 257 (kDefaultTCPMSS * 2 * kNumberOfAcks); |
| 281 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); | 258 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 313 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); | 290 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
| 314 | 291 |
| 315 // Now RTO and ensure slow start gets reset. | 292 // Now RTO and ensure slow start gets reset. |
| 316 EXPECT_TRUE(sender_->hybrid_slow_start().started()); | 293 EXPECT_TRUE(sender_->hybrid_slow_start().started()); |
| 317 sender_->OnRetransmissionTimeout(true); | 294 sender_->OnRetransmissionTimeout(true); |
| 318 EXPECT_FALSE(sender_->hybrid_slow_start().started()); | 295 EXPECT_FALSE(sender_->hybrid_slow_start().started()); |
| 319 } | 296 } |
| 320 | 297 |
| 321 TEST_F(TcpCubicSenderTest, SlowStartPacketLossPRR) { | 298 TEST_F(TcpCubicSenderTest, SlowStartPacketLossPRR) { |
| 322 // Test based on the first example in RFC6937. | 299 // Test based on the first example in RFC6937. |
| 323 // Make sure that we fall out of slow start when we encounter a packet loss. | |
| 324 QuicCongestionFeedbackFrame feedback; | |
| 325 // Get default QuicCongestionFeedbackFrame from receiver. | |
| 326 ASSERT_TRUE(receiver_->GenerateCongestionFeedback(&feedback)); | |
| 327 sender_->OnIncomingQuicCongestionFeedbackFrame(feedback, clock_.Now()); | |
| 328 | |
| 329 // Ack 10 packets in 5 acks to raise the CWND to 20, as in the example. | 300 // Ack 10 packets in 5 acks to raise the CWND to 20, as in the example. |
| 330 const int kNumberOfAcks = 5; | 301 const int kNumberOfAcks = 5; |
| 331 for (int i = 0; i < kNumberOfAcks; ++i) { | 302 for (int i = 0; i < kNumberOfAcks; ++i) { |
| 332 // Send our full send window. | 303 // Send our full send window. |
| 333 SendAvailableSendWindow(); | 304 SendAvailableSendWindow(); |
| 334 AckNPackets(2); | 305 AckNPackets(2); |
| 335 } | 306 } |
| 336 SendAvailableSendWindow(); | 307 SendAvailableSendWindow(); |
| 337 QuicByteCount expected_send_window = kDefaultWindowTCP + | 308 QuicByteCount expected_send_window = kDefaultWindowTCP + |
| 338 (kDefaultTCPMSS * 2 * kNumberOfAcks); | 309 (kDefaultTCPMSS * 2 * kNumberOfAcks); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 369 | 340 |
| 370 AckNPackets(1); | 341 AckNPackets(1); |
| 371 expected_send_window += kDefaultTCPMSS; | 342 expected_send_window += kDefaultTCPMSS; |
| 372 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); | 343 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
| 373 } | 344 } |
| 374 | 345 |
| 375 TEST_F(TcpCubicSenderTest, SlowStartBurstPacketLossPRR) { | 346 TEST_F(TcpCubicSenderTest, SlowStartBurstPacketLossPRR) { |
| 376 // Test based on the second example in RFC6937, though we also implement | 347 // Test based on the second example in RFC6937, though we also implement |
| 377 // forward acknowledgements, so the first two incoming acks will trigger | 348 // forward acknowledgements, so the first two incoming acks will trigger |
| 378 // PRR immediately. | 349 // PRR immediately. |
| 379 // Make sure that we fall out of slow start when we encounter a packet loss. | |
| 380 QuicCongestionFeedbackFrame feedback; | |
| 381 // Get default QuicCongestionFeedbackFrame from receiver. | |
| 382 ASSERT_TRUE(receiver_->GenerateCongestionFeedback(&feedback)); | |
| 383 sender_->OnIncomingQuicCongestionFeedbackFrame(feedback, clock_.Now()); | |
| 384 | |
| 385 // Ack 10 packets in 5 acks to raise the CWND to 20, as in the example. | 350 // Ack 10 packets in 5 acks to raise the CWND to 20, as in the example. |
| 386 const int kNumberOfAcks = 5; | 351 const int kNumberOfAcks = 5; |
| 387 for (int i = 0; i < kNumberOfAcks; ++i) { | 352 for (int i = 0; i < kNumberOfAcks; ++i) { |
| 388 // Send our full send window. | 353 // Send our full send window. |
| 389 SendAvailableSendWindow(); | 354 SendAvailableSendWindow(); |
| 390 AckNPackets(2); | 355 AckNPackets(2); |
| 391 } | 356 } |
| 392 SendAvailableSendWindow(); | 357 SendAvailableSendWindow(); |
| 393 QuicByteCount expected_send_window = kDefaultWindowTCP + | 358 QuicByteCount expected_send_window = kDefaultWindowTCP + |
| 394 (kDefaultTCPMSS * 2 * kNumberOfAcks); | 359 (kDefaultTCPMSS * 2 * kNumberOfAcks); |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 500 sender_->rtt_stats_.SmoothedRtt().ToMicroseconds()), | 465 sender_->rtt_stats_.SmoothedRtt().ToMicroseconds()), |
| 501 sender_->BandwidthEstimate().ToBytesPerSecond()); | 466 sender_->BandwidthEstimate().ToBytesPerSecond()); |
| 502 } | 467 } |
| 503 | 468 |
| 504 TEST_F(TcpCubicSenderTest, SlowStartMaxSendWindow) { | 469 TEST_F(TcpCubicSenderTest, SlowStartMaxSendWindow) { |
| 505 const QuicTcpCongestionWindow kMaxCongestionWindowTCP = 50; | 470 const QuicTcpCongestionWindow kMaxCongestionWindowTCP = 50; |
| 506 const int kNumberOfAcks = 100; | 471 const int kNumberOfAcks = 100; |
| 507 sender_.reset( | 472 sender_.reset( |
| 508 new TcpCubicSenderPeer(&clock_, false, kMaxCongestionWindowTCP)); | 473 new TcpCubicSenderPeer(&clock_, false, kMaxCongestionWindowTCP)); |
| 509 | 474 |
| 510 QuicCongestionFeedbackFrame feedback; | |
| 511 // Get default QuicCongestionFeedbackFrame from receiver. | |
| 512 ASSERT_TRUE(receiver_->GenerateCongestionFeedback(&feedback)); | |
| 513 sender_->OnIncomingQuicCongestionFeedbackFrame(feedback, clock_.Now()); | |
| 514 | |
| 515 for (int i = 0; i < kNumberOfAcks; ++i) { | 475 for (int i = 0; i < kNumberOfAcks; ++i) { |
| 516 // Send our full send window. | 476 // Send our full send window. |
| 517 SendAvailableSendWindow(); | 477 SendAvailableSendWindow(); |
| 518 AckNPackets(2); | 478 AckNPackets(2); |
| 519 } | 479 } |
| 520 QuicByteCount expected_send_window = | 480 QuicByteCount expected_send_window = |
| 521 kMaxCongestionWindowTCP * kDefaultTCPMSS; | 481 kMaxCongestionWindowTCP * kDefaultTCPMSS; |
| 522 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); | 482 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
| 523 } | 483 } |
| 524 | 484 |
| 525 TEST_F(TcpCubicSenderTest, TcpRenoMaxCongestionWindow) { | 485 TEST_F(TcpCubicSenderTest, TcpRenoMaxCongestionWindow) { |
| 526 const QuicTcpCongestionWindow kMaxCongestionWindowTCP = 50; | 486 const QuicTcpCongestionWindow kMaxCongestionWindowTCP = 50; |
| 527 const int kNumberOfAcks = 1000; | 487 const int kNumberOfAcks = 1000; |
| 528 sender_.reset( | 488 sender_.reset( |
| 529 new TcpCubicSenderPeer(&clock_, true, kMaxCongestionWindowTCP)); | 489 new TcpCubicSenderPeer(&clock_, true, kMaxCongestionWindowTCP)); |
| 530 | 490 |
| 531 QuicCongestionFeedbackFrame feedback; | |
| 532 // Get default QuicCongestionFeedbackFrame from receiver. | |
| 533 ASSERT_TRUE(receiver_->GenerateCongestionFeedback(&feedback)); | |
| 534 sender_->OnIncomingQuicCongestionFeedbackFrame(feedback, clock_.Now()); | |
| 535 | |
| 536 SendAvailableSendWindow(); | 491 SendAvailableSendWindow(); |
| 537 AckNPackets(2); | 492 AckNPackets(2); |
| 538 // Make sure we fall out of slow start. | 493 // Make sure we fall out of slow start. |
| 539 LoseNPackets(1); | 494 LoseNPackets(1); |
| 540 | 495 |
| 541 for (int i = 0; i < kNumberOfAcks; ++i) { | 496 for (int i = 0; i < kNumberOfAcks; ++i) { |
| 542 // Send our full send window. | 497 // Send our full send window. |
| 543 SendAvailableSendWindow(); | 498 SendAvailableSendWindow(); |
| 544 AckNPackets(2); | 499 AckNPackets(2); |
| 545 } | 500 } |
| 546 | 501 |
| 547 QuicByteCount expected_send_window = | 502 QuicByteCount expected_send_window = |
| 548 kMaxCongestionWindowTCP * kDefaultTCPMSS; | 503 kMaxCongestionWindowTCP * kDefaultTCPMSS; |
| 549 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); | 504 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
| 550 } | 505 } |
| 551 | 506 |
| 552 TEST_F(TcpCubicSenderTest, TcpCubicMaxCongestionWindow) { | 507 TEST_F(TcpCubicSenderTest, TcpCubicMaxCongestionWindow) { |
| 553 const QuicTcpCongestionWindow kMaxCongestionWindowTCP = 50; | 508 const QuicTcpCongestionWindow kMaxCongestionWindowTCP = 50; |
| 554 // Set to 10000 to compensate for small cubic alpha. | 509 // Set to 10000 to compensate for small cubic alpha. |
| 555 const int kNumberOfAcks = 10000; | 510 const int kNumberOfAcks = 10000; |
| 556 | 511 |
| 557 sender_.reset( | 512 sender_.reset( |
| 558 new TcpCubicSenderPeer(&clock_, false, kMaxCongestionWindowTCP)); | 513 new TcpCubicSenderPeer(&clock_, false, kMaxCongestionWindowTCP)); |
| 559 | 514 |
| 560 QuicCongestionFeedbackFrame feedback; | |
| 561 // Get default QuicCongestionFeedbackFrame from receiver. | |
| 562 ASSERT_TRUE(receiver_->GenerateCongestionFeedback(&feedback)); | |
| 563 sender_->OnIncomingQuicCongestionFeedbackFrame(feedback, clock_.Now()); | |
| 564 | |
| 565 SendAvailableSendWindow(); | 515 SendAvailableSendWindow(); |
| 566 AckNPackets(2); | 516 AckNPackets(2); |
| 567 // Make sure we fall out of slow start. | 517 // Make sure we fall out of slow start. |
| 568 LoseNPackets(1); | 518 LoseNPackets(1); |
| 569 | 519 |
| 570 for (int i = 0; i < kNumberOfAcks; ++i) { | 520 for (int i = 0; i < kNumberOfAcks; ++i) { |
| 571 // Send our full send window. | 521 // Send our full send window. |
| 572 SendAvailableSendWindow(); | 522 SendAvailableSendWindow(); |
| 573 AckNPackets(2); | 523 AckNPackets(2); |
| 574 } | 524 } |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 617 // Verify that kCOPT: kIW10 forces the congestion window to the | 567 // Verify that kCOPT: kIW10 forces the congestion window to the |
| 618 // default of 10 regardless of ReceivedInitialWindow. | 568 // default of 10 regardless of ReceivedInitialWindow. |
| 619 QuicTagVector options; | 569 QuicTagVector options; |
| 620 options.push_back(kIW10); | 570 options.push_back(kIW10); |
| 621 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); | 571 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); |
| 622 sender_->SetFromConfig(config, true); | 572 sender_->SetFromConfig(config, true); |
| 623 EXPECT_EQ(congestion_window, sender_->congestion_window()); | 573 EXPECT_EQ(congestion_window, sender_->congestion_window()); |
| 624 } | 574 } |
| 625 | 575 |
| 626 TEST_F(TcpCubicSenderTest, CongestionAvoidanceAtEndOfRecovery) { | 576 TEST_F(TcpCubicSenderTest, CongestionAvoidanceAtEndOfRecovery) { |
| 627 // Make sure that we fall out of slow start when we encounter a packet loss. | |
| 628 QuicCongestionFeedbackFrame feedback; | |
| 629 // Get default QuicCongestionFeedbackFrame from receiver. | |
| 630 ASSERT_TRUE(receiver_->GenerateCongestionFeedback(&feedback)); | |
| 631 sender_->OnIncomingQuicCongestionFeedbackFrame(feedback, clock_.Now()); | |
| 632 // Ack 10 packets in 5 acks to raise the CWND to 20. | 577 // Ack 10 packets in 5 acks to raise the CWND to 20. |
| 633 const int kNumberOfAcks = 5; | 578 const int kNumberOfAcks = 5; |
| 634 for (int i = 0; i < kNumberOfAcks; ++i) { | 579 for (int i = 0; i < kNumberOfAcks; ++i) { |
| 635 // Send our full send window. | 580 // Send our full send window. |
| 636 SendAvailableSendWindow(); | 581 SendAvailableSendWindow(); |
| 637 AckNPackets(2); | 582 AckNPackets(2); |
| 638 } | 583 } |
| 639 SendAvailableSendWindow(); | 584 SendAvailableSendWindow(); |
| 640 QuicByteCount expected_send_window = kDefaultWindowTCP + | 585 QuicByteCount expected_send_window = kDefaultWindowTCP + |
| 641 (kDefaultTCPMSS * 2 * kNumberOfAcks); | 586 (kDefaultTCPMSS * 2 * kNumberOfAcks); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 666 } | 611 } |
| 667 | 612 |
| 668 // Next ack should cause congestion window to grow by 1MSS. | 613 // Next ack should cause congestion window to grow by 1MSS. |
| 669 AckNPackets(2); | 614 AckNPackets(2); |
| 670 expected_send_window += kDefaultTCPMSS; | 615 expected_send_window += kDefaultTCPMSS; |
| 671 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); | 616 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
| 672 } | 617 } |
| 673 | 618 |
| 674 } // namespace test | 619 } // namespace test |
| 675 } // namespace net | 620 } // namespace net |
| OLD | NEW |