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 |