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 "net/quic/congestion_control/tcp_cubic_sender.h" | 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_receiver.h" | 10 #include "net/quic/congestion_control/tcp_receiver.h" |
10 #include "net/quic/test_tools/mock_clock.h" | 11 #include "net/quic/test_tools/mock_clock.h" |
11 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
12 | 13 |
| 14 using std::min; |
| 15 |
13 namespace net { | 16 namespace net { |
14 namespace test { | 17 namespace test { |
15 | 18 |
16 const uint32 kDefaultWindowTCP = 10 * kDefaultTCPMSS; | 19 const uint32 kDefaultWindowTCP = 10 * kDefaultTCPMSS; |
17 | 20 |
18 // TODO(ianswett): Remove 10000 once b/10075719 is fixed. | 21 // TODO(ianswett): Remove 10000 once b/10075719 is fixed. |
19 const QuicTcpCongestionWindow kDefaultMaxCongestionWindowTCP = 10000; | 22 const QuicTcpCongestionWindow kDefaultMaxCongestionWindowTCP = 10000; |
20 | 23 |
21 class TcpCubicSenderPeer : public TcpCubicSender { | 24 class TcpCubicSenderPeer : public TcpCubicSender { |
22 public: | 25 public: |
(...skipping 20 matching lines...) Expand all Loading... |
43 sender_(new TcpCubicSenderPeer(&clock_, true, | 46 sender_(new TcpCubicSenderPeer(&clock_, true, |
44 kDefaultMaxCongestionWindowTCP)), | 47 kDefaultMaxCongestionWindowTCP)), |
45 receiver_(new TcpReceiver()), | 48 receiver_(new TcpReceiver()), |
46 sequence_number_(1), | 49 sequence_number_(1), |
47 acked_sequence_number_(0) { | 50 acked_sequence_number_(0) { |
48 } | 51 } |
49 | 52 |
50 void SendAvailableSendWindow() { | 53 void SendAvailableSendWindow() { |
51 QuicByteCount bytes_to_send = sender_->AvailableSendWindow(); | 54 QuicByteCount bytes_to_send = sender_->AvailableSendWindow(); |
52 while (bytes_to_send > 0) { | 55 while (bytes_to_send > 0) { |
53 QuicByteCount bytes_in_packet = std::min(kDefaultTCPMSS, bytes_to_send); | 56 QuicByteCount bytes_in_packet = min(kDefaultTCPMSS, bytes_to_send); |
54 sender_->OnPacketSent(clock_.Now(), sequence_number_++, bytes_in_packet, | 57 sender_->OnPacketSent(clock_.Now(), sequence_number_++, bytes_in_packet, |
55 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA); | 58 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA); |
56 bytes_to_send -= bytes_in_packet; | 59 bytes_to_send -= bytes_in_packet; |
57 if (bytes_to_send > 0) { | 60 if (bytes_to_send > 0) { |
58 EXPECT_TRUE(sender_->TimeUntilSend(clock_.Now(), NOT_RETRANSMISSION, | 61 EXPECT_TRUE(sender_->TimeUntilSend(clock_.Now(), NOT_RETRANSMISSION, |
59 HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero()); | 62 HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero()); |
60 } | 63 } |
61 } | 64 } |
62 } | 65 } |
63 // Normal is that TCP acks every other segment. | 66 // Normal is that TCP acks every other segment. |
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
387 // Lose a later packet and ensure the window decreases. | 390 // Lose a later packet and ensure the window decreases. |
388 sender_->OnPacketLost(sequence_number_, clock_.Now()); | 391 sender_->OnPacketLost(sequence_number_, clock_.Now()); |
389 EXPECT_GT(post_loss_window, sender_->GetCongestionWindow()); | 392 EXPECT_GT(post_loss_window, sender_->GetCongestionWindow()); |
390 } | 393 } |
391 | 394 |
392 TEST_F(TcpCubicSenderTest, SendWindowNotAffectedByAcks) { | 395 TEST_F(TcpCubicSenderTest, SendWindowNotAffectedByAcks) { |
393 QuicByteCount send_window = sender_->AvailableSendWindow(); | 396 QuicByteCount send_window = sender_->AvailableSendWindow(); |
394 | 397 |
395 // Send a packet with no retransmittable data, and ensure that the congestion | 398 // Send a packet with no retransmittable data, and ensure that the congestion |
396 // window doesn't change. | 399 // window doesn't change. |
397 QuicByteCount bytes_in_packet = std::min(kDefaultTCPMSS, send_window); | 400 QuicByteCount bytes_in_packet = min(kDefaultTCPMSS, send_window); |
398 sender_->OnPacketSent(clock_.Now(), sequence_number_++, bytes_in_packet, | 401 sender_->OnPacketSent(clock_.Now(), sequence_number_++, bytes_in_packet, |
399 NOT_RETRANSMISSION, NO_RETRANSMITTABLE_DATA); | 402 NOT_RETRANSMISSION, NO_RETRANSMITTABLE_DATA); |
400 EXPECT_EQ(send_window, sender_->AvailableSendWindow()); | 403 EXPECT_EQ(send_window, sender_->AvailableSendWindow()); |
401 | 404 |
402 // Send a data packet with retransmittable data, and ensure that the | 405 // Send a data packet with retransmittable data, and ensure that the |
403 // congestion window has shrunk. | 406 // congestion window has shrunk. |
404 sender_->OnPacketSent(clock_.Now(), sequence_number_++, bytes_in_packet, | 407 sender_->OnPacketSent(clock_.Now(), sequence_number_++, bytes_in_packet, |
405 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA); | 408 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA); |
406 EXPECT_GT(send_window, sender_->AvailableSendWindow()); | 409 EXPECT_GT(send_window, sender_->AvailableSendWindow()); |
407 } | 410 } |
408 | 411 |
409 TEST_F(TcpCubicSenderTest, ConfigureMaxInitialWindow) { | 412 TEST_F(TcpCubicSenderTest, ConfigureMaxInitialWindow) { |
410 QuicTcpCongestionWindow congestion_window = sender_->congestion_window(); | 413 QuicTcpCongestionWindow congestion_window = sender_->congestion_window(); |
411 QuicConfig config; | 414 QuicConfig config; |
412 config.set_server_initial_congestion_window(2 * congestion_window, | 415 config.set_server_initial_congestion_window(2 * congestion_window, |
413 2 * congestion_window); | 416 2 * congestion_window); |
414 EXPECT_EQ(2 * congestion_window, config.server_initial_congestion_window()); | 417 EXPECT_EQ(2 * congestion_window, config.server_initial_congestion_window()); |
415 | 418 |
416 sender_->SetFromConfig(config, true); | 419 sender_->SetFromConfig(config, true); |
417 EXPECT_EQ(2 * congestion_window, sender_->congestion_window()); | 420 EXPECT_EQ(2 * congestion_window, sender_->congestion_window()); |
418 } | 421 } |
419 | 422 |
420 } // namespace test | 423 } // namespace test |
421 } // namespace net | 424 } // namespace net |
OLD | NEW |