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 "base/logging.h"
6 #include "base/memory/scoped_ptr.h"
7 #include "net/quic/congestion_control/inter_arrival_sender.h"
8 #include "net/quic/congestion_control/quic_congestion_manager.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/gmock/include/gmock/gmock.h"
13 #include "testing/gtest/include/gtest/gtest.h"
16 using testing::StrictMock;
17 using testing::Return;
22 class QuicCongestionManagerPeer : public QuicCongestionManager {
24 explicit QuicCongestionManagerPeer(const QuicClock* clock,
25 CongestionFeedbackType congestion_type)
26 : QuicCongestionManager(clock, congestion_type) {
28 void SetSendAlgorithm(SendAlgorithmInterface* send_algorithm) {
29 this->send_algorithm_.reset(send_algorithm);
32 using QuicCongestionManager::rtt;
33 const SendAlgorithmInterface::SentPacketsMap& packet_history_map() {
34 return packet_history_map_;
37 DISALLOW_COPY_AND_ASSIGN(QuicCongestionManagerPeer);
40 class QuicCongestionManagerTest : public ::testing::Test {
42 void SetUpCongestionType(CongestionFeedbackType congestion_type) {
43 manager_.reset(new QuicCongestionManagerPeer(&clock_, congestion_type));
46 static const HasRetransmittableData kIgnored = HAS_RETRANSMITTABLE_DATA;
49 scoped_ptr<QuicCongestionManagerPeer> manager_;
52 TEST_F(QuicCongestionManagerTest, Bandwidth) {
53 SetUpCongestionType(kFixRate);
55 manager_->OnIncomingAckFrame(ack, clock_.Now());
57 QuicCongestionFeedbackFrame feedback;
58 feedback.type = kFixRate;
59 feedback.fix_rate.bitrate = QuicBandwidth::FromKBytesPerSecond(100);
60 manager_->OnIncomingQuicCongestionFeedbackFrame(feedback, clock_.Now());
62 for (int i = 1; i <= 100; ++i) {
63 QuicTime::Delta advance_time = manager_->TimeUntilSend(
64 clock_.Now(), NOT_RETRANSMISSION, kIgnored, NOT_HANDSHAKE);
65 clock_.AdvanceTime(advance_time);
66 EXPECT_TRUE(manager_->TimeUntilSend(
67 clock_.Now(), NOT_RETRANSMISSION, kIgnored, NOT_HANDSHAKE).IsZero());
68 manager_->OnPacketSent(i, clock_.Now(), 1000, NOT_RETRANSMISSION,
69 HAS_RETRANSMITTABLE_DATA);
70 // Ack the packet we sent.
71 ack.received_info.largest_observed = i;
72 manager_->OnIncomingAckFrame(ack, clock_.Now());
74 EXPECT_EQ(100, manager_->BandwidthEstimate().ToKBytesPerSecond());
76 InterArrivalSender::CalculateSentBandwidth(
77 manager_->packet_history_map(),
78 clock_.Now()).ToKBytesPerSecond(),
82 TEST_F(QuicCongestionManagerTest, BandwidthWith1SecondGap) {
83 SetUpCongestionType(kFixRate);
85 manager_->OnIncomingAckFrame(ack, clock_.Now());
87 QuicCongestionFeedbackFrame feedback;
88 feedback.type = kFixRate;
89 feedback.fix_rate.bitrate = QuicBandwidth::FromKBytesPerSecond(100);
90 manager_->OnIncomingQuicCongestionFeedbackFrame(feedback, clock_.Now());
92 for (QuicPacketSequenceNumber sequence_number = 1; sequence_number <= 100;
94 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
95 EXPECT_TRUE(manager_->TimeUntilSend(
96 clock_.Now(), NOT_RETRANSMISSION, kIgnored, NOT_HANDSHAKE).IsZero());
97 manager_->OnPacketSent(sequence_number, clock_.Now(), 1000,
98 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA);
99 // Ack the packet we sent.
100 ack.received_info.largest_observed = sequence_number;
101 manager_->OnIncomingAckFrame(ack, clock_.Now());
103 EXPECT_EQ(100000, manager_->BandwidthEstimate().ToBytesPerSecond());
105 InterArrivalSender::CalculateSentBandwidth(
106 manager_->packet_history_map(),
107 clock_.Now()).ToBytesPerSecond(),
109 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(500));
111 InterArrivalSender::CalculateSentBandwidth(
112 manager_->packet_history_map(),
113 clock_.Now()).ToBytesPerSecond(),
115 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(501));
116 EXPECT_NEAR(100000, manager_->BandwidthEstimate().ToBytesPerSecond(), 2000);
117 EXPECT_TRUE(InterArrivalSender::CalculateSentBandwidth(
118 manager_->packet_history_map(),
119 clock_.Now()).IsZero());
120 for (int i = 1; i <= 150; ++i) {
121 EXPECT_TRUE(manager_->TimeUntilSend(
122 clock_.Now(), NOT_RETRANSMISSION, kIgnored, NOT_HANDSHAKE).IsZero());
123 manager_->OnPacketSent(i + 100, clock_.Now(), 1000, NOT_RETRANSMISSION,
124 HAS_RETRANSMITTABLE_DATA);
125 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
126 // Ack the packet we sent.
127 ack.received_info.largest_observed = i + 100;
128 manager_->OnIncomingAckFrame(ack, clock_.Now());
130 EXPECT_EQ(100, manager_->BandwidthEstimate().ToKBytesPerSecond());
132 InterArrivalSender::CalculateSentBandwidth(
133 manager_->packet_history_map(),
134 clock_.Now()).ToKBytesPerSecond(),
138 TEST_F(QuicCongestionManagerTest, Rtt) {
139 SetUpCongestionType(kFixRate);
141 MockSendAlgorithm* send_algorithm = new StrictMock<MockSendAlgorithm>;
142 manager_->SetSendAlgorithm(send_algorithm);
144 QuicPacketSequenceNumber sequence_number = 1;
145 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(15);
147 EXPECT_CALL(*send_algorithm, OnPacketSent(_, _, _, _, _))
148 .Times(1).WillOnce(Return(true));
149 EXPECT_CALL(*send_algorithm,
150 OnIncomingAck(sequence_number, _, expected_rtt)).Times(1);
152 manager_->OnPacketSent(sequence_number, clock_.Now(), 1000,
153 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA);
154 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
157 ack.received_info.largest_observed = sequence_number;
158 ack.received_info.delta_time_largest_observed =
159 QuicTime::Delta::FromMilliseconds(5);
160 manager_->OnIncomingAckFrame(ack, clock_.Now());
161 EXPECT_EQ(manager_->rtt(), expected_rtt);
164 TEST_F(QuicCongestionManagerTest, RttWithInvalidDelta) {
165 // Expect that the RTT is infinite since the delta_time_largest_observed is
166 // larger than the local time elapsed aka invalid.
167 SetUpCongestionType(kFixRate);
169 MockSendAlgorithm* send_algorithm = new StrictMock<MockSendAlgorithm>;
170 manager_->SetSendAlgorithm(send_algorithm);
172 QuicPacketSequenceNumber sequence_number = 1;
173 QuicTime::Delta expected_rtt = QuicTime::Delta::Infinite();
175 EXPECT_CALL(*send_algorithm, OnPacketSent(_, _, _, _, _))
176 .Times(1).WillOnce(Return(true));
177 EXPECT_CALL(*send_algorithm,
178 OnIncomingAck(sequence_number, _, expected_rtt)).Times(1);
180 manager_->OnPacketSent(sequence_number, clock_.Now(), 1000,
181 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA);
182 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
185 ack.received_info.largest_observed = sequence_number;
186 ack.received_info.delta_time_largest_observed =
187 QuicTime::Delta::FromMilliseconds(11);
188 manager_->OnIncomingAckFrame(ack, clock_.Now());
189 EXPECT_EQ(manager_->rtt(), expected_rtt);
192 TEST_F(QuicCongestionManagerTest, RttInfiniteDelta) {
193 // Expect that the RTT is infinite since the delta_time_largest_observed is
194 // infinite aka invalid.
195 SetUpCongestionType(kFixRate);
197 MockSendAlgorithm* send_algorithm = new StrictMock<MockSendAlgorithm>;
198 manager_->SetSendAlgorithm(send_algorithm);
200 QuicPacketSequenceNumber sequence_number = 1;
201 QuicTime::Delta expected_rtt = QuicTime::Delta::Infinite();
203 EXPECT_CALL(*send_algorithm, OnPacketSent(_, _, _, _, _))
204 .Times(1).WillOnce(Return(true));
205 EXPECT_CALL(*send_algorithm,
206 OnIncomingAck(sequence_number, _, expected_rtt)).Times(1);
208 manager_->OnPacketSent(sequence_number, clock_.Now(), 1000,
209 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA);
210 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
213 ack.received_info.largest_observed = sequence_number;
214 ack.received_info.delta_time_largest_observed = QuicTime::Delta::Infinite();
215 manager_->OnIncomingAckFrame(ack, clock_.Now());
216 EXPECT_EQ(manager_->rtt(), expected_rtt);
219 TEST_F(QuicCongestionManagerTest, RttZeroDelta) {
220 // Expect that the RTT is the time between send and receive since the
221 // delta_time_largest_observed is zero.
222 SetUpCongestionType(kFixRate);
224 MockSendAlgorithm* send_algorithm = new StrictMock<MockSendAlgorithm>;
225 manager_->SetSendAlgorithm(send_algorithm);
227 QuicPacketSequenceNumber sequence_number = 1;
228 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10);
230 EXPECT_CALL(*send_algorithm, OnPacketSent(_, _, _, _, _))
231 .Times(1).WillOnce(Return(true));
232 EXPECT_CALL(*send_algorithm, OnIncomingAck(sequence_number, _, expected_rtt))
235 manager_->OnPacketSent(sequence_number, clock_.Now(), 1000,
236 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA);
237 clock_.AdvanceTime(expected_rtt);
240 ack.received_info.largest_observed = sequence_number;
241 ack.received_info.delta_time_largest_observed = QuicTime::Delta::Zero();
242 manager_->OnIncomingAckFrame(ack, clock_.Now());
243 EXPECT_EQ(manager_->rtt(), expected_rtt);