| 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 18 matching lines...) Expand all Loading... |
| 29 bool reno, | 29 bool reno, |
| 30 QuicTcpCongestionWindow max_tcp_congestion_window) | 30 QuicTcpCongestionWindow max_tcp_congestion_window) |
| 31 : TcpCubicSender( | 31 : TcpCubicSender( |
| 32 clock, &rtt_stats_, reno, max_tcp_congestion_window, &stats_) { | 32 clock, &rtt_stats_, reno, max_tcp_congestion_window, &stats_) { |
| 33 } | 33 } |
| 34 | 34 |
| 35 QuicTcpCongestionWindow congestion_window() { | 35 QuicTcpCongestionWindow congestion_window() { |
| 36 return congestion_window_; | 36 return congestion_window_; |
| 37 } | 37 } |
| 38 | 38 |
| 39 const HybridSlowStart& hybrid_slow_start() const { |
| 40 return hybrid_slow_start_; |
| 41 } |
| 42 |
| 39 RttStats rtt_stats_; | 43 RttStats rtt_stats_; |
| 40 QuicConnectionStats stats_; | 44 QuicConnectionStats stats_; |
| 41 | 45 |
| 42 using TcpCubicSender::AvailableSendWindow; | 46 using TcpCubicSender::AvailableSendWindow; |
| 43 using TcpCubicSender::SendWindow; | 47 using TcpCubicSender::SendWindow; |
| 44 }; | 48 }; |
| 45 | 49 |
| 46 class TcpCubicSenderTest : public ::testing::Test { | 50 class TcpCubicSenderTest : public ::testing::Test { |
| 47 protected: | 51 protected: |
| 48 TcpCubicSenderTest() | 52 TcpCubicSenderTest() |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 // one. | 190 // one. |
| 187 for (int i = 0; i < 69; ++i) { | 191 for (int i = 0; i < 69; ++i) { |
| 188 SendAvailableSendWindow(); | 192 SendAvailableSendWindow(); |
| 189 AckNPackets(2); | 193 AckNPackets(2); |
| 190 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); | 194 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
| 191 } | 195 } |
| 192 SendAvailableSendWindow(); | 196 SendAvailableSendWindow(); |
| 193 AckNPackets(2); | 197 AckNPackets(2); |
| 194 expected_send_window += kDefaultTCPMSS; | 198 expected_send_window += kDefaultTCPMSS; |
| 195 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); | 199 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
| 200 |
| 201 // Now RTO and ensure slow start gets reset. |
| 202 EXPECT_TRUE(sender_->hybrid_slow_start().started()); |
| 203 sender_->OnRetransmissionTimeout(true); |
| 204 EXPECT_FALSE(sender_->hybrid_slow_start().started()); |
| 196 } | 205 } |
| 197 | 206 |
| 198 TEST_F(TcpCubicSenderTest, SlowStartPacketLoss) { | 207 TEST_F(TcpCubicSenderTest, SlowStartPacketLoss) { |
| 199 // Make sure that we fall out of slow start when we encounter a packet loss. | 208 // Make sure that we fall out of slow start when we encounter a packet loss. |
| 200 QuicCongestionFeedbackFrame feedback; | 209 QuicCongestionFeedbackFrame feedback; |
| 201 // At startup make sure we can send. | 210 // At startup make sure we can send. |
| 202 EXPECT_TRUE(sender_->TimeUntilSend(clock_.Now(), | 211 EXPECT_TRUE(sender_->TimeUntilSend(clock_.Now(), |
| 203 HAS_RETRANSMITTABLE_DATA).IsZero()); | 212 HAS_RETRANSMITTABLE_DATA).IsZero()); |
| 204 // Get default QuicCongestionFeedbackFrame from receiver. | 213 // Get default QuicCongestionFeedbackFrame from receiver. |
| 205 ASSERT_TRUE(receiver_->GenerateCongestionFeedback(&feedback)); | 214 ASSERT_TRUE(receiver_->GenerateCongestionFeedback(&feedback)); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 248 // We need to ack another window before we increase CWND by 1. | 257 // We need to ack another window before we increase CWND by 1. |
| 249 for (size_t i = 0; i < number_of_packets_in_window - 2; ++i) { | 258 for (size_t i = 0; i < number_of_packets_in_window - 2; ++i) { |
| 250 AckNPackets(1); | 259 AckNPackets(1); |
| 251 SendAvailableSendWindow(); | 260 SendAvailableSendWindow(); |
| 252 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); | 261 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
| 253 } | 262 } |
| 254 | 263 |
| 255 AckNPackets(1); | 264 AckNPackets(1); |
| 256 expected_send_window += kDefaultTCPMSS; | 265 expected_send_window += kDefaultTCPMSS; |
| 257 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); | 266 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
| 267 |
| 268 // Now RTO and ensure slow start gets reset. |
| 269 EXPECT_TRUE(sender_->hybrid_slow_start().started()); |
| 270 sender_->OnRetransmissionTimeout(true); |
| 271 EXPECT_FALSE(sender_->hybrid_slow_start().started()); |
| 258 } | 272 } |
| 259 | 273 |
| 260 TEST_F(TcpCubicSenderTest, SlowStartPacketLossPRR) { | 274 TEST_F(TcpCubicSenderTest, SlowStartPacketLossPRR) { |
| 261 // Test based on the first example in RFC6937. | 275 // Test based on the first example in RFC6937. |
| 262 // Make sure that we fall out of slow start when we encounter a packet loss. | 276 // Make sure that we fall out of slow start when we encounter a packet loss. |
| 263 QuicCongestionFeedbackFrame feedback; | 277 QuicCongestionFeedbackFrame feedback; |
| 264 // At startup make sure we can send. | 278 // At startup make sure we can send. |
| 265 EXPECT_TRUE(sender_->TimeUntilSend(clock_.Now(), | 279 EXPECT_TRUE(sender_->TimeUntilSend(clock_.Now(), |
| 266 HAS_RETRANSMITTABLE_DATA).IsZero()); | 280 HAS_RETRANSMITTABLE_DATA).IsZero()); |
| 267 // Get default QuicCongestionFeedbackFrame from receiver. | 281 // Get default QuicCongestionFeedbackFrame from receiver. |
| (...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 625 } | 639 } |
| 626 | 640 |
| 627 // Next ack should cause congestion window to grow by 1MSS. | 641 // Next ack should cause congestion window to grow by 1MSS. |
| 628 AckNPackets(2); | 642 AckNPackets(2); |
| 629 expected_send_window += kDefaultTCPMSS; | 643 expected_send_window += kDefaultTCPMSS; |
| 630 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); | 644 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
| 631 } | 645 } |
| 632 | 646 |
| 633 } // namespace test | 647 } // namespace test |
| 634 } // namespace net | 648 } // namespace net |
| OLD | NEW |