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

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

Issue 1313623006: relnote: Don't add burst tokens to QUIC's PacingSender when in recovery. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 3 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') | no next file » | 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 28 matching lines...) Expand all
39 39
40 void InitPacingRate(QuicPacketCount burst_size, QuicBandwidth bandwidth) { 40 void InitPacingRate(QuicPacketCount burst_size, QuicBandwidth bandwidth) {
41 pacing_sender_.reset(); 41 pacing_sender_.reset();
42 mock_sender_ = new StrictMock<MockSendAlgorithm>(); 42 mock_sender_ = new StrictMock<MockSendAlgorithm>();
43 pacing_sender_.reset(new PacingSender( 43 pacing_sender_.reset(new PacingSender(
44 mock_sender_, QuicTime::Delta::FromMilliseconds(1), burst_size)); 44 mock_sender_, QuicTime::Delta::FromMilliseconds(1), burst_size));
45 EXPECT_CALL(*mock_sender_, PacingRate()).WillRepeatedly(Return(bandwidth)); 45 EXPECT_CALL(*mock_sender_, PacingRate()).WillRepeatedly(Return(bandwidth));
46 } 46 }
47 47
48 void CheckPacketIsSentImmediately(HasRetransmittableData retransmittable_data, 48 void CheckPacketIsSentImmediately(HasRetransmittableData retransmittable_data,
49 QuicByteCount bytes_in_flight) { 49 QuicByteCount bytes_in_flight,
50 bool in_recovery) {
50 // In order for the packet to be sendable, the underlying sender must 51 // In order for the packet to be sendable, the underlying sender must
51 // permit it to be sent immediately. 52 // permit it to be sent immediately.
52 for (int i = 0; i < 2; ++i) { 53 for (int i = 0; i < 2; ++i) {
53 EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(), bytes_in_flight, 54 EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(), bytes_in_flight,
54 retransmittable_data)) 55 retransmittable_data))
55 .WillOnce(Return(zero_time_)); 56 .WillOnce(Return(zero_time_));
56 // Verify that the packet can be sent immediately. 57 // Verify that the packet can be sent immediately.
57 EXPECT_EQ(zero_time_, 58 EXPECT_EQ(zero_time_,
58 pacing_sender_->TimeUntilSend(clock_.Now(), bytes_in_flight, 59 pacing_sender_->TimeUntilSend(clock_.Now(), bytes_in_flight,
59 retransmittable_data)); 60 retransmittable_data));
60 } 61 }
61 62
62 // Actually send the packet. 63 // Actually send the packet.
64 if (bytes_in_flight == 0) {
65 EXPECT_CALL(*mock_sender_, InRecovery()).WillOnce(Return(in_recovery));
66 }
63 EXPECT_CALL(*mock_sender_, 67 EXPECT_CALL(*mock_sender_,
64 OnPacketSent(clock_.Now(), bytes_in_flight, packet_number_, 68 OnPacketSent(clock_.Now(), bytes_in_flight, packet_number_,
65 kMaxPacketSize, retransmittable_data)); 69 kMaxPacketSize, retransmittable_data));
66 pacing_sender_->OnPacketSent(clock_.Now(), bytes_in_flight, 70 pacing_sender_->OnPacketSent(clock_.Now(), bytes_in_flight,
67 packet_number_++, kMaxPacketSize, 71 packet_number_++, kMaxPacketSize,
68 retransmittable_data); 72 retransmittable_data);
69 } 73 }
70 74
71 void CheckPacketIsSentImmediately() { 75 void CheckPacketIsSentImmediately() {
72 CheckPacketIsSentImmediately(HAS_RETRANSMITTABLE_DATA, kBytesInFlight); 76 CheckPacketIsSentImmediately(HAS_RETRANSMITTABLE_DATA, kBytesInFlight,
77 false);
73 } 78 }
74 79
75 void CheckAckIsSentImmediately() { 80 void CheckAckIsSentImmediately() {
76 CheckPacketIsSentImmediately(NO_RETRANSMITTABLE_DATA, kBytesInFlight); 81 CheckPacketIsSentImmediately(NO_RETRANSMITTABLE_DATA, kBytesInFlight,
82 false);
77 } 83 }
78 84
79 void CheckPacketIsDelayed(QuicTime::Delta delay) { 85 void CheckPacketIsDelayed(QuicTime::Delta delay) {
80 // In order for the packet to be sendable, the underlying sender must 86 // In order for the packet to be sendable, the underlying sender must
81 // permit it to be sent immediately. 87 // permit it to be sent immediately.
82 for (int i = 0; i < 2; ++i) { 88 for (int i = 0; i < 2; ++i) {
83 EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(), 89 EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(),
84 kBytesInFlight, 90 kBytesInFlight,
85 HAS_RETRANSMITTABLE_DATA)) 91 HAS_RETRANSMITTABLE_DATA))
86 .WillOnce(Return(zero_time_)); 92 .WillOnce(Return(zero_time_));
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
213 // future", so the delay should be 2ms. 219 // future", so the delay should be 2ms.
214 CheckPacketIsSentImmediately(); 220 CheckPacketIsSentImmediately();
215 CheckPacketIsSentImmediately(); 221 CheckPacketIsSentImmediately();
216 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2)); 222 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
217 223
218 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5)); 224 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5));
219 CheckPacketIsSentImmediately(); 225 CheckPacketIsSentImmediately();
220 226
221 // Next time TimeUntilSend is called with no bytes in flight, pacing should 227 // Next time TimeUntilSend is called with no bytes in flight, pacing should
222 // allow a packet to be sent, and when it's sent, the tokens are refilled. 228 // allow a packet to be sent, and when it's sent, the tokens are refilled.
223 CheckPacketIsSentImmediately(HAS_RETRANSMITTABLE_DATA, 0); 229 CheckPacketIsSentImmediately(HAS_RETRANSMITTABLE_DATA, 0, false);
224 for (int i = 0; i < kInitialBurstPackets - 1; ++i) { 230 for (int i = 0; i < kInitialBurstPackets - 1; ++i) {
225 CheckPacketIsSentImmediately(); 231 CheckPacketIsSentImmediately();
226 } 232 }
227 233
228 // The first packet was a "make up", then we sent two packets "into the 234 // The first packet was a "make up", then we sent two packets "into the
229 // future", so the delay should be 2ms. 235 // future", so the delay should be 2ms.
230 CheckPacketIsSentImmediately(); 236 CheckPacketIsSentImmediately();
231 CheckPacketIsSentImmediately(); 237 CheckPacketIsSentImmediately();
232 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2)); 238 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
233 } 239 }
(...skipping 15 matching lines...) Expand all
249 CheckPacketIsSentImmediately(); 255 CheckPacketIsSentImmediately();
250 CheckPacketIsSentImmediately(); 256 CheckPacketIsSentImmediately();
251 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2)); 257 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
252 258
253 259
254 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5)); 260 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5));
255 CheckPacketIsSentImmediately(); 261 CheckPacketIsSentImmediately();
256 262
257 // Next time TimeUntilSend is called with no bytes in flight, the tokens 263 // Next time TimeUntilSend is called with no bytes in flight, the tokens
258 // should be refilled and there should be no delay. 264 // should be refilled and there should be no delay.
259 CheckPacketIsSentImmediately(HAS_RETRANSMITTABLE_DATA, 0); 265 CheckPacketIsSentImmediately(HAS_RETRANSMITTABLE_DATA, 0, false);
260 // Send 10 packets, and verify that they are not paced. 266 // Send 10 packets, and verify that they are not paced.
261 for (int i = 0; i < kInitialBurstPackets - 1; ++i) { 267 for (int i = 0; i < kInitialBurstPackets - 1; ++i) {
262 CheckPacketIsSentImmediately(); 268 CheckPacketIsSentImmediately();
263 } 269 }
264 270
265 // The first packet was a "make up", then we sent two packets "into the 271 // The first packet was a "make up", then we sent two packets "into the
266 // future", so the delay should be 2ms. 272 // future", so the delay should be 2ms.
267 CheckPacketIsSentImmediately(); 273 CheckPacketIsSentImmediately();
268 CheckPacketIsSentImmediately(); 274 CheckPacketIsSentImmediately();
269 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2)); 275 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
(...skipping 21 matching lines...) Expand all
291 CheckPacketIsSentImmediately(); 297 CheckPacketIsSentImmediately();
292 CheckPacketIsSentImmediately(); 298 CheckPacketIsSentImmediately();
293 CheckPacketIsSentImmediately(); 299 CheckPacketIsSentImmediately();
294 CheckPacketIsDelayed(QuicTime::Delta::FromMicroseconds(1500)); 300 CheckPacketIsDelayed(QuicTime::Delta::FromMicroseconds(1500));
295 301
296 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5)); 302 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5));
297 CheckPacketIsSentImmediately(); 303 CheckPacketIsSentImmediately();
298 304
299 // Next time TimeUntilSend is called with no bytes in flight, the tokens 305 // Next time TimeUntilSend is called with no bytes in flight, the tokens
300 // should be refilled and there should be no delay. 306 // should be refilled and there should be no delay.
301 CheckPacketIsSentImmediately(HAS_RETRANSMITTABLE_DATA, 0); 307 CheckPacketIsSentImmediately(HAS_RETRANSMITTABLE_DATA, 0, false);
302 for (int i = 0; i < kInitialBurstPackets - 1; ++i) { 308 for (int i = 0; i < kInitialBurstPackets - 1; ++i) {
303 CheckPacketIsSentImmediately(); 309 CheckPacketIsSentImmediately();
304 } 310 }
305 311
306 // The first packet was a "make up", then we sent two packets "into the 312 // The first packet was a "make up", then we sent two packets "into the
307 // future", so the delay should be 1.5ms. 313 // future", so the delay should be 1.5ms.
308 CheckPacketIsSentImmediately(); 314 CheckPacketIsSentImmediately();
309 CheckPacketIsSentImmediately(); 315 CheckPacketIsSentImmediately();
310 CheckPacketIsSentImmediately(); 316 CheckPacketIsSentImmediately();
311 CheckPacketIsDelayed(QuicTime::Delta::FromMicroseconds(1500)); 317 CheckPacketIsDelayed(QuicTime::Delta::FromMicroseconds(1500));
312 } 318 }
313 319
320 TEST_F(PacingSenderTest, NoBurstInRecovery) {
321 // Configure pacing rate of 1 packet per 1 ms with no burst tokens.
322 InitPacingRate(0, QuicBandwidth::FromBytesAndTimeDelta(
323 kMaxPacketSize, QuicTime::Delta::FromMilliseconds(1)));
324
325 UpdateRtt();
326
327 // Ensure only one packet is sent immediately and the rest are paced.
328 CheckPacketIsSentImmediately(HAS_RETRANSMITTABLE_DATA, 0, true);
329 CheckPacketIsSentImmediately();
330 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
331 }
332
314 } // namespace test 333 } // namespace test
315 } // namespace net 334 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/congestion_control/pacing_sender.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698