OLD | NEW |
| (Empty) |
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 void SetUp() override { slow_start_.reset(new HybridSlowStart(&clock_)); } | |
21 const QuicTime::Delta one_ms_; | |
22 const QuicTime::Delta rtt_; | |
23 MockClock clock_; | |
24 scoped_ptr<HybridSlowStart> slow_start_; | |
25 }; | |
26 | |
27 TEST_F(HybridSlowStartTest, Simple) { | |
28 QuicPacketSequenceNumber sequence_number = 1; | |
29 QuicPacketSequenceNumber end_sequence_number = 3; | |
30 slow_start_->StartReceiveRound(end_sequence_number); | |
31 | |
32 EXPECT_FALSE(slow_start_->IsEndOfRound(sequence_number++)); | |
33 | |
34 // Test duplicates. | |
35 EXPECT_FALSE(slow_start_->IsEndOfRound(sequence_number)); | |
36 | |
37 EXPECT_FALSE(slow_start_->IsEndOfRound(sequence_number++)); | |
38 EXPECT_TRUE(slow_start_->IsEndOfRound(sequence_number++)); | |
39 | |
40 // Test without a new registered end_sequence_number; | |
41 EXPECT_TRUE(slow_start_->IsEndOfRound(sequence_number++)); | |
42 | |
43 end_sequence_number = 20; | |
44 slow_start_->StartReceiveRound(end_sequence_number); | |
45 while (sequence_number < end_sequence_number) { | |
46 EXPECT_FALSE(slow_start_->IsEndOfRound(sequence_number++)); | |
47 } | |
48 EXPECT_TRUE(slow_start_->IsEndOfRound(sequence_number++)); | |
49 } | |
50 | |
51 // TODO(ianswett): Add tests which more realistically invoke the methods, | |
52 // simulating how actual acks arrive and packets are sent. | |
53 TEST_F(HybridSlowStartTest, AckTrain) { | |
54 // At a typical RTT 60 ms, assuming that the inter arrival timestamp 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 // Run this test for both enabled and disabled ack train detection. | |
58 for (int i = 0; i < 2; ++i) { | |
59 const bool ack_train_detection = (i == 1); | |
60 slow_start_->set_ack_train_detection(ack_train_detection); | |
61 | |
62 const int kMaxLoopCount = 5; | |
63 QuicPacketSequenceNumber sequence_number = 2; | |
64 QuicPacketSequenceNumber end_sequence_number = 2; | |
65 for (int burst = 0; burst < kMaxLoopCount; ++burst) { | |
66 slow_start_->StartReceiveRound(end_sequence_number); | |
67 do { | |
68 clock_.AdvanceTime(one_ms_); | |
69 EXPECT_FALSE(slow_start_->ShouldExitSlowStart(rtt_, rtt_, 100)); | |
70 } while (!slow_start_->IsEndOfRound(sequence_number++)); | |
71 end_sequence_number *= 2; // Exponential growth. | |
72 } | |
73 slow_start_->StartReceiveRound(end_sequence_number); | |
74 | |
75 for (int n = 0; | |
76 n < 29 && !slow_start_->IsEndOfRound(sequence_number++); ++n) { | |
77 clock_.AdvanceTime(one_ms_); | |
78 EXPECT_FALSE(slow_start_->ShouldExitSlowStart(rtt_, rtt_, 100)); | |
79 } | |
80 clock_.AdvanceTime(one_ms_); | |
81 EXPECT_EQ(ack_train_detection, | |
82 slow_start_->ShouldExitSlowStart(rtt_, rtt_, 100)); | |
83 } | |
84 } | |
85 | |
86 TEST_F(HybridSlowStartTest, Delay) { | |
87 // We expect to detect the increase at +1/8 of the RTT; hence at a typical | |
88 // RTT of 60ms the detection will happen at 67.5 ms. | |
89 const int kHybridStartMinSamples = 8; // Number of acks required to trigger. | |
90 | |
91 QuicPacketSequenceNumber end_sequence_number = 1; | |
92 slow_start_->StartReceiveRound(end_sequence_number++); | |
93 | |
94 // Will not trigger since our lowest RTT in our burst is the same as the long | |
95 // term RTT provided. | |
96 for (int n = 0; n < kHybridStartMinSamples; ++n) { | |
97 EXPECT_FALSE(slow_start_->ShouldExitSlowStart( | |
98 rtt_.Add(QuicTime::Delta::FromMilliseconds(n)), rtt_, 100)); | |
99 } | |
100 slow_start_->StartReceiveRound(end_sequence_number++); | |
101 for (int n = 1; n < kHybridStartMinSamples; ++n) { | |
102 EXPECT_FALSE(slow_start_->ShouldExitSlowStart( | |
103 rtt_.Add(QuicTime::Delta::FromMilliseconds(n + 10)), rtt_, 100)); | |
104 } | |
105 // Expect to trigger since all packets in this burst was above the long term | |
106 // RTT provided. | |
107 EXPECT_TRUE(slow_start_->ShouldExitSlowStart( | |
108 rtt_.Add(QuicTime::Delta::FromMilliseconds(10)), rtt_, 100)); | |
109 } | |
110 | |
111 } // namespace test | |
112 } // namespace net | |
OLD | NEW |