summaryrefslogtreecommitdiff
path: root/chromium/net/quic/core/congestion_control/hybrid_slow_start_test.cc
blob: 243105698490fbf8be5415b0ec681c72735da201 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "net/quic/core/congestion_control/hybrid_slow_start.h"

#include <memory>

#include "testing/gtest/include/gtest/gtest.h"

namespace net {
namespace test {

class HybridSlowStartTest : public ::testing::Test {
 protected:
  HybridSlowStartTest()
      : one_ms_(QuicTime::Delta::FromMilliseconds(1)),
        rtt_(QuicTime::Delta::FromMilliseconds(60)) {}
  void SetUp() override { slow_start_.reset(new HybridSlowStart()); }
  const QuicTime::Delta one_ms_;
  const QuicTime::Delta rtt_;
  std::unique_ptr<HybridSlowStart> slow_start_;
};

TEST_F(HybridSlowStartTest, Simple) {
  QuicPacketNumber packet_number = 1;
  QuicPacketNumber end_packet_number = 3;
  slow_start_->StartReceiveRound(end_packet_number);

  EXPECT_FALSE(slow_start_->IsEndOfRound(packet_number++));

  // Test duplicates.
  EXPECT_FALSE(slow_start_->IsEndOfRound(packet_number));

  EXPECT_FALSE(slow_start_->IsEndOfRound(packet_number++));
  EXPECT_TRUE(slow_start_->IsEndOfRound(packet_number++));

  // Test without a new registered end_packet_number;
  EXPECT_TRUE(slow_start_->IsEndOfRound(packet_number++));

  end_packet_number = 20;
  slow_start_->StartReceiveRound(end_packet_number);
  while (packet_number < end_packet_number) {
    EXPECT_FALSE(slow_start_->IsEndOfRound(packet_number++));
  }
  EXPECT_TRUE(slow_start_->IsEndOfRound(packet_number++));
}

TEST_F(HybridSlowStartTest, Delay) {
  // We expect to detect the increase at +1/8 of the RTT; hence at a typical
  // RTT of 60ms the detection will happen at 67.5 ms.
  const int kHybridStartMinSamples = 8;  // Number of acks required to trigger.

  QuicPacketNumber end_packet_number = 1;
  slow_start_->StartReceiveRound(end_packet_number++);

  // Will not trigger since our lowest RTT in our burst is the same as the long
  // term RTT provided.
  for (int n = 0; n < kHybridStartMinSamples; ++n) {
    EXPECT_FALSE(slow_start_->ShouldExitSlowStart(
        rtt_ + QuicTime::Delta::FromMilliseconds(n), rtt_, 100));
  }
  slow_start_->StartReceiveRound(end_packet_number++);
  for (int n = 1; n < kHybridStartMinSamples; ++n) {
    EXPECT_FALSE(slow_start_->ShouldExitSlowStart(
        rtt_ + QuicTime::Delta::FromMilliseconds(n + 10), rtt_, 100));
  }
  // Expect to trigger since all packets in this burst was above the long term
  // RTT provided.
  EXPECT_TRUE(slow_start_->ShouldExitSlowStart(
      rtt_ + QuicTime::Delta::FromMilliseconds(10), rtt_, 100));
}

}  // namespace test
}  // namespace net