Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(476)

Side by Side Diff: net/quic/congestion_control/pacing_sender_test.cc

Issue 839143002: Roll Chrome into Mojo. (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Rebase Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/quic/congestion_control/pacing_sender.cc ('k') | net/quic/congestion_control/rtt_stats.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 19 matching lines...) Expand all
30 mock_sender_(new StrictMock<MockSendAlgorithm>()), 30 mock_sender_(new StrictMock<MockSendAlgorithm>()),
31 pacing_sender_(new PacingSender(mock_sender_, 31 pacing_sender_(new PacingSender(mock_sender_,
32 QuicTime::Delta::FromMilliseconds(1), 32 QuicTime::Delta::FromMilliseconds(1),
33 0)) { 33 0)) {
34 // Pick arbitrary time. 34 // Pick arbitrary time.
35 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(9)); 35 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(9));
36 } 36 }
37 37
38 ~PacingSenderTest() override {} 38 ~PacingSenderTest() override {}
39 39
40 void CheckPacketIsSentImmediately() { 40 void InitPacingRate(QuicPacketCount burst_size, QuicBandwidth bandwidth) {
41 pacing_sender_.reset();
42 mock_sender_ = new StrictMock<MockSendAlgorithm>();
43 pacing_sender_.reset(new PacingSender(
44 mock_sender_, QuicTime::Delta::FromMilliseconds(1), burst_size));
45 EXPECT_CALL(*mock_sender_, PacingRate()).WillRepeatedly(Return(bandwidth));
46 }
47
48 void CheckPacketIsSentImmediately(HasRetransmittableData retransmittable_data,
49 QuicByteCount bytes_in_flight) {
41 // In order for the packet to be sendable, the underlying sender must 50 // In order for the packet to be sendable, the underlying sender must
42 // permit it to be sent immediately. 51 // permit it to be sent immediately.
43 for (int i = 0; i < 2; ++i) { 52 for (int i = 0; i < 2; ++i) {
44 EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(), 53 EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(), bytes_in_flight,
45 kBytesInFlight, 54 retransmittable_data))
46 HAS_RETRANSMITTABLE_DATA))
47 .WillOnce(Return(zero_time_)); 55 .WillOnce(Return(zero_time_));
48 // Verify that the packet can be sent immediately. 56 // Verify that the packet can be sent immediately.
49 EXPECT_EQ(zero_time_, 57 EXPECT_EQ(zero_time_,
50 pacing_sender_->TimeUntilSend(clock_.Now(), 58 pacing_sender_->TimeUntilSend(clock_.Now(), bytes_in_flight,
51 kBytesInFlight, 59 retransmittable_data));
52 HAS_RETRANSMITTABLE_DATA));
53 } 60 }
54 61
55 // Actually send the packet. 62 // Actually send the packet.
56 EXPECT_CALL(*mock_sender_, 63 EXPECT_CALL(*mock_sender_,
57 OnPacketSent(clock_.Now(), kBytesInFlight, sequence_number_, 64 OnPacketSent(clock_.Now(), bytes_in_flight, sequence_number_,
58 kMaxPacketSize, HAS_RETRANSMITTABLE_DATA)); 65 kMaxPacketSize, retransmittable_data));
59 pacing_sender_->OnPacketSent(clock_.Now(), kBytesInFlight, 66 pacing_sender_->OnPacketSent(clock_.Now(), bytes_in_flight,
60 sequence_number_++, kMaxPacketSize, 67 sequence_number_++, kMaxPacketSize,
61 HAS_RETRANSMITTABLE_DATA); 68 retransmittable_data);
69 }
70
71 void CheckPacketIsSentImmediately() {
72 CheckPacketIsSentImmediately(HAS_RETRANSMITTABLE_DATA, kBytesInFlight);
62 } 73 }
63 74
64 void CheckAckIsSentImmediately() { 75 void CheckAckIsSentImmediately() {
65 // In order for the ack to be sendable, the underlying sender must 76 CheckPacketIsSentImmediately(NO_RETRANSMITTABLE_DATA, kBytesInFlight);
66 // permit it to be sent immediately.
67 EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(),
68 0,
69 NO_RETRANSMITTABLE_DATA))
70 .WillOnce(Return(zero_time_));
71 // Verify that the ACK can be sent immediately.
72 EXPECT_EQ(zero_time_,
73 pacing_sender_->TimeUntilSend(clock_.Now(),
74 0,
75 NO_RETRANSMITTABLE_DATA));
76
77 // Actually send the packet.
78 EXPECT_CALL(*mock_sender_,
79 OnPacketSent(clock_.Now(), 0, sequence_number_,
80 kMaxPacketSize, NO_RETRANSMITTABLE_DATA));
81 pacing_sender_->OnPacketSent(clock_.Now(), 0,
82 sequence_number_++, kMaxPacketSize,
83 NO_RETRANSMITTABLE_DATA);
84 } 77 }
85 78
86 void CheckPacketIsDelayed(QuicTime::Delta delay) { 79 void CheckPacketIsDelayed(QuicTime::Delta delay) {
87 // In order for the packet to be sendable, the underlying sender must 80 // In order for the packet to be sendable, the underlying sender must
88 // permit it to be sent immediately. 81 // permit it to be sent immediately.
89 for (int i = 0; i < 2; ++i) { 82 for (int i = 0; i < 2; ++i) {
90 EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(), 83 EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(),
91 kBytesInFlight, 84 kBytesInFlight,
92 HAS_RETRANSMITTABLE_DATA)) 85 HAS_RETRANSMITTABLE_DATA))
93 .WillOnce(Return(zero_time_)); 86 .WillOnce(Return(zero_time_));
94 // Verify that the packet is delayed. 87 // Verify that the packet is delayed.
95 EXPECT_EQ(delay.ToMicroseconds(), 88 EXPECT_EQ(delay.ToMicroseconds(),
96 pacing_sender_->TimeUntilSend( 89 pacing_sender_->TimeUntilSend(
97 clock_.Now(), kBytesInFlight, 90 clock_.Now(), kBytesInFlight,
98 HAS_RETRANSMITTABLE_DATA).ToMicroseconds()); 91 HAS_RETRANSMITTABLE_DATA).ToMicroseconds());
99 } 92 }
100 } 93 }
101 94
95 void UpdateRtt() {
96 EXPECT_CALL(*mock_sender_, OnCongestionEvent(true, kBytesInFlight, _, _));
97 SendAlgorithmInterface::CongestionVector empty_map;
98 pacing_sender_->OnCongestionEvent(true, kBytesInFlight, empty_map,
99 empty_map);
100 }
101
102 const QuicTime::Delta zero_time_; 102 const QuicTime::Delta zero_time_;
103 const QuicTime::Delta infinite_time_; 103 const QuicTime::Delta infinite_time_;
104 MockClock clock_; 104 MockClock clock_;
105 QuicPacketSequenceNumber sequence_number_; 105 QuicPacketSequenceNumber sequence_number_;
106 StrictMock<MockSendAlgorithm>* mock_sender_; 106 StrictMock<MockSendAlgorithm>* mock_sender_;
107 scoped_ptr<PacingSender> pacing_sender_; 107 scoped_ptr<PacingSender> pacing_sender_;
108 }; 108 };
109 109
110 TEST_F(PacingSenderTest, NoSend) { 110 TEST_F(PacingSenderTest, NoSend) {
111 for (int i = 0; i < 2; ++i) { 111 for (int i = 0; i < 2; ++i) {
(...skipping 15 matching lines...) Expand all
127 HAS_RETRANSMITTABLE_DATA)) 127 HAS_RETRANSMITTABLE_DATA))
128 .WillOnce(Return(zero_time_)); 128 .WillOnce(Return(zero_time_));
129 EXPECT_EQ(zero_time_, 129 EXPECT_EQ(zero_time_,
130 pacing_sender_->TimeUntilSend(clock_.Now(), 130 pacing_sender_->TimeUntilSend(clock_.Now(),
131 kBytesInFlight, 131 kBytesInFlight,
132 HAS_RETRANSMITTABLE_DATA)); 132 HAS_RETRANSMITTABLE_DATA));
133 } 133 }
134 } 134 }
135 135
136 TEST_F(PacingSenderTest, VariousSending) { 136 TEST_F(PacingSenderTest, VariousSending) {
137 // Configure pacing rate of 1 packet per 1 ms. 137 // Configure pacing rate of 1 packet per 1 ms, no initial burst.
138 EXPECT_CALL(*mock_sender_, PacingRate()) 138 InitPacingRate(0, QuicBandwidth::FromBytesAndTimeDelta(
139 .WillRepeatedly(Return(QuicBandwidth::FromBytesAndTimeDelta( 139 kMaxPacketSize, QuicTime::Delta::FromMilliseconds(1)));
140 kMaxPacketSize, QuicTime::Delta::FromMilliseconds(1))));
141 140
142 // Now update the RTT and verify that packets are actually paced. 141 // Now update the RTT and verify that packets are actually paced.
143 EXPECT_CALL(*mock_sender_, OnCongestionEvent(true, kBytesInFlight, _, _)); 142 UpdateRtt();
144 SendAlgorithmInterface::CongestionVector empty_map;
145 pacing_sender_->OnCongestionEvent(true, kBytesInFlight, empty_map, empty_map);
146 143
147 CheckPacketIsSentImmediately(); 144 CheckPacketIsSentImmediately();
148 CheckPacketIsSentImmediately(); 145 CheckPacketIsSentImmediately();
149 CheckPacketIsSentImmediately();
150 146
151 // The first packet was a "make up", then we sent two packets "into the 147 // The first packet was a "make up", then we sent two packets "into the
152 // future", so the delay should be 2. 148 // future", so the delay should be 2.
153 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2)); 149 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
154 150
155 // Wake up on time. 151 // Wake up on time.
156 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(2)); 152 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(2));
157 CheckPacketIsSentImmediately(); 153 CheckPacketIsSentImmediately();
158 CheckPacketIsSentImmediately(); 154 CheckPacketIsSentImmediately();
159 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2)); 155 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
(...skipping 20 matching lines...) Expand all
180 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2)); 176 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
181 177
182 // Wake up really late again, but application pause partway through. 178 // Wake up really late again, but application pause partway through.
183 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(8)); 179 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(8));
184 CheckPacketIsSentImmediately(); 180 CheckPacketIsSentImmediately();
185 CheckPacketIsSentImmediately(); 181 CheckPacketIsSentImmediately();
186 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(100)); 182 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(100));
187 CheckPacketIsSentImmediately(); 183 CheckPacketIsSentImmediately();
188 CheckPacketIsSentImmediately(); 184 CheckPacketIsSentImmediately();
189 CheckPacketIsSentImmediately(); 185 CheckPacketIsSentImmediately();
190 CheckPacketIsSentImmediately();
191 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2)); 186 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
192 187
193 // Wake up too early. 188 // Wake up too early.
194 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2)); 189 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
195 190
196 // Wake up early, but after enough time has passed to permit a send. 191 // Wake up early, but after enough time has passed to permit a send.
197 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); 192 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1));
198 CheckPacketIsSentImmediately(); 193 CheckPacketIsSentImmediately();
199 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2)); 194 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
200 } 195 }
201 196
202 TEST_F(PacingSenderTest, CongestionAvoidanceSending) { 197 // TODO(ianswett): Remove this test.
198 TEST_F(PacingSenderTest, DISABLED_CongestionAvoidanceSending) {
203 // Configure pacing rate of 1 packet per 1 ms. 199 // Configure pacing rate of 1 packet per 1 ms.
204 EXPECT_CALL(*mock_sender_, PacingRate()) 200 EXPECT_CALL(*mock_sender_, PacingRate())
205 .WillRepeatedly(Return(QuicBandwidth::FromBytesAndTimeDelta( 201 .WillRepeatedly(Return(QuicBandwidth::FromBytesAndTimeDelta(
206 kMaxPacketSize * 1.25, QuicTime::Delta::FromMilliseconds(2)))); 202 kMaxPacketSize * 1.25, QuicTime::Delta::FromMilliseconds(2))));
207 203
208 // Now update the RTT and verify that packets are actually paced. 204 // Now update the RTT and verify that packets are actually paced.
209 EXPECT_CALL(*mock_sender_, OnCongestionEvent(true, kBytesInFlight, _, _)); 205 UpdateRtt();
210 SendAlgorithmInterface::CongestionVector empty_map;
211 pacing_sender_->OnCongestionEvent(true, kBytesInFlight, empty_map, empty_map);
212 206
213 CheckPacketIsSentImmediately(); 207 CheckPacketIsSentImmediately();
214 CheckPacketIsSentImmediately(); 208 CheckPacketIsSentImmediately();
215 209
216 // The first packet was a "make up", then we sent two packets "into the 210 // The first packet was a "make up", then we sent two packets "into the
217 // future", so the delay should be 2200us. 211 // future", so the delay should be 2200us.
218 CheckPacketIsDelayed(QuicTime::Delta::FromMicroseconds(2200)); 212 CheckPacketIsDelayed(QuicTime::Delta::FromMicroseconds(2200));
219 213
220 // Wake up on time. 214 // Wake up on time.
221 clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(2200)); 215 clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(2200));
(...skipping 30 matching lines...) Expand all
252 // Wake up too early. 246 // Wake up too early.
253 CheckPacketIsDelayed(QuicTime::Delta::FromMicroseconds(2200)); 247 CheckPacketIsDelayed(QuicTime::Delta::FromMicroseconds(2200));
254 248
255 // Wake up early, but after enough time has passed to permit a send. 249 // Wake up early, but after enough time has passed to permit a send.
256 clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(1200)); 250 clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(1200));
257 CheckPacketIsSentImmediately(); 251 CheckPacketIsSentImmediately();
258 CheckPacketIsDelayed(QuicTime::Delta::FromMicroseconds(2600)); 252 CheckPacketIsDelayed(QuicTime::Delta::FromMicroseconds(2600));
259 } 253 }
260 254
261 TEST_F(PacingSenderTest, InitialBurst) { 255 TEST_F(PacingSenderTest, InitialBurst) {
262 pacing_sender_.reset();
263 mock_sender_ = new StrictMock<MockSendAlgorithm>();
264 pacing_sender_.reset(new PacingSender(mock_sender_,
265 QuicTime::Delta::FromMilliseconds(1),
266 10));
267
268 // Configure pacing rate of 1 packet per 1 ms. 256 // Configure pacing rate of 1 packet per 1 ms.
269 EXPECT_CALL(*mock_sender_, PacingRate()) 257 InitPacingRate(10, QuicBandwidth::FromBytesAndTimeDelta(
270 .WillRepeatedly(Return(QuicBandwidth::FromBytesAndTimeDelta( 258 kMaxPacketSize, QuicTime::Delta::FromMilliseconds(1)));
271 kMaxPacketSize, QuicTime::Delta::FromMilliseconds(1))));
272 259
273 // Update the RTT and verify that the first 10 packets aren't paced. 260 // Update the RTT and verify that the first 10 packets aren't paced.
274 EXPECT_CALL(*mock_sender_, OnCongestionEvent(true, kBytesInFlight, _, _)); 261 UpdateRtt();
275 SendAlgorithmInterface::CongestionVector empty_map;
276 pacing_sender_->OnCongestionEvent(true, kBytesInFlight, empty_map, empty_map);
277 262
278 // Send 10 packets, and verify that they are not paced. 263 // Send 10 packets, and verify that they are not paced.
279 for (int i = 0 ; i < kInitialBurstPackets; ++i) { 264 for (int i = 0 ; i < kInitialBurstPackets; ++i) {
280 CheckPacketIsSentImmediately(); 265 CheckPacketIsSentImmediately();
281 } 266 }
282 267
283 // The first packet was a "make up", then we sent two packets "into the 268 // The first packet was a "make up", then we sent two packets "into the
284 // future", so the delay should be 2ms. 269 // future", so the delay should be 2ms.
285 CheckPacketIsSentImmediately(); 270 CheckPacketIsSentImmediately();
286 CheckPacketIsSentImmediately(); 271 CheckPacketIsSentImmediately();
287 CheckPacketIsSentImmediately();
288 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2)); 272 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
289 273
290 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5)); 274 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5));
291 CheckPacketIsSentImmediately(); 275 CheckPacketIsSentImmediately();
292 276
293 // Next time TimeUntilSend is called with no bytes in flight, the tokens 277 // Next time TimeUntilSend is called with no bytes in flight, pacing should
294 // should be refilled and there should be no delay. 278 // allow a packet to be sent, and when it's sent, the tokens are refilled.
295 EXPECT_CALL(*mock_sender_, 279 CheckPacketIsSentImmediately(HAS_RETRANSMITTABLE_DATA, 0);
296 TimeUntilSend(clock_.Now(), 280 for (int i = 0; i < kInitialBurstPackets - 1; ++i) {
297 0,
298 HAS_RETRANSMITTABLE_DATA)).
299 WillOnce(Return(zero_time_));
300 EXPECT_EQ(zero_time_,
301 pacing_sender_->TimeUntilSend(clock_.Now(),
302 0,
303 HAS_RETRANSMITTABLE_DATA));
304 for (int i = 0 ; i < kInitialBurstPackets; ++i) {
305 CheckPacketIsSentImmediately(); 281 CheckPacketIsSentImmediately();
306 } 282 }
307 283
308 // The first packet was a "make up", then we sent two packets "into the 284 // The first packet was a "make up", then we sent two packets "into the
309 // future", so the delay should be 2ms. 285 // future", so the delay should be 2ms.
310 CheckPacketIsSentImmediately(); 286 CheckPacketIsSentImmediately();
311 CheckPacketIsSentImmediately(); 287 CheckPacketIsSentImmediately();
312 CheckPacketIsSentImmediately();
313 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2)); 288 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
314 } 289 }
315 290
316 TEST_F(PacingSenderTest, InitialBurstNoRttMeasurement) { 291 TEST_F(PacingSenderTest, InitialBurstNoRttMeasurement) {
317 pacing_sender_.reset();
318 mock_sender_ = new StrictMock<MockSendAlgorithm>();
319 pacing_sender_.reset(new PacingSender(mock_sender_,
320 QuicTime::Delta::FromMilliseconds(1),
321 10));
322
323 // Configure pacing rate of 1 packet per 1 ms. 292 // Configure pacing rate of 1 packet per 1 ms.
324 EXPECT_CALL(*mock_sender_, PacingRate()) 293 InitPacingRate(10, QuicBandwidth::FromBytesAndTimeDelta(
325 .WillRepeatedly(Return(QuicBandwidth::FromBytesAndTimeDelta( 294 kMaxPacketSize, QuicTime::Delta::FromMilliseconds(1)));
326 kMaxPacketSize, QuicTime::Delta::FromMilliseconds(1))));
327 295
328 // Send 10 packets, and verify that they are not paced. 296 // Send 10 packets, and verify that they are not paced.
329 for (int i = 0 ; i < kInitialBurstPackets; ++i) { 297 for (int i = 0 ; i < kInitialBurstPackets; ++i) {
330 CheckPacketIsSentImmediately(); 298 CheckPacketIsSentImmediately();
331 } 299 }
332 300
333 // The first packet was a "make up", then we sent two packets "into the 301 // The first packet was a "make up", then we sent two packets "into the
334 // future", so the delay should be 2ms. 302 // future", so the delay should be 2ms.
335 CheckPacketIsSentImmediately(); 303 CheckPacketIsSentImmediately();
336 CheckPacketIsSentImmediately(); 304 CheckPacketIsSentImmediately();
337 CheckPacketIsSentImmediately();
338 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2)); 305 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
339 306
340 307
341 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5)); 308 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5));
342 CheckPacketIsSentImmediately(); 309 CheckPacketIsSentImmediately();
343 310
344 // Next time TimeUntilSend is called with no bytes in flight, the tokens 311 // Next time TimeUntilSend is called with no bytes in flight, the tokens
345 // should be refilled and there should be no delay. 312 // should be refilled and there should be no delay.
346 EXPECT_CALL(*mock_sender_, 313 CheckPacketIsSentImmediately(HAS_RETRANSMITTABLE_DATA, 0);
347 TimeUntilSend(clock_.Now(),
348 0,
349 HAS_RETRANSMITTABLE_DATA)).
350 WillOnce(Return(zero_time_));
351 EXPECT_EQ(zero_time_,
352 pacing_sender_->TimeUntilSend(clock_.Now(),
353 0,
354 HAS_RETRANSMITTABLE_DATA));
355 // Send 10 packets, and verify that they are not paced. 314 // Send 10 packets, and verify that they are not paced.
356 for (int i = 0 ; i < kInitialBurstPackets; ++i) { 315 for (int i = 0; i < kInitialBurstPackets - 1; ++i) {
357 CheckPacketIsSentImmediately(); 316 CheckPacketIsSentImmediately();
358 } 317 }
359 318
360 // The first packet was a "make up", then we sent two packets "into the 319 // The first packet was a "make up", then we sent two packets "into the
361 // future", so the delay should be 2ms. 320 // future", so the delay should be 2ms.
362 CheckPacketIsSentImmediately(); 321 CheckPacketIsSentImmediately();
363 CheckPacketIsSentImmediately(); 322 CheckPacketIsSentImmediately();
364 CheckPacketIsSentImmediately();
365 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2)); 323 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
366 } 324 }
367 325
326 TEST_F(PacingSenderTest, FastSending) {
327 // Ensure the pacing sender paces, even when the inter-packet spacing is less
328 // than the pacing granularity.
329 InitPacingRate(10,
330 QuicBandwidth::FromBytesAndTimeDelta(
331 2 * kMaxPacketSize, QuicTime::Delta::FromMilliseconds(1)));
332
333 // Update the RTT and verify that the first 10 packets aren't paced.
334 UpdateRtt();
335
336 // Send 10 packets, and verify that they are not paced.
337 for (int i = 0; i < kInitialBurstPackets; ++i) {
338 CheckPacketIsSentImmediately();
339 }
340
341 // The first packet was a "make up", then we sent two packets "into the
342 // future", since it's 2 packets/ms, so the delay should be 1.5ms.
343 CheckPacketIsSentImmediately();
344 CheckPacketIsSentImmediately();
345 CheckPacketIsSentImmediately();
346 CheckPacketIsDelayed(QuicTime::Delta::FromMicroseconds(1500));
347
348 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5));
349 CheckPacketIsSentImmediately();
350
351 // Next time TimeUntilSend is called with no bytes in flight, the tokens
352 // should be refilled and there should be no delay.
353 CheckPacketIsSentImmediately(HAS_RETRANSMITTABLE_DATA, 0);
354 for (int i = 0; i < kInitialBurstPackets - 1; ++i) {
355 CheckPacketIsSentImmediately();
356 }
357
358 // The first packet was a "make up", then we sent two packets "into the
359 // future", so the delay should be 1.5ms.
360 CheckPacketIsSentImmediately();
361 CheckPacketIsSentImmediately();
362 CheckPacketIsSentImmediately();
363 CheckPacketIsDelayed(QuicTime::Delta::FromMicroseconds(1500));
364 }
365
368 } // namespace test 366 } // namespace test
369 } // namespace net 367 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/congestion_control/pacing_sender.cc ('k') | net/quic/congestion_control/rtt_stats.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698