| 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/tcp_cubic_sender.h" | 9 #include "net/quic/congestion_control/tcp_cubic_sender.h" |
| 10 #include "net/quic/congestion_control/tcp_receiver.h" | 10 #include "net/quic/congestion_control/tcp_receiver.h" |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 QuicTcpCongestionWindow max_tcp_congestion_window) | 28 QuicTcpCongestionWindow max_tcp_congestion_window) |
| 29 : TcpCubicSender(clock, reno, max_tcp_congestion_window) { | 29 : TcpCubicSender(clock, reno, max_tcp_congestion_window) { |
| 30 } | 30 } |
| 31 | 31 |
| 32 QuicTcpCongestionWindow congestion_window() { | 32 QuicTcpCongestionWindow congestion_window() { |
| 33 return congestion_window_; | 33 return congestion_window_; |
| 34 } | 34 } |
| 35 | 35 |
| 36 using TcpCubicSender::AvailableSendWindow; | 36 using TcpCubicSender::AvailableSendWindow; |
| 37 using TcpCubicSender::SendWindow; | 37 using TcpCubicSender::SendWindow; |
| 38 using TcpCubicSender::AckAccounting; | |
| 39 }; | 38 }; |
| 40 | 39 |
| 41 class TcpCubicSenderTest : public ::testing::Test { | 40 class TcpCubicSenderTest : public ::testing::Test { |
| 42 protected: | 41 protected: |
| 43 TcpCubicSenderTest() | 42 TcpCubicSenderTest() |
| 44 : rtt_(QuicTime::Delta::FromMilliseconds(60)), | 43 : one_ms_(QuicTime::Delta::FromMilliseconds(1)), |
| 45 one_ms_(QuicTime::Delta::FromMilliseconds(1)), | |
| 46 sender_(new TcpCubicSenderPeer(&clock_, true, | 44 sender_(new TcpCubicSenderPeer(&clock_, true, |
| 47 kDefaultMaxCongestionWindowTCP)), | 45 kDefaultMaxCongestionWindowTCP)), |
| 48 receiver_(new TcpReceiver()), | 46 receiver_(new TcpReceiver()), |
| 49 sequence_number_(1), | 47 sequence_number_(1), |
| 50 acked_sequence_number_(0) { | 48 acked_sequence_number_(0) { |
| 51 } | 49 } |
| 52 | 50 |
| 53 void SendAvailableSendWindow() { | 51 void SendAvailableSendWindow() { |
| 54 QuicByteCount bytes_to_send = sender_->AvailableSendWindow(); | 52 QuicByteCount bytes_to_send = sender_->AvailableSendWindow(); |
| 55 while (bytes_to_send > 0) { | 53 while (bytes_to_send > 0) { |
| 56 QuicByteCount bytes_in_packet = min(kDefaultTCPMSS, bytes_to_send); | 54 QuicByteCount bytes_in_packet = min(kDefaultTCPMSS, bytes_to_send); |
| 57 sender_->OnPacketSent(clock_.Now(), sequence_number_++, bytes_in_packet, | 55 sender_->OnPacketSent(clock_.Now(), sequence_number_++, bytes_in_packet, |
| 58 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA); | 56 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA); |
| 59 bytes_to_send -= bytes_in_packet; | 57 bytes_to_send -= bytes_in_packet; |
| 60 if (bytes_to_send > 0) { | 58 if (bytes_to_send > 0) { |
| 61 EXPECT_TRUE(sender_->TimeUntilSend(clock_.Now(), NOT_RETRANSMISSION, | 59 EXPECT_TRUE(sender_->TimeUntilSend(clock_.Now(), NOT_RETRANSMISSION, |
| 62 HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero()); | 60 HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero()); |
| 63 } | 61 } |
| 64 } | 62 } |
| 65 } | 63 } |
| 66 // Normal is that TCP acks every other segment. | 64 // Normal is that TCP acks every other segment. |
| 67 void AckNPackets(int n) { | 65 void AckNPackets(int n) { |
| 68 for (int i = 0; i < n; ++i) { | 66 for (int i = 0; i < n; ++i) { |
| 69 acked_sequence_number_++; | 67 acked_sequence_number_++; |
| 70 sender_->OnPacketAcked(acked_sequence_number_, kDefaultTCPMSS, rtt_); | 68 sender_->UpdateRtt(QuicTime::Delta::FromMilliseconds(60)); |
| 69 sender_->OnPacketAcked(acked_sequence_number_, kDefaultTCPMSS); |
| 71 } | 70 } |
| 72 clock_.AdvanceTime(one_ms_); // 1 millisecond. | 71 clock_.AdvanceTime(one_ms_); // 1 millisecond. |
| 73 } | 72 } |
| 74 | 73 |
| 75 const QuicTime::Delta rtt_; | |
| 76 const QuicTime::Delta one_ms_; | 74 const QuicTime::Delta one_ms_; |
| 77 MockClock clock_; | 75 MockClock clock_; |
| 78 SendAlgorithmInterface::SentPacketsMap not_used_; | 76 SendAlgorithmInterface::SentPacketsMap not_used_; |
| 79 scoped_ptr<TcpCubicSenderPeer> sender_; | 77 scoped_ptr<TcpCubicSenderPeer> sender_; |
| 80 scoped_ptr<TcpReceiver> receiver_; | 78 scoped_ptr<TcpReceiver> receiver_; |
| 81 QuicPacketSequenceNumber sequence_number_; | 79 QuicPacketSequenceNumber sequence_number_; |
| 82 QuicPacketSequenceNumber acked_sequence_number_; | 80 QuicPacketSequenceNumber acked_sequence_number_; |
| 83 }; | 81 }; |
| 84 | 82 |
| 85 TEST_F(TcpCubicSenderTest, SimpleSender) { | 83 TEST_F(TcpCubicSenderTest, SimpleSender) { |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 151 | 149 |
| 152 for (int n = 0; n < kNumberOfAck; ++n) { | 150 for (int n = 0; n < kNumberOfAck; ++n) { |
| 153 // Send our full send window. | 151 // Send our full send window. |
| 154 SendAvailableSendWindow(); | 152 SendAvailableSendWindow(); |
| 155 AckNPackets(2); | 153 AckNPackets(2); |
| 156 } | 154 } |
| 157 QuicByteCount expected_send_window = | 155 QuicByteCount expected_send_window = |
| 158 kDefaultWindowTCP + (kDefaultTCPMSS * 2 * kNumberOfAck); | 156 kDefaultWindowTCP + (kDefaultTCPMSS * 2 * kNumberOfAck); |
| 159 EXPECT_EQ(expected_send_window, sender_->SendWindow()); | 157 EXPECT_EQ(expected_send_window, sender_->SendWindow()); |
| 160 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); | 158 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
| 159 |
| 161 // We should now have fallen out of slow start. | 160 // We should now have fallen out of slow start. |
| 162 SendAvailableSendWindow(); | |
| 163 AckNPackets(2); | |
| 164 expected_send_window += kDefaultTCPMSS; | |
| 165 EXPECT_EQ(expected_send_window, sender_->SendWindow()); | |
| 166 | |
| 167 // Testing Reno phase. | 161 // Testing Reno phase. |
| 168 // We should need 141(65*2+1+10) ACK:ed packets before increasing window by | 162 // We should need 141(65*2+1+10) ACK:ed packets before increasing window by |
| 169 // one. | 163 // one. |
| 170 for (int m = 0; m < 70; ++m) { | 164 for (int m = 0; m < 70; ++m) { |
| 171 SendAvailableSendWindow(); | 165 SendAvailableSendWindow(); |
| 172 AckNPackets(2); | 166 AckNPackets(2); |
| 173 EXPECT_EQ(expected_send_window, sender_->SendWindow()); | 167 EXPECT_EQ(expected_send_window, sender_->SendWindow()); |
| 174 } | 168 } |
| 175 SendAvailableSendWindow(); | 169 SendAvailableSendWindow(); |
| 176 AckNPackets(2); | 170 AckNPackets(2); |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 254 // packets are retransmitted. | 248 // packets are retransmitted. |
| 255 sender_->OnRetransmissionTimeout(false); | 249 sender_->OnRetransmissionTimeout(false); |
| 256 EXPECT_EQ(kDefaultWindowTCP, sender_->SendWindow()); | 250 EXPECT_EQ(kDefaultWindowTCP, sender_->SendWindow()); |
| 257 } | 251 } |
| 258 | 252 |
| 259 TEST_F(TcpCubicSenderTest, RetransmissionDelay) { | 253 TEST_F(TcpCubicSenderTest, RetransmissionDelay) { |
| 260 const int64 kRttMs = 10; | 254 const int64 kRttMs = 10; |
| 261 const int64 kDeviationMs = 3; | 255 const int64 kDeviationMs = 3; |
| 262 EXPECT_EQ(QuicTime::Delta::Zero(), sender_->RetransmissionDelay()); | 256 EXPECT_EQ(QuicTime::Delta::Zero(), sender_->RetransmissionDelay()); |
| 263 | 257 |
| 264 sender_->AckAccounting(QuicTime::Delta::FromMilliseconds(kRttMs)); | 258 sender_->UpdateRtt(QuicTime::Delta::FromMilliseconds(kRttMs)); |
| 265 | 259 |
| 266 // Initial value is to set the median deviation to half of the initial | 260 // Initial value is to set the median deviation to half of the initial |
| 267 // rtt, the median in then multiplied by a factor of 4 and finally the | 261 // rtt, the median in then multiplied by a factor of 4 and finally the |
| 268 // smoothed rtt is added which is the initial rtt. | 262 // smoothed rtt is added which is the initial rtt. |
| 269 QuicTime::Delta expected_delay = | 263 QuicTime::Delta expected_delay = |
| 270 QuicTime::Delta::FromMilliseconds(kRttMs + kRttMs / 2 * 4); | 264 QuicTime::Delta::FromMilliseconds(kRttMs + kRttMs / 2 * 4); |
| 271 EXPECT_EQ(expected_delay, sender_->RetransmissionDelay()); | 265 EXPECT_EQ(expected_delay, sender_->RetransmissionDelay()); |
| 272 | 266 |
| 273 for (int i = 0; i < 100; ++i) { | 267 for (int i = 0; i < 100; ++i) { |
| 274 // Run to make sure that we converge. | 268 // Run to make sure that we converge. |
| 275 sender_->AckAccounting( | 269 sender_->UpdateRtt( |
| 276 QuicTime::Delta::FromMilliseconds(kRttMs + kDeviationMs)); | 270 QuicTime::Delta::FromMilliseconds(kRttMs + kDeviationMs)); |
| 277 sender_->AckAccounting( | 271 sender_->UpdateRtt( |
| 278 QuicTime::Delta::FromMilliseconds(kRttMs - kDeviationMs)); | 272 QuicTime::Delta::FromMilliseconds(kRttMs - kDeviationMs)); |
| 279 } | 273 } |
| 280 expected_delay = QuicTime::Delta::FromMilliseconds(kRttMs + kDeviationMs * 4); | 274 expected_delay = QuicTime::Delta::FromMilliseconds(kRttMs + kDeviationMs * 4); |
| 281 | 275 |
| 282 EXPECT_NEAR(kRttMs, sender_->SmoothedRtt().ToMilliseconds(), 1); | 276 EXPECT_NEAR(kRttMs, sender_->SmoothedRtt().ToMilliseconds(), 1); |
| 283 EXPECT_NEAR(expected_delay.ToMilliseconds(), | 277 EXPECT_NEAR(expected_delay.ToMilliseconds(), |
| 284 sender_->RetransmissionDelay().ToMilliseconds(), | 278 sender_->RetransmissionDelay().ToMilliseconds(), |
| 285 1); | 279 1); |
| 286 EXPECT_EQ(static_cast<int64>( | 280 EXPECT_EQ(static_cast<int64>( |
| 287 sender_->GetCongestionWindow() * kNumMicrosPerSecond / | 281 sender_->GetCongestionWindow() * kNumMicrosPerSecond / |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 424 config.set_server_initial_congestion_window(2 * congestion_window, | 418 config.set_server_initial_congestion_window(2 * congestion_window, |
| 425 2 * congestion_window); | 419 2 * congestion_window); |
| 426 EXPECT_EQ(2 * congestion_window, config.server_initial_congestion_window()); | 420 EXPECT_EQ(2 * congestion_window, config.server_initial_congestion_window()); |
| 427 | 421 |
| 428 sender_->SetFromConfig(config, true); | 422 sender_->SetFromConfig(config, true); |
| 429 EXPECT_EQ(2 * congestion_window, sender_->congestion_window()); | 423 EXPECT_EQ(2 * congestion_window, sender_->congestion_window()); |
| 430 } | 424 } |
| 431 | 425 |
| 432 } // namespace test | 426 } // namespace test |
| 433 } // namespace net | 427 } // namespace net |
| OLD | NEW |