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/basictypes.h"
6 #include "base/logging.h"
7 #include "net/quic/congestion_control/inter_arrival_bitrate_ramp_up.h"
8 #include "net/quic/test_tools/mock_clock.h"
9 #include "testing/gtest/include/gtest/gtest.h"
14 class InterArrivalBitrateRampUpTest : public ::testing::Test {
16 InterArrivalBitrateRampUpTest()
17 : one_ms_(QuicTime::Delta::FromMilliseconds(1)),
18 hundred_ms_(QuicTime::Delta::FromMilliseconds(100)),
19 bitrate_ramp_up_(&clock_) {
21 virtual void SetUp() {
22 clock_.AdvanceTime(one_ms_);
24 const QuicTime::Delta one_ms_;
25 const QuicTime::Delta hundred_ms_;
27 InterArrivalBitrateRampUp bitrate_ramp_up_;
30 TEST_F(InterArrivalBitrateRampUpTest, GoodEstimates) {
31 QuicBandwidth start_rate = QuicBandwidth::FromKBytesPerSecond(100);
32 QuicBandwidth available_channel_estimate =
33 QuicBandwidth::FromKBytesPerSecond(200);
34 QuicBandwidth channel_estimate = QuicBandwidth::FromKBytesPerSecond(400);
35 QuicBandwidth halfway_point = available_channel_estimate.Add(
36 channel_estimate.Subtract(available_channel_estimate).Scale(0.5f));
37 QuicBandwidth sent_bitrate = QuicBandwidth::Zero();
38 bitrate_ramp_up_.Reset(start_rate,
39 available_channel_estimate,
42 // First concave growth, towards available_channel_estimate.
43 for (int i = 0; i < 25; ++i) {
44 clock_.AdvanceTime(hundred_ms_);
45 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
46 EXPECT_GE(available_channel_estimate, sent_bitrate);
47 EXPECT_LE(start_rate, sent_bitrate);
49 clock_.AdvanceTime(hundred_ms_);
50 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
51 EXPECT_LE(available_channel_estimate, sent_bitrate);
53 // First convex growth, from available_channel_estimate.
54 for (int j = 0; j < 25; ++j) {
55 clock_.AdvanceTime(hundred_ms_);
56 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
57 EXPECT_LE(available_channel_estimate, sent_bitrate);
58 EXPECT_GE(halfway_point, sent_bitrate);
60 clock_.AdvanceTime(hundred_ms_);
61 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
62 EXPECT_LE(halfway_point, sent_bitrate);
64 // Second concave growth, towards channel_estimate.
65 for (int i = 0; i < 24; ++i) {
66 clock_.AdvanceTime(hundred_ms_);
67 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
68 EXPECT_GE(channel_estimate, sent_bitrate);
69 EXPECT_LE(halfway_point, sent_bitrate);
71 clock_.AdvanceTime(hundred_ms_);
72 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
73 EXPECT_LE(channel_estimate, sent_bitrate);
75 // Second convex growth, from channel_estimate.
76 for (int j = 0; j < 25; ++j) {
77 clock_.AdvanceTime(hundred_ms_);
78 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
79 EXPECT_LE(channel_estimate, sent_bitrate);
81 clock_.AdvanceTime(hundred_ms_);
82 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
83 EXPECT_NEAR(channel_estimate.ToBytesPerSecond() + 100000,
84 sent_bitrate.ToBytesPerSecond(), 10000);
86 // Verify that we increase cubic.
87 for (int j = 0; j < 23; ++j) {
88 clock_.AdvanceTime(hundred_ms_);
89 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
90 EXPECT_LE(channel_estimate, sent_bitrate);
92 clock_.AdvanceTime(hundred_ms_);
93 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
94 EXPECT_NEAR(channel_estimate.ToBytesPerSecond() + 750000,
95 sent_bitrate.ToBytesPerSecond(), 10000);
98 TEST_F(InterArrivalBitrateRampUpTest, GoodEstimatesLimitedSendRate) {
99 QuicBandwidth start_rate = QuicBandwidth::FromKBytesPerSecond(100);
100 QuicBandwidth available_channel_estimate =
101 QuicBandwidth::FromKBytesPerSecond(200);
102 QuicBandwidth max_sent_rate =
103 QuicBandwidth::FromKBytesPerSecond(125);
104 QuicBandwidth channel_estimate = QuicBandwidth::FromKBytesPerSecond(400);
105 QuicBandwidth halfway_point = available_channel_estimate.Add(
106 channel_estimate.Subtract(available_channel_estimate).Scale(0.5f));
107 QuicBandwidth sent_bitrate = QuicBandwidth::Zero();
108 bitrate_ramp_up_.Reset(start_rate,
109 available_channel_estimate,
112 // First concave growth, towards available_channel_estimate.
113 // Should pass without being affected by the max_sent_rate.
114 for (int i = 0; i < 25; ++i) {
115 clock_.AdvanceTime(hundred_ms_);
116 // Cap our previus sent rate.
117 sent_bitrate = std::min(sent_bitrate, max_sent_rate);
118 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
119 EXPECT_GE(available_channel_estimate, sent_bitrate);
120 EXPECT_LE(start_rate, sent_bitrate);
122 clock_.AdvanceTime(hundred_ms_);
123 // Cap our previus sent rate.
124 sent_bitrate = std::min(sent_bitrate, max_sent_rate);
125 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
126 EXPECT_LE(available_channel_estimate, sent_bitrate);
128 // First convex growth, from available_channel_estimate.
129 for (int j = 0; j < 25; ++j) {
130 clock_.AdvanceTime(hundred_ms_);
131 // Cap our previus sent rate.
132 sent_bitrate = std::min(sent_bitrate, max_sent_rate);
133 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
134 EXPECT_LE(available_channel_estimate, sent_bitrate);
135 EXPECT_GE(halfway_point, sent_bitrate);
137 clock_.AdvanceTime(hundred_ms_);
138 sent_bitrate = std::min(sent_bitrate, max_sent_rate);
139 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
140 // We expect 2 * sent_bitrate to cap the rate.
141 EXPECT_LE(max_sent_rate.Add(max_sent_rate), sent_bitrate);
142 // Remove our sent cap.
143 // Expect bitrate to continue to ramp from its previous rate.
144 for (int j = 0; j < 5; ++j) {
145 clock_.AdvanceTime(hundred_ms_);
146 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
147 EXPECT_LE(available_channel_estimate, sent_bitrate);
148 EXPECT_LE(max_sent_rate.Add(max_sent_rate), sent_bitrate);
149 EXPECT_GE(halfway_point, sent_bitrate);
151 clock_.AdvanceTime(hundred_ms_);
152 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
153 EXPECT_LE(halfway_point, sent_bitrate);
156 TEST_F(InterArrivalBitrateRampUpTest, GoodEstimatesCloseToChannelEstimate) {
157 QuicBandwidth start_rate = QuicBandwidth::FromKBytesPerSecond(100);
158 QuicBandwidth available_channel_estimate =
159 QuicBandwidth::FromKBytesPerSecond(200);
160 QuicBandwidth channel_estimate = QuicBandwidth::FromKBytesPerSecond(250);
161 QuicBandwidth halfway_point = available_channel_estimate.Add(
162 channel_estimate.Subtract(available_channel_estimate).Scale(0.5f));
163 QuicBandwidth sent_bitrate = QuicBandwidth::Zero();
164 bitrate_ramp_up_.Reset(start_rate,
165 available_channel_estimate,
168 // First concave growth, towards available_channel_estimate.
169 for (int i = 0; i < 25; ++i) {
170 clock_.AdvanceTime(hundred_ms_);
171 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
172 EXPECT_GE(available_channel_estimate, sent_bitrate);
173 EXPECT_LE(start_rate, sent_bitrate);
175 clock_.AdvanceTime(hundred_ms_);
176 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
177 EXPECT_LE(available_channel_estimate, sent_bitrate);
179 // First convex growth, from available_channel_estimate.
180 for (int j = 0; j < 15; ++j) {
181 clock_.AdvanceTime(hundred_ms_);
182 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
183 EXPECT_LE(available_channel_estimate, sent_bitrate);
184 EXPECT_GE(halfway_point, sent_bitrate);
186 clock_.AdvanceTime(hundred_ms_);
187 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
188 EXPECT_LE(halfway_point, sent_bitrate);
190 // Second concave growth, towards channel_estimate.
191 for (int i = 0; i < 14; ++i) {
192 clock_.AdvanceTime(hundred_ms_);
193 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
194 EXPECT_GE(channel_estimate, sent_bitrate);
195 EXPECT_LE(halfway_point, sent_bitrate);
197 clock_.AdvanceTime(hundred_ms_);
198 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
199 EXPECT_LE(channel_estimate, sent_bitrate);
201 // Second convex growth, from channel_estimate.
202 for (int j = 0; j < 25; ++j) {
203 clock_.AdvanceTime(hundred_ms_);
204 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
205 EXPECT_LE(channel_estimate, sent_bitrate);
207 clock_.AdvanceTime(hundred_ms_);
208 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
209 EXPECT_NEAR(channel_estimate.ToBytesPerSecond() + 100000,
210 sent_bitrate.ToBytesPerSecond(), 10000);
212 // Verify that we increase cubic.
213 for (int j = 0; j < 24; ++j) {
214 clock_.AdvanceTime(hundred_ms_);
215 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
216 EXPECT_LE(channel_estimate, sent_bitrate);
218 clock_.AdvanceTime(hundred_ms_);
219 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
220 EXPECT_NEAR(channel_estimate.ToBytesPerSecond() + 780000,
221 sent_bitrate.ToBytesPerSecond(), 20000);
224 TEST_F(InterArrivalBitrateRampUpTest, UncertainEstimates) {
225 QuicBandwidth start_rate = QuicBandwidth::FromKBytesPerSecond(100);
226 QuicBandwidth available_channel_estimate =
227 QuicBandwidth::FromKBytesPerSecond(200);
228 QuicBandwidth channel_estimate =
229 QuicBandwidth::FromKBytesPerSecond(400 * 0.7f);
230 QuicBandwidth halfway_point = available_channel_estimate.Add(
231 channel_estimate.Subtract(available_channel_estimate).Scale(0.5f));
232 QuicBandwidth sent_bitrate = QuicBandwidth::Zero();
233 bitrate_ramp_up_.Reset(start_rate,
234 available_channel_estimate,
237 // First concave growth, towards available_channel_estimate.
238 for (int i = 0; i < 20; ++i) {
239 clock_.AdvanceTime(hundred_ms_);
240 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
241 EXPECT_GE(available_channel_estimate, sent_bitrate);
242 EXPECT_LE(start_rate, sent_bitrate);
244 clock_.AdvanceTime(hundred_ms_);
245 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
246 EXPECT_LE(available_channel_estimate, sent_bitrate);
248 // First convex growth, from available_channel_estimate.
249 for (int j = 0; j < 23; ++j) {
250 clock_.AdvanceTime(hundred_ms_);
251 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
252 EXPECT_LE(available_channel_estimate, sent_bitrate);
253 EXPECT_GE(halfway_point, sent_bitrate);
255 clock_.AdvanceTime(hundred_ms_);
256 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
257 EXPECT_LE(halfway_point, sent_bitrate);
259 // Second concave growth, towards channel_estimate.
260 for (int i = 0; i < 12; ++i) {
261 clock_.AdvanceTime(hundred_ms_);
262 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
263 EXPECT_GE(channel_estimate, sent_bitrate);
264 EXPECT_LE(halfway_point, sent_bitrate);
266 clock_.AdvanceTime(hundred_ms_);
267 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
268 EXPECT_LE(channel_estimate, sent_bitrate);
270 // Second convex growth, from channel_estimate.
271 for (int j = 0; j < 30; ++j) {
272 clock_.AdvanceTime(hundred_ms_);
273 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
274 EXPECT_LE(channel_estimate, sent_bitrate);
276 clock_.AdvanceTime(hundred_ms_);
277 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
278 EXPECT_NEAR(channel_estimate.ToBytesPerSecond() + 100000,
279 sent_bitrate.ToBytesPerSecond(), 10000);
281 // Verify that we increase cubic.
282 for (int j = 0; j < 23; ++j) {
283 clock_.AdvanceTime(hundred_ms_);
284 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
285 EXPECT_LE(channel_estimate, sent_bitrate);
287 clock_.AdvanceTime(hundred_ms_);
288 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
289 EXPECT_NEAR(channel_estimate.ToBytesPerSecond() + 750000,
290 sent_bitrate.ToBytesPerSecond(), 20000);
293 TEST_F(InterArrivalBitrateRampUpTest, UnknownEstimates) {
294 QuicBandwidth start_rate = QuicBandwidth::FromKBytesPerSecond(100);
295 QuicBandwidth available_channel_estimate =
296 QuicBandwidth::FromKBytesPerSecond(200);
297 QuicBandwidth channel_estimate = QuicBandwidth::FromKBytesPerSecond(400);
298 QuicBandwidth sent_bitrate = QuicBandwidth::Zero();
299 bitrate_ramp_up_.Reset(start_rate,
300 available_channel_estimate,
301 available_channel_estimate);
303 // First convex growth, from start_rate.
304 for (int j = 0; j < 20; ++j) {
305 clock_.AdvanceTime(hundred_ms_);
306 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
307 EXPECT_LE(start_rate, sent_bitrate);
308 EXPECT_GE(available_channel_estimate, sent_bitrate);
310 clock_.AdvanceTime(hundred_ms_);
311 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
312 EXPECT_NEAR(available_channel_estimate.ToBytesPerSecond(),
313 sent_bitrate.ToBytesPerSecond(), 10000);
315 // Verify that we increase cubic.
316 for (int j = 0; j < 31; ++j) {
317 clock_.AdvanceTime(hundred_ms_);
318 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
319 EXPECT_GE(channel_estimate, sent_bitrate);
321 clock_.AdvanceTime(hundred_ms_);
322 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
323 EXPECT_NEAR(channel_estimate.ToBytesPerSecond(),
324 sent_bitrate.ToBytesPerSecond(), 10000);
327 TEST_F(InterArrivalBitrateRampUpTest, UpdatingChannelEstimateHigher) {
328 QuicBandwidth start_rate = QuicBandwidth::FromKBytesPerSecond(200);
329 QuicBandwidth available_channel_estimate = start_rate;
330 QuicBandwidth channel_estimate = QuicBandwidth::FromKBytesPerSecond(250);
331 QuicBandwidth halfway_point = available_channel_estimate.Add(
332 channel_estimate.Subtract(available_channel_estimate).Scale(0.5f));
333 QuicBandwidth sent_bitrate = QuicBandwidth::Zero();
334 bitrate_ramp_up_.Reset(start_rate,
335 available_channel_estimate,
338 // Convex growth, from available_channel_estimate.
339 for (int j = 0; j < 16; ++j) {
340 clock_.AdvanceTime(hundred_ms_);
341 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
342 EXPECT_LE(available_channel_estimate, sent_bitrate);
343 EXPECT_GE(halfway_point, sent_bitrate);
345 clock_.AdvanceTime(hundred_ms_);
346 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
347 EXPECT_LE(halfway_point, sent_bitrate);
349 // Increse channel estimate.
350 channel_estimate = QuicBandwidth::FromKBytesPerSecond(300);
351 bitrate_ramp_up_.UpdateChannelEstimate(channel_estimate);
353 // Concave growth, towards channel_estimate.
354 for (int i = 0; i < 22; ++i) {
355 clock_.AdvanceTime(hundred_ms_);
356 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
357 EXPECT_GE(channel_estimate, sent_bitrate);
358 EXPECT_LE(halfway_point, sent_bitrate);
360 clock_.AdvanceTime(hundred_ms_);
361 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
362 EXPECT_LE(channel_estimate, sent_bitrate);
365 TEST_F(InterArrivalBitrateRampUpTest, UpdatingChannelEstimateLower) {
366 QuicBandwidth start_rate = QuicBandwidth::FromKBytesPerSecond(200);
367 QuicBandwidth available_channel_estimate = start_rate;
368 QuicBandwidth channel_estimate = QuicBandwidth::FromKBytesPerSecond(250);
369 QuicBandwidth halfway_point = available_channel_estimate.Add(
370 channel_estimate.Subtract(available_channel_estimate).Scale(0.5f));
371 QuicBandwidth sent_bitrate = QuicBandwidth::Zero();
372 bitrate_ramp_up_.Reset(start_rate,
373 available_channel_estimate,
376 // Convex growth, from available_channel_estimate.
377 for (int j = 0; j < 16; ++j) {
378 clock_.AdvanceTime(hundred_ms_);
379 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
380 EXPECT_LE(available_channel_estimate, sent_bitrate);
381 EXPECT_GE(halfway_point, sent_bitrate);
383 clock_.AdvanceTime(hundred_ms_);
384 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
385 EXPECT_LE(halfway_point, sent_bitrate);
387 // Decrese channel estimate.
388 channel_estimate = QuicBandwidth::FromKBytesPerSecond(240);
389 bitrate_ramp_up_.UpdateChannelEstimate(channel_estimate);
391 // Concave growth, towards channel_estimate.
392 for (int i = 0; i < 11; ++i) {
393 clock_.AdvanceTime(hundred_ms_);
394 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
395 EXPECT_GE(channel_estimate, sent_bitrate);
396 EXPECT_LE(halfway_point, sent_bitrate);
398 clock_.AdvanceTime(hundred_ms_);
399 sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
400 EXPECT_LE(channel_estimate, sent_bitrate);