| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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/pacing_sender.h" | 5 #include "net/quic/congestion_control/pacing_sender.h" |
| 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/quic_protocol.h" | 9 #include "net/quic/quic_protocol.h" |
| 10 #include "net/quic/test_tools/mock_clock.h" | 10 #include "net/quic/test_tools/mock_clock.h" |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 QuicTime::Delta::FromMilliseconds(1))) { | 31 QuicTime::Delta::FromMilliseconds(1))) { |
| 32 // Pick arbitrary time. | 32 // Pick arbitrary time. |
| 33 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(9)); | 33 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(9)); |
| 34 } | 34 } |
| 35 | 35 |
| 36 virtual ~PacingSenderTest() {} | 36 virtual ~PacingSenderTest() {} |
| 37 | 37 |
| 38 void CheckPacketIsSentImmediately() { | 38 void CheckPacketIsSentImmediately() { |
| 39 // In order for the packet to be sendable, the underlying sender must | 39 // In order for the packet to be sendable, the underlying sender must |
| 40 // permit it to be sent immediately. | 40 // permit it to be sent immediately. |
| 41 EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(), | 41 for (int i = 0; i < 2; ++i) { |
| 42 kBytesInFlight, | 42 EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(), |
| 43 HAS_RETRANSMITTABLE_DATA)) | 43 kBytesInFlight, |
| 44 .WillOnce(Return(zero_time_)); | 44 HAS_RETRANSMITTABLE_DATA)) |
| 45 // Verify that the packet can be sent immediately. | 45 .WillOnce(Return(zero_time_)); |
| 46 EXPECT_EQ(zero_time_, | 46 // Verify that the packet can be sent immediately. |
| 47 pacing_sender_->TimeUntilSend(clock_.Now(), | 47 EXPECT_EQ(zero_time_, |
| 48 kBytesInFlight, | 48 pacing_sender_->TimeUntilSend(clock_.Now(), |
| 49 HAS_RETRANSMITTABLE_DATA)); | 49 kBytesInFlight, |
| 50 HAS_RETRANSMITTABLE_DATA)); |
| 51 } |
| 50 | 52 |
| 51 // Actually send the packet. | 53 // Actually send the packet. |
| 52 EXPECT_CALL(*mock_sender_, | 54 EXPECT_CALL(*mock_sender_, |
| 53 OnPacketSent(clock_.Now(), kBytesInFlight, sequence_number_, | 55 OnPacketSent(clock_.Now(), kBytesInFlight, sequence_number_, |
| 54 kMaxPacketSize, HAS_RETRANSMITTABLE_DATA)); | 56 kMaxPacketSize, HAS_RETRANSMITTABLE_DATA)); |
| 55 pacing_sender_->OnPacketSent(clock_.Now(), kBytesInFlight, | 57 pacing_sender_->OnPacketSent(clock_.Now(), kBytesInFlight, |
| 56 sequence_number_++, kMaxPacketSize, | 58 sequence_number_++, kMaxPacketSize, |
| 57 HAS_RETRANSMITTABLE_DATA); | 59 HAS_RETRANSMITTABLE_DATA); |
| 58 } | 60 } |
| 59 | 61 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 75 OnPacketSent(clock_.Now(), 0, sequence_number_, | 77 OnPacketSent(clock_.Now(), 0, sequence_number_, |
| 76 kMaxPacketSize, NO_RETRANSMITTABLE_DATA)); | 78 kMaxPacketSize, NO_RETRANSMITTABLE_DATA)); |
| 77 pacing_sender_->OnPacketSent(clock_.Now(), 0, | 79 pacing_sender_->OnPacketSent(clock_.Now(), 0, |
| 78 sequence_number_++, kMaxPacketSize, | 80 sequence_number_++, kMaxPacketSize, |
| 79 NO_RETRANSMITTABLE_DATA); | 81 NO_RETRANSMITTABLE_DATA); |
| 80 } | 82 } |
| 81 | 83 |
| 82 void CheckPacketIsDelayed(QuicTime::Delta delay) { | 84 void CheckPacketIsDelayed(QuicTime::Delta delay) { |
| 83 // In order for the packet to be sendable, the underlying sender must | 85 // In order for the packet to be sendable, the underlying sender must |
| 84 // permit it to be sent immediately. | 86 // permit it to be sent immediately. |
| 85 EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(), | 87 for (int i = 0; i < 2; ++i) { |
| 86 kBytesInFlight, | 88 EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(), |
| 87 HAS_RETRANSMITTABLE_DATA)) | 89 kBytesInFlight, |
| 88 .WillOnce(Return(zero_time_)); | 90 HAS_RETRANSMITTABLE_DATA)) |
| 89 // Verify that the packet is delayed. | 91 .WillOnce(Return(zero_time_)); |
| 90 EXPECT_EQ(delay.ToMicroseconds(), | 92 // Verify that the packet is delayed. |
| 91 pacing_sender_->TimeUntilSend( | 93 EXPECT_EQ(delay.ToMicroseconds(), |
| 92 clock_.Now(), kBytesInFlight, | 94 pacing_sender_->TimeUntilSend( |
| 93 HAS_RETRANSMITTABLE_DATA).ToMicroseconds()); | 95 clock_.Now(), kBytesInFlight, |
| 96 HAS_RETRANSMITTABLE_DATA).ToMicroseconds()); |
| 97 } |
| 94 } | 98 } |
| 95 | 99 |
| 96 const QuicTime::Delta zero_time_; | 100 const QuicTime::Delta zero_time_; |
| 97 const QuicTime::Delta infinite_time_; | 101 const QuicTime::Delta infinite_time_; |
| 98 MockClock clock_; | 102 MockClock clock_; |
| 99 QuicPacketSequenceNumber sequence_number_; | 103 QuicPacketSequenceNumber sequence_number_; |
| 100 StrictMock<MockSendAlgorithm>* mock_sender_; | 104 StrictMock<MockSendAlgorithm>* mock_sender_; |
| 101 scoped_ptr<PacingSender> pacing_sender_; | 105 scoped_ptr<PacingSender> pacing_sender_; |
| 102 }; | 106 }; |
| 103 | 107 |
| 104 TEST_F(PacingSenderTest, NoSend) { | 108 TEST_F(PacingSenderTest, NoSend) { |
| 105 EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(), | 109 for (int i = 0; i < 2; ++i) { |
| 106 kBytesInFlight, | 110 EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(), |
| 107 HAS_RETRANSMITTABLE_DATA)) | 111 kBytesInFlight, |
| 108 .WillOnce(Return(infinite_time_)); | 112 HAS_RETRANSMITTABLE_DATA)) |
| 109 EXPECT_EQ(infinite_time_, | 113 .WillOnce(Return(infinite_time_)); |
| 110 pacing_sender_->TimeUntilSend(clock_.Now(), | 114 EXPECT_EQ(infinite_time_, |
| 111 kBytesInFlight, | 115 pacing_sender_->TimeUntilSend(clock_.Now(), |
| 112 HAS_RETRANSMITTABLE_DATA)); | 116 kBytesInFlight, |
| 117 HAS_RETRANSMITTABLE_DATA)); |
| 118 } |
| 113 } | 119 } |
| 114 | 120 |
| 115 TEST_F(PacingSenderTest, SendNow) { | 121 TEST_F(PacingSenderTest, SendNow) { |
| 116 EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(), | 122 for (int i = 0; i < 2; ++i) { |
| 117 kBytesInFlight, | 123 EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(), |
| 118 HAS_RETRANSMITTABLE_DATA)) | 124 kBytesInFlight, |
| 119 .WillOnce(Return(zero_time_)); | 125 HAS_RETRANSMITTABLE_DATA)) |
| 120 EXPECT_EQ(zero_time_, | 126 .WillOnce(Return(zero_time_)); |
| 121 pacing_sender_->TimeUntilSend(clock_.Now(), | 127 EXPECT_EQ(zero_time_, |
| 122 kBytesInFlight, | 128 pacing_sender_->TimeUntilSend(clock_.Now(), |
| 123 HAS_RETRANSMITTABLE_DATA)); | 129 kBytesInFlight, |
| 130 HAS_RETRANSMITTABLE_DATA)); |
| 131 } |
| 124 } | 132 } |
| 125 | 133 |
| 126 TEST_F(PacingSenderTest, VariousSending) { | 134 TEST_F(PacingSenderTest, VariousSending) { |
| 127 // Configure bandwith of 1 packet per 2 ms, for which the pacing rate | 135 // Configure bandwith of 1 packet per 2 ms, for which the pacing rate |
| 128 // will be 1 packet per 1 ms. | 136 // will be 1 packet per 1 ms. |
| 129 EXPECT_CALL(*mock_sender_, BandwidthEstimate()) | 137 EXPECT_CALL(*mock_sender_, BandwidthEstimate()) |
| 130 .WillRepeatedly(Return(QuicBandwidth::FromBytesAndTimeDelta( | 138 .WillRepeatedly(Return(QuicBandwidth::FromBytesAndTimeDelta( |
| 131 kMaxPacketSize, QuicTime::Delta::FromMilliseconds(2)))); | 139 kMaxPacketSize, QuicTime::Delta::FromMilliseconds(2)))); |
| 132 | 140 |
| 133 // Send a whole pile of packets, and verify that they are not paced. | 141 // Send a whole pile of packets, and verify that they are not paced. |
| (...skipping 22 matching lines...) Expand all Loading... |
| 156 CheckAckIsSentImmediately(); | 164 CheckAckIsSentImmediately(); |
| 157 | 165 |
| 158 // Wake up late. | 166 // Wake up late. |
| 159 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(4)); | 167 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(4)); |
| 160 CheckPacketIsSentImmediately(); | 168 CheckPacketIsSentImmediately(); |
| 161 CheckPacketIsSentImmediately(); | 169 CheckPacketIsSentImmediately(); |
| 162 CheckPacketIsSentImmediately(); | 170 CheckPacketIsSentImmediately(); |
| 163 CheckPacketIsSentImmediately(); | 171 CheckPacketIsSentImmediately(); |
| 164 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2)); | 172 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2)); |
| 165 | 173 |
| 174 // Wake up really late. |
| 175 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(8)); |
| 176 CheckPacketIsSentImmediately(); |
| 177 CheckPacketIsSentImmediately(); |
| 178 CheckPacketIsSentImmediately(); |
| 179 CheckPacketIsSentImmediately(); |
| 180 CheckPacketIsSentImmediately(); |
| 181 CheckPacketIsSentImmediately(); |
| 182 CheckPacketIsSentImmediately(); |
| 183 CheckPacketIsSentImmediately(); |
| 184 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2)); |
| 185 |
| 186 // Wake up really late again, but application pause partway through. |
| 187 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(8)); |
| 188 CheckPacketIsSentImmediately(); |
| 189 CheckPacketIsSentImmediately(); |
| 190 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(100)); |
| 191 CheckPacketIsSentImmediately(); |
| 192 CheckPacketIsSentImmediately(); |
| 193 CheckPacketIsSentImmediately(); |
| 194 CheckPacketIsSentImmediately(); |
| 195 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2)); |
| 196 |
| 166 // Wake up too early. | 197 // Wake up too early. |
| 167 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2)); | 198 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2)); |
| 168 | 199 |
| 169 // Wake up early, but after enough time has passed to permit a send. | 200 // Wake up early, but after enough time has passed to permit a send. |
| 170 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); | 201 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); |
| 171 CheckPacketIsSentImmediately(); | 202 CheckPacketIsSentImmediately(); |
| 172 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2)); | 203 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2)); |
| 173 } | 204 } |
| 174 | 205 |
| 175 } // namespace test | 206 } // namespace test |
| 176 } // namespace net | 207 } // namespace net |
| OLD | NEW |