Home | History | Annotate | Download | only in congestion_control
      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.
      4 
      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"
     10 
     11 namespace net {
     12 namespace test {
     13 
     14 class InterArrivalBitrateRampUpTest : public ::testing::Test {
     15  protected:
     16   InterArrivalBitrateRampUpTest()
     17       : one_ms_(QuicTime::Delta::FromMilliseconds(1)),
     18         hundred_ms_(QuicTime::Delta::FromMilliseconds(100)),
     19         bitrate_ramp_up_(&clock_) {
     20   }
     21   virtual void SetUp() {
     22     clock_.AdvanceTime(one_ms_);
     23   }
     24   const QuicTime::Delta one_ms_;
     25   const QuicTime::Delta hundred_ms_;
     26   MockClock clock_;
     27   InterArrivalBitrateRampUp bitrate_ramp_up_;
     28 };
     29 
     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,
     40                          channel_estimate);
     41 
     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);
     48   }
     49   clock_.AdvanceTime(hundred_ms_);
     50   sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
     51   EXPECT_LE(available_channel_estimate, sent_bitrate);
     52 
     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);
     59   }
     60   clock_.AdvanceTime(hundred_ms_);
     61   sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
     62   EXPECT_LE(halfway_point, sent_bitrate);
     63 
     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);
     70   }
     71   clock_.AdvanceTime(hundred_ms_);
     72   sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
     73   EXPECT_LE(channel_estimate, sent_bitrate);
     74 
     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);
     80   }
     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);
     85 
     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);
     91   }
     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);
     96 }
     97 
     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,
    110                          channel_estimate);
    111 
    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);
    121   }
    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);
    127 
    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);
    136   }
    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);
    150   }
    151   clock_.AdvanceTime(hundred_ms_);
    152   sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
    153   EXPECT_LE(halfway_point, sent_bitrate);
    154 }
    155 
    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,
    166                          channel_estimate);
    167 
    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);
    174   }
    175   clock_.AdvanceTime(hundred_ms_);
    176   sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
    177   EXPECT_LE(available_channel_estimate, sent_bitrate);
    178 
    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);
    185   }
    186   clock_.AdvanceTime(hundred_ms_);
    187   sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
    188   EXPECT_LE(halfway_point, sent_bitrate);
    189 
    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);
    196   }
    197   clock_.AdvanceTime(hundred_ms_);
    198   sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
    199   EXPECT_LE(channel_estimate, sent_bitrate);
    200 
    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);
    206   }
    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);
    211 
    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);
    217   }
    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);
    222 }
    223 
    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,
    235                          channel_estimate);
    236 
    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);
    243   }
    244   clock_.AdvanceTime(hundred_ms_);
    245   sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
    246   EXPECT_LE(available_channel_estimate, sent_bitrate);
    247 
    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);
    254   }
    255   clock_.AdvanceTime(hundred_ms_);
    256   sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
    257   EXPECT_LE(halfway_point, sent_bitrate);
    258 
    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);
    265   }
    266   clock_.AdvanceTime(hundred_ms_);
    267   sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
    268   EXPECT_LE(channel_estimate, sent_bitrate);
    269 
    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);
    275   }
    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);
    280 
    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);
    286   }
    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);
    291 }
    292 
    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);
    302 
    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);
    309   }
    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);
    314 
    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);
    320   }
    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);
    325 }
    326 
    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,
    336                          channel_estimate);
    337 
    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);
    344   }
    345   clock_.AdvanceTime(hundred_ms_);
    346   sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
    347   EXPECT_LE(halfway_point, sent_bitrate);
    348 
    349   // Increse channel estimate.
    350   channel_estimate = QuicBandwidth::FromKBytesPerSecond(300);
    351   bitrate_ramp_up_.UpdateChannelEstimate(channel_estimate);
    352 
    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);
    359   }
    360   clock_.AdvanceTime(hundred_ms_);
    361   sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
    362   EXPECT_LE(channel_estimate, sent_bitrate);
    363 }
    364 
    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,
    374                          channel_estimate);
    375 
    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);
    382   }
    383   clock_.AdvanceTime(hundred_ms_);
    384   sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
    385   EXPECT_LE(halfway_point, sent_bitrate);
    386 
    387   // Decrese channel estimate.
    388   channel_estimate = QuicBandwidth::FromKBytesPerSecond(240);
    389   bitrate_ramp_up_.UpdateChannelEstimate(channel_estimate);
    390 
    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);
    397   }
    398   clock_.AdvanceTime(hundred_ms_);
    399   sent_bitrate = bitrate_ramp_up_.GetNewBitrate(sent_bitrate);
    400   EXPECT_LE(channel_estimate, sent_bitrate);
    401 }
    402 
    403 }  // namespace test
    404 }  // namespace net
    405