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 "net/quic/congestion_control/channel_estimator.h"
7 #include "net/quic/test_tools/mock_clock.h"
8 #include "testing/gtest/include/gtest/gtest.h"
13 class ChannelEstimatorTest : public ::testing::Test {
15 virtual void SetUp() {
21 QuicPacketSequenceNumber sequence_number_;
22 QuicByteCount packet_size_;
23 MockClock send_clock_;
24 MockClock receive_clock_;
25 ChannelEstimator channel_estimator_;
28 TEST_F(ChannelEstimatorTest, SimpleNonDetect) {
29 // In this test, the send times differ by the same delta as the receive times,
30 // so we haven't sent packets closely enough to detect "spreading," or
31 // effective bandwidth.
32 QuicTime::Delta delta = QuicTime::Delta::FromMilliseconds(10);
34 for (int i = 0; i < 1000; ++i) {
35 QuicTime send_time = send_clock_.ApproximateNow();
36 QuicTime receive_time = receive_clock_.ApproximateNow();
37 channel_estimator_.OnAcknowledgedPacket(sequence_number_++,
41 send_clock_.AdvanceTime(delta);
42 receive_clock_.AdvanceTime(delta);
44 QuicBandwidth estimate = QuicBandwidth::Zero();
45 EXPECT_EQ(kChannelEstimateUnknown,
46 channel_estimator_.GetChannelEstimate(&estimate));
47 EXPECT_TRUE(estimate.IsZero());
50 TEST_F(ChannelEstimatorTest, SimplePacketPairDetect) {
51 // In this test, we start by sending packet pairs back-to-back and
52 // add a receive side spreading that indicate an effective bandwidth.
53 // We do 2 testes with different effective bandwidth to make sure that we
54 // detect the new effective bandwidth.
55 QuicTime::Delta received_delta = QuicTime::Delta::FromMilliseconds(5);
56 QuicTime::Delta send_delta = QuicTime::Delta::FromMilliseconds(10);
58 for (int i = 0; i < 100; ++i) {
59 receive_clock_.AdvanceTime(received_delta);
60 QuicTime receive_time = receive_clock_.ApproximateNow();
61 QuicTime send_time = send_clock_.ApproximateNow();
63 channel_estimator_.OnAcknowledgedPacket(sequence_number_++,
67 receive_clock_.AdvanceTime(received_delta);
68 receive_time = receive_clock_.ApproximateNow();
69 channel_estimator_.OnAcknowledgedPacket(sequence_number_++,
73 send_clock_.AdvanceTime(send_delta);
75 QuicBandwidth estimate = QuicBandwidth::Zero();
76 EXPECT_EQ(kChannelEstimateGood,
77 channel_estimator_.GetChannelEstimate(&estimate));
78 EXPECT_EQ(QuicBandwidth::FromBytesAndTimeDelta(packet_size_, received_delta),
80 received_delta = QuicTime::Delta::FromMilliseconds(1);
81 for (int i = 0; i < 100; ++i) {
82 receive_clock_.AdvanceTime(received_delta);
83 QuicTime receive_time = receive_clock_.ApproximateNow();
84 QuicTime send_time = send_clock_.ApproximateNow();
85 channel_estimator_.OnAcknowledgedPacket(sequence_number_++,
89 receive_clock_.AdvanceTime(received_delta);
90 receive_time = receive_clock_.ApproximateNow();
91 channel_estimator_.OnAcknowledgedPacket(sequence_number_++,
95 send_clock_.AdvanceTime(send_delta);
97 EXPECT_EQ(kChannelEstimateGood,
98 channel_estimator_.GetChannelEstimate(&estimate));
99 EXPECT_EQ(QuicBandwidth::FromBytesAndTimeDelta(packet_size_, received_delta),
103 TEST_F(ChannelEstimatorTest, SimpleFlatSlope) {
104 // In this test, we send packet pairs back-to-back and add a slowly increasing
105 // receive side spreading. We expect the estimate to be good and that our
106 // mean receive side spreading is returned as the estimate.
107 QuicTime::Delta initial_received_delta = QuicTime::Delta::FromMilliseconds(5);
108 QuicTime::Delta received_delta = initial_received_delta;
109 QuicTime::Delta send_delta = QuicTime::Delta::FromMilliseconds(10);
111 for (int i = 0; i < 100; ++i) {
112 receive_clock_.AdvanceTime(received_delta);
113 QuicTime receive_time = receive_clock_.ApproximateNow();
114 QuicTime send_time = send_clock_.ApproximateNow();
115 channel_estimator_.OnAcknowledgedPacket(sequence_number_++,
119 receive_clock_.AdvanceTime(received_delta);
120 receive_time = receive_clock_.ApproximateNow();
121 channel_estimator_.OnAcknowledgedPacket(sequence_number_++,
125 send_clock_.AdvanceTime(send_delta);
126 received_delta = received_delta.Add(QuicTime::Delta::FromMicroseconds(10));
128 QuicBandwidth estimate = QuicBandwidth::Zero();
129 EXPECT_EQ(kChannelEstimateGood,
130 channel_estimator_.GetChannelEstimate(&estimate));
132 // Calculate our mean receive delta.
133 QuicTime::Delta increased_received_delta =
134 received_delta.Subtract(initial_received_delta);
135 QuicTime::Delta mean_received_delta = initial_received_delta.Add(
136 QuicTime::Delta::FromMicroseconds(
137 increased_received_delta.ToMicroseconds() / 2));
139 EXPECT_EQ(QuicBandwidth::FromBytesAndTimeDelta(packet_size_,
140 mean_received_delta), estimate);
143 TEST_F(ChannelEstimatorTest, SimpleMediumSlope) {
144 // In this test, we send packet pairs back-to-back and add an increasing
145 // receive side spreading. We expect the estimate to be uncertaint and that
146 // our mean receive side spreading is returned as the estimate.
147 QuicTime::Delta initial_received_delta = QuicTime::Delta::FromMilliseconds(5);
148 QuicTime::Delta received_delta = initial_received_delta;
149 QuicTime::Delta send_delta = QuicTime::Delta::FromMilliseconds(10);
151 for (int i = 0; i < 100; ++i) {
152 receive_clock_.AdvanceTime(received_delta);
153 QuicTime receive_time = receive_clock_.ApproximateNow();
154 QuicTime send_time = send_clock_.ApproximateNow();
155 channel_estimator_.OnAcknowledgedPacket(sequence_number_++,
159 receive_clock_.AdvanceTime(received_delta);
160 receive_time = receive_clock_.ApproximateNow();
161 channel_estimator_.OnAcknowledgedPacket(sequence_number_++,
165 send_clock_.AdvanceTime(send_delta);
166 received_delta = received_delta.Add(QuicTime::Delta::FromMicroseconds(50));
168 QuicBandwidth estimate = QuicBandwidth::Zero();
169 EXPECT_EQ(kChannelEstimateUncertain,
170 channel_estimator_.GetChannelEstimate(&estimate));
172 // Calculate our mean receive delta.
173 QuicTime::Delta increased_received_delta =
174 received_delta.Subtract(initial_received_delta);
175 QuicTime::Delta mean_received_delta = initial_received_delta.Add(
176 QuicTime::Delta::FromMicroseconds(
177 increased_received_delta.ToMicroseconds() / 2));
179 EXPECT_EQ(QuicBandwidth::FromBytesAndTimeDelta(packet_size_,
180 mean_received_delta), estimate);
183 TEST_F(ChannelEstimatorTest, SimpleSteepSlope) {
184 // In this test, we send packet pairs back-to-back and add a rapidly
185 // increasing receive side spreading. We expect the estimate to be uncertain
186 // and that our mean receive side spreading is returned as the estimate.
187 QuicTime::Delta initial_received_delta = QuicTime::Delta::FromMilliseconds(5);
188 QuicTime::Delta received_delta = initial_received_delta;
189 QuicTime::Delta send_delta = QuicTime::Delta::FromMilliseconds(10);
191 for (int i = 0; i < 100; ++i) {
192 receive_clock_.AdvanceTime(received_delta);
193 QuicTime receive_time = receive_clock_.ApproximateNow();
194 QuicTime send_time = send_clock_.ApproximateNow();
195 channel_estimator_.OnAcknowledgedPacket(sequence_number_++,
199 receive_clock_.AdvanceTime(received_delta);
200 receive_time = receive_clock_.ApproximateNow();
201 channel_estimator_.OnAcknowledgedPacket(sequence_number_++,
205 send_clock_.AdvanceTime(send_delta);
206 received_delta = received_delta.Add(QuicTime::Delta::FromMicroseconds(100));
208 QuicBandwidth estimate = QuicBandwidth::Zero();
209 EXPECT_EQ(kChannelEstimateUncertain,
210 channel_estimator_.GetChannelEstimate(&estimate));
212 // Calculate our mean receive delta.
213 QuicTime::Delta increased_received_delta =
214 received_delta.Subtract(initial_received_delta);
215 QuicTime::Delta mean_received_delta = initial_received_delta.Add(
216 QuicTime::Delta::FromMicroseconds(
217 increased_received_delta.ToMicroseconds() / 2));
219 EXPECT_EQ(QuicBandwidth::FromBytesAndTimeDelta(packet_size_,
220 mean_received_delta), estimate);