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
3 // found in the LICENSE file.
5 #include "net/quic/congestion_control/pacing_sender.h"
7 #include "base/logging.h"
8 #include "base/memory/scoped_ptr.h"
9 #include "net/quic/quic_protocol.h"
10 #include "net/quic/test_tools/mock_clock.h"
11 #include "net/quic/test_tools/quic_test_utils.h"
12 #include "testing/gtest/include/gtest/gtest.h"
14 using testing::Return;
15 using testing::StrictMock;
21 const QuicByteCount kBytesInFlight = 1024;
23 class PacingSenderTest : public ::testing::Test {
26 : zero_time_(QuicTime::Delta::Zero()),
27 infinite_time_(QuicTime::Delta::Infinite()),
29 mock_sender_(new StrictMock<MockSendAlgorithm>()),
30 pacing_sender_(new PacingSender(mock_sender_,
31 QuicTime::Delta::FromMilliseconds(1))) {
32 // Pick arbitrary time.
33 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(9));
36 virtual ~PacingSenderTest() {}
38 void CheckPacketIsSentImmediately() {
39 // In order for the packet to be sendable, the underlying sender must
40 // permit it to be sent immediately.
41 EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(),
43 HAS_RETRANSMITTABLE_DATA))
44 .WillOnce(Return(zero_time_));
45 // Verify that the packet can be sent immediately.
47 pacing_sender_->TimeUntilSend(clock_.Now(),
49 HAS_RETRANSMITTABLE_DATA));
51 // Actually send the packet.
52 EXPECT_CALL(*mock_sender_,
53 OnPacketSent(clock_.Now(), kBytesInFlight, sequence_number_,
54 kMaxPacketSize, HAS_RETRANSMITTABLE_DATA));
55 pacing_sender_->OnPacketSent(clock_.Now(), kBytesInFlight,
56 sequence_number_++, kMaxPacketSize,
57 HAS_RETRANSMITTABLE_DATA);
60 void CheckAckIsSentImmediately() {
61 // In order for the ack to be sendable, the underlying sender must
62 // permit it to be sent immediately.
63 EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(),
65 NO_RETRANSMITTABLE_DATA))
66 .WillOnce(Return(zero_time_));
67 // Verify that the ACK can be sent immediately.
69 pacing_sender_->TimeUntilSend(clock_.Now(),
71 NO_RETRANSMITTABLE_DATA));
73 // Actually send the packet.
74 EXPECT_CALL(*mock_sender_,
75 OnPacketSent(clock_.Now(), 0, sequence_number_,
76 kMaxPacketSize, NO_RETRANSMITTABLE_DATA));
77 pacing_sender_->OnPacketSent(clock_.Now(), 0,
78 sequence_number_++, kMaxPacketSize,
79 NO_RETRANSMITTABLE_DATA);
82 void CheckPacketIsDelayed(QuicTime::Delta delay) {
83 // In order for the packet to be sendable, the underlying sender must
84 // permit it to be sent immediately.
85 EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(),
87 HAS_RETRANSMITTABLE_DATA))
88 .WillOnce(Return(zero_time_));
89 // Verify that the packet is delayed.
90 EXPECT_EQ(delay.ToMicroseconds(),
91 pacing_sender_->TimeUntilSend(
92 clock_.Now(), kBytesInFlight,
93 HAS_RETRANSMITTABLE_DATA).ToMicroseconds());
96 const QuicTime::Delta zero_time_;
97 const QuicTime::Delta infinite_time_;
99 QuicPacketSequenceNumber sequence_number_;
100 StrictMock<MockSendAlgorithm>* mock_sender_;
101 scoped_ptr<PacingSender> pacing_sender_;
104 TEST_F(PacingSenderTest, NoSend) {
105 EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(),
107 HAS_RETRANSMITTABLE_DATA))
108 .WillOnce(Return(infinite_time_));
109 EXPECT_EQ(infinite_time_,
110 pacing_sender_->TimeUntilSend(clock_.Now(),
112 HAS_RETRANSMITTABLE_DATA));
115 TEST_F(PacingSenderTest, SendNow) {
116 EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(),
118 HAS_RETRANSMITTABLE_DATA))
119 .WillOnce(Return(zero_time_));
120 EXPECT_EQ(zero_time_,
121 pacing_sender_->TimeUntilSend(clock_.Now(),
123 HAS_RETRANSMITTABLE_DATA));
126 TEST_F(PacingSenderTest, VariousSending) {
127 // Configure bandwith of 1 packet per 2 ms, for which the pacing rate
128 // will be 1 packet per 1 ms.
129 EXPECT_CALL(*mock_sender_, BandwidthEstimate())
130 .WillRepeatedly(Return(QuicBandwidth::FromBytesAndTimeDelta(
131 kMaxPacketSize, QuicTime::Delta::FromMilliseconds(2))));
133 // Send a whole pile of packets, and verify that they are not paced.
134 for (int i = 0 ; i < 1000; ++i) {
135 CheckPacketIsSentImmediately();
138 // Now update the RTT and verify that packets are actually paced.
139 EXPECT_CALL(*mock_sender_, OnCongestionEvent(true, kBytesInFlight, _, _));
140 SendAlgorithmInterface::CongestionMap empty_map;
141 pacing_sender_->OnCongestionEvent(true, kBytesInFlight, empty_map, empty_map);
143 CheckPacketIsSentImmediately();
144 CheckPacketIsSentImmediately();
145 CheckPacketIsSentImmediately();
147 // The first packet was a "make up", then we sent two packets "into the
148 // future", so the delay should be 2.
149 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
152 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(2));
153 CheckPacketIsSentImmediately();
154 CheckPacketIsSentImmediately();
155 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
156 CheckAckIsSentImmediately();
159 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(4));
160 CheckPacketIsSentImmediately();
161 CheckPacketIsSentImmediately();
162 CheckPacketIsSentImmediately();
163 CheckPacketIsSentImmediately();
164 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
166 // Wake up too early.
167 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
169 // Wake up early, but after enough time has passed to permit a send.
170 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1));
171 CheckPacketIsSentImmediately();
172 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));