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/logging.h" 6 #include "net/quic/congestion_control/channel_estimator.h" 7 #include "net/quic/test_tools/mock_clock.h" 8 #include "testing/gtest/include/gtest/gtest.h" 9 10 namespace net { 11 namespace test { 12 13 class ChannelEstimatorTest : public ::testing::Test { 14 protected: 15 virtual void SetUp() { 16 srand(1234); 17 packet_size_ = 1200; 18 sequence_number_ = 1; 19 } 20 21 QuicPacketSequenceNumber sequence_number_; 22 QuicByteCount packet_size_; 23 MockClock send_clock_; 24 MockClock receive_clock_; 25 ChannelEstimator channel_estimator_; 26 }; 27 28 TEST_F(ChannelEstimatorTest, SimpleNonDetect) { 29 // In this test, the send times differ by the same delta as the receive times, 30 // so we haven't sent packets closely enough to detect "spreading," or 31 // effective bandwidth. 32 QuicTime::Delta delta = QuicTime::Delta::FromMilliseconds(10); 33 34 for (int i = 0; i < 1000; ++i) { 35 QuicTime send_time = send_clock_.ApproximateNow(); 36 QuicTime receive_time = receive_clock_.ApproximateNow(); 37 channel_estimator_.OnAcknowledgedPacket(sequence_number_++, 38 packet_size_, 39 send_time, 40 receive_time); 41 send_clock_.AdvanceTime(delta); 42 receive_clock_.AdvanceTime(delta); 43 } 44 QuicBandwidth estimate = QuicBandwidth::Zero(); 45 EXPECT_EQ(kChannelEstimateUnknown, 46 channel_estimator_.GetChannelEstimate(&estimate)); 47 EXPECT_TRUE(estimate.IsZero()); 48 } 49 50 TEST_F(ChannelEstimatorTest, SimplePacketPairDetect) { 51 // In this test, we start by sending packet pairs back-to-back and 52 // add a receive side spreading that indicate an effective bandwidth. 53 // We do 2 testes with different effective bandwidth to make sure that we 54 // detect the new effective bandwidth. 55 QuicTime::Delta received_delta = QuicTime::Delta::FromMilliseconds(5); 56 QuicTime::Delta send_delta = QuicTime::Delta::FromMilliseconds(10); 57 58 for (int i = 0; i < 100; ++i) { 59 receive_clock_.AdvanceTime(received_delta); 60 QuicTime receive_time = receive_clock_.ApproximateNow(); 61 QuicTime send_time = send_clock_.ApproximateNow(); 62 63 channel_estimator_.OnAcknowledgedPacket(sequence_number_++, 64 packet_size_, 65 send_time, 66 receive_time); 67 receive_clock_.AdvanceTime(received_delta); 68 receive_time = receive_clock_.ApproximateNow(); 69 channel_estimator_.OnAcknowledgedPacket(sequence_number_++, 70 packet_size_, 71 send_time, 72 receive_time); 73 send_clock_.AdvanceTime(send_delta); 74 } 75 QuicBandwidth estimate = QuicBandwidth::Zero(); 76 EXPECT_EQ(kChannelEstimateGood, 77 channel_estimator_.GetChannelEstimate(&estimate)); 78 EXPECT_EQ(QuicBandwidth::FromBytesAndTimeDelta(packet_size_, received_delta), 79 estimate); 80 received_delta = QuicTime::Delta::FromMilliseconds(1); 81 for (int i = 0; i < 100; ++i) { 82 receive_clock_.AdvanceTime(received_delta); 83 QuicTime receive_time = receive_clock_.ApproximateNow(); 84 QuicTime send_time = send_clock_.ApproximateNow(); 85 channel_estimator_.OnAcknowledgedPacket(sequence_number_++, 86 packet_size_, 87 send_time, 88 receive_time); 89 receive_clock_.AdvanceTime(received_delta); 90 receive_time = receive_clock_.ApproximateNow(); 91 channel_estimator_.OnAcknowledgedPacket(sequence_number_++, 92 packet_size_, 93 send_time, 94 receive_time); 95 send_clock_.AdvanceTime(send_delta); 96 } 97 EXPECT_EQ(kChannelEstimateGood, 98 channel_estimator_.GetChannelEstimate(&estimate)); 99 EXPECT_EQ(QuicBandwidth::FromBytesAndTimeDelta(packet_size_, received_delta), 100 estimate); 101 } 102 103 TEST_F(ChannelEstimatorTest, SimpleFlatSlope) { 104 // In this test, we send packet pairs back-to-back and add a slowly increasing 105 // receive side spreading. We expect the estimate to be good and that our 106 // mean receive side spreading is returned as the estimate. 107 QuicTime::Delta initial_received_delta = QuicTime::Delta::FromMilliseconds(5); 108 QuicTime::Delta received_delta = initial_received_delta; 109 QuicTime::Delta send_delta = QuicTime::Delta::FromMilliseconds(10); 110 111 for (int i = 0; i < 100; ++i) { 112 receive_clock_.AdvanceTime(received_delta); 113 QuicTime receive_time = receive_clock_.ApproximateNow(); 114 QuicTime send_time = send_clock_.ApproximateNow(); 115 channel_estimator_.OnAcknowledgedPacket(sequence_number_++, 116 packet_size_, 117 send_time, 118 receive_time); 119 receive_clock_.AdvanceTime(received_delta); 120 receive_time = receive_clock_.ApproximateNow(); 121 channel_estimator_.OnAcknowledgedPacket(sequence_number_++, 122 packet_size_, 123 send_time, 124 receive_time); 125 send_clock_.AdvanceTime(send_delta); 126 received_delta = received_delta.Add(QuicTime::Delta::FromMicroseconds(10)); 127 } 128 QuicBandwidth estimate = QuicBandwidth::Zero(); 129 EXPECT_EQ(kChannelEstimateGood, 130 channel_estimator_.GetChannelEstimate(&estimate)); 131 132 // Calculate our mean receive delta. 133 QuicTime::Delta increased_received_delta = 134 received_delta.Subtract(initial_received_delta); 135 QuicTime::Delta mean_received_delta = initial_received_delta.Add( 136 QuicTime::Delta::FromMicroseconds( 137 increased_received_delta.ToMicroseconds() / 2)); 138 139 EXPECT_EQ(QuicBandwidth::FromBytesAndTimeDelta(packet_size_, 140 mean_received_delta), estimate); 141 } 142 143 TEST_F(ChannelEstimatorTest, SimpleMediumSlope) { 144 // In this test, we send packet pairs back-to-back and add an increasing 145 // receive side spreading. We expect the estimate to be uncertaint and that 146 // our mean receive side spreading is returned as the estimate. 147 QuicTime::Delta initial_received_delta = QuicTime::Delta::FromMilliseconds(5); 148 QuicTime::Delta received_delta = initial_received_delta; 149 QuicTime::Delta send_delta = QuicTime::Delta::FromMilliseconds(10); 150 151 for (int i = 0; i < 100; ++i) { 152 receive_clock_.AdvanceTime(received_delta); 153 QuicTime receive_time = receive_clock_.ApproximateNow(); 154 QuicTime send_time = send_clock_.ApproximateNow(); 155 channel_estimator_.OnAcknowledgedPacket(sequence_number_++, 156 packet_size_, 157 send_time, 158 receive_time); 159 receive_clock_.AdvanceTime(received_delta); 160 receive_time = receive_clock_.ApproximateNow(); 161 channel_estimator_.OnAcknowledgedPacket(sequence_number_++, 162 packet_size_, 163 send_time, 164 receive_time); 165 send_clock_.AdvanceTime(send_delta); 166 received_delta = received_delta.Add(QuicTime::Delta::FromMicroseconds(50)); 167 } 168 QuicBandwidth estimate = QuicBandwidth::Zero(); 169 EXPECT_EQ(kChannelEstimateUncertain, 170 channel_estimator_.GetChannelEstimate(&estimate)); 171 172 // Calculate our mean receive delta. 173 QuicTime::Delta increased_received_delta = 174 received_delta.Subtract(initial_received_delta); 175 QuicTime::Delta mean_received_delta = initial_received_delta.Add( 176 QuicTime::Delta::FromMicroseconds( 177 increased_received_delta.ToMicroseconds() / 2)); 178 179 EXPECT_EQ(QuicBandwidth::FromBytesAndTimeDelta(packet_size_, 180 mean_received_delta), estimate); 181 } 182 183 TEST_F(ChannelEstimatorTest, SimpleSteepSlope) { 184 // In this test, we send packet pairs back-to-back and add a rapidly 185 // increasing receive side spreading. We expect the estimate to be uncertain 186 // and that our mean receive side spreading is returned as the estimate. 187 QuicTime::Delta initial_received_delta = QuicTime::Delta::FromMilliseconds(5); 188 QuicTime::Delta received_delta = initial_received_delta; 189 QuicTime::Delta send_delta = QuicTime::Delta::FromMilliseconds(10); 190 191 for (int i = 0; i < 100; ++i) { 192 receive_clock_.AdvanceTime(received_delta); 193 QuicTime receive_time = receive_clock_.ApproximateNow(); 194 QuicTime send_time = send_clock_.ApproximateNow(); 195 channel_estimator_.OnAcknowledgedPacket(sequence_number_++, 196 packet_size_, 197 send_time, 198 receive_time); 199 receive_clock_.AdvanceTime(received_delta); 200 receive_time = receive_clock_.ApproximateNow(); 201 channel_estimator_.OnAcknowledgedPacket(sequence_number_++, 202 packet_size_, 203 send_time, 204 receive_time); 205 send_clock_.AdvanceTime(send_delta); 206 received_delta = received_delta.Add(QuicTime::Delta::FromMicroseconds(100)); 207 } 208 QuicBandwidth estimate = QuicBandwidth::Zero(); 209 EXPECT_EQ(kChannelEstimateUncertain, 210 channel_estimator_.GetChannelEstimate(&estimate)); 211 212 // Calculate our mean receive delta. 213 QuicTime::Delta increased_received_delta = 214 received_delta.Subtract(initial_received_delta); 215 QuicTime::Delta mean_received_delta = initial_received_delta.Add( 216 QuicTime::Delta::FromMicroseconds( 217 increased_received_delta.ToMicroseconds() / 2)); 218 219 EXPECT_EQ(QuicBandwidth::FromBytesAndTimeDelta(packet_size_, 220 mean_received_delta), estimate); 221 } 222 223 } // namespace test 224 } // namespace net 225