Home | History | Annotate | Download | only in congestion_control
      1 // Copyright (c) 2012 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/logging.h"
      6 #include "base/memory/scoped_ptr.h"
      7 #include "net/quic/congestion_control/hybrid_slow_start.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 HybridSlowStartTest : public ::testing::Test {
     15  protected:
     16   HybridSlowStartTest()
     17      : one_ms_(QuicTime::Delta::FromMilliseconds(1)),
     18        rtt_(QuicTime::Delta::FromMilliseconds(60)) {
     19   }
     20   virtual void SetUp() {
     21     slowStart_.reset(new HybridSlowStart(&clock_));
     22   }
     23   const QuicTime::Delta one_ms_;
     24   const QuicTime::Delta rtt_;
     25   MockClock clock_;
     26   scoped_ptr<HybridSlowStart> slowStart_;
     27 };
     28 
     29 TEST_F(HybridSlowStartTest, Simple) {
     30   QuicPacketSequenceNumber sequence_number = 1;
     31   QuicPacketSequenceNumber end_sequence_number = 3;
     32   slowStart_->Reset(end_sequence_number);
     33 
     34   EXPECT_FALSE(slowStart_->EndOfRound(sequence_number++));
     35 
     36   // Test duplicates.
     37   EXPECT_FALSE(slowStart_->EndOfRound(sequence_number));
     38 
     39   EXPECT_FALSE(slowStart_->EndOfRound(sequence_number++));
     40   EXPECT_TRUE(slowStart_->EndOfRound(sequence_number++));
     41 
     42   // Test without a new registered end_sequence_number;
     43   EXPECT_TRUE(slowStart_->EndOfRound(sequence_number++));
     44 
     45   end_sequence_number = 20;
     46   slowStart_->Reset(end_sequence_number);
     47   while (sequence_number < end_sequence_number) {
     48     EXPECT_FALSE(slowStart_->EndOfRound(sequence_number++));
     49   }
     50   EXPECT_TRUE(slowStart_->EndOfRound(sequence_number++));
     51 }
     52 
     53 TEST_F(HybridSlowStartTest, AckTrain) {
     54   // At a typical RTT 60 ms, assuming that the inter arrival is 1 ms,
     55   // we expect to be able to send a burst of 30 packet before we trigger the
     56   // ack train detection.
     57   const int kMaxLoopCount = 5;
     58   QuicPacketSequenceNumber sequence_number = 2;
     59   QuicPacketSequenceNumber end_sequence_number = 2;
     60   for (int burst = 0; burst < kMaxLoopCount; ++burst) {
     61     slowStart_->Reset(end_sequence_number);
     62     do {
     63       clock_.AdvanceTime(one_ms_);
     64       slowStart_->Update(rtt_, rtt_);
     65       EXPECT_FALSE(slowStart_->Exit());
     66     }  while (!slowStart_->EndOfRound(sequence_number++));
     67     end_sequence_number *= 2;  // Exponential growth.
     68   }
     69   slowStart_->Reset(end_sequence_number);
     70 
     71   for (int n = 0; n < 29 && !slowStart_->EndOfRound(sequence_number++); ++n) {
     72     clock_.AdvanceTime(one_ms_);
     73     slowStart_->Update(rtt_, rtt_);
     74     EXPECT_FALSE(slowStart_->Exit());
     75   }
     76   clock_.AdvanceTime(one_ms_);
     77   slowStart_->Update(rtt_, rtt_);
     78   EXPECT_TRUE(slowStart_->Exit());
     79 }
     80 
     81 TEST_F(HybridSlowStartTest, Delay) {
     82   // We expect to detect the increase at +1/16 of the RTT; hence at a typical
     83   // RTT of 60ms the detection will happen at 63.75 ms.
     84   const int kHybridStartMinSamples = 8;  // Number of acks required to trigger.
     85 
     86   QuicPacketSequenceNumber end_sequence_number = 1;
     87   slowStart_->Reset(end_sequence_number++);
     88 
     89   // Will not trigger since our lowest RTT in our burst is the same as the long
     90   // term RTT provided.
     91   for (int n = 0; n < kHybridStartMinSamples; ++n) {
     92     slowStart_->Update(rtt_.Add(QuicTime::Delta::FromMilliseconds(n)), rtt_);
     93     EXPECT_FALSE(slowStart_->Exit());
     94   }
     95   slowStart_->Reset(end_sequence_number++);
     96   for (int n = 1; n < kHybridStartMinSamples; ++n) {
     97     slowStart_->Update(rtt_.Add(QuicTime::Delta::FromMilliseconds(n + 4)),
     98                        rtt_);
     99     EXPECT_FALSE(slowStart_->Exit());
    100   }
    101   // Expect to trigger since all packets in this burst was above the long term
    102   // RTT provided.
    103   slowStart_->Update(rtt_.Add(QuicTime::Delta::FromMilliseconds(4)), rtt_);
    104   EXPECT_TRUE(slowStart_->Exit());
    105 }
    106 
    107 }  // namespace test
    108 }  // namespace net
    109