| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/logging.h" | 5 #include "base/logging.h" |
| 6 #include "base/memory/scoped_ptr.h" | 6 #include "base/memory/scoped_ptr.h" |
| 7 #include "net/quic/congestion_control/inter_arrival_sender.h" | 7 #include "net/quic/congestion_control/inter_arrival_sender.h" |
| 8 #include "net/quic/congestion_control/quic_congestion_manager.h" | 8 #include "net/quic/congestion_control/quic_congestion_manager.h" |
| 9 #include "net/quic/quic_protocol.h" | 9 #include "net/quic/quic_protocol.h" |
| 10 #include "net/quic/test_tools/mock_clock.h" | 10 #include "net/quic/test_tools/mock_clock.h" |
| 11 #include "net/quic/test_tools/quic_test_utils.h" | 11 #include "net/quic/test_tools/quic_test_utils.h" |
| 12 #include "testing/gmock/include/gmock/gmock.h" | 12 #include "testing/gmock/include/gmock/gmock.h" |
| 13 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
| 14 | 14 |
| 15 using testing::_; | 15 using testing::_; |
| 16 using testing::StrictMock; | 16 using testing::StrictMock; |
| 17 using testing::Return; |
| 17 | 18 |
| 18 namespace net { | 19 namespace net { |
| 19 namespace test { | 20 namespace test { |
| 20 | 21 |
| 21 class QuicCongestionManagerPeer : public QuicCongestionManager { | 22 class QuicCongestionManagerPeer : public QuicCongestionManager { |
| 22 public: | 23 public: |
| 23 explicit QuicCongestionManagerPeer(const QuicClock* clock, | 24 explicit QuicCongestionManagerPeer(const QuicClock* clock, |
| 24 CongestionFeedbackType congestion_type) | 25 CongestionFeedbackType congestion_type) |
| 25 : QuicCongestionManager(clock, congestion_type) { | 26 : QuicCongestionManager(clock, congestion_type) { |
| 26 } | 27 } |
| (...skipping 30 matching lines...) Expand all Loading... |
| 57 feedback.type = kFixRate; | 58 feedback.type = kFixRate; |
| 58 feedback.fix_rate.bitrate = QuicBandwidth::FromKBytesPerSecond(100); | 59 feedback.fix_rate.bitrate = QuicBandwidth::FromKBytesPerSecond(100); |
| 59 manager_->OnIncomingQuicCongestionFeedbackFrame(feedback, clock_.Now()); | 60 manager_->OnIncomingQuicCongestionFeedbackFrame(feedback, clock_.Now()); |
| 60 | 61 |
| 61 for (int i = 1; i <= 100; ++i) { | 62 for (int i = 1; i <= 100; ++i) { |
| 62 QuicTime::Delta advance_time = manager_->TimeUntilSend( | 63 QuicTime::Delta advance_time = manager_->TimeUntilSend( |
| 63 clock_.Now(), NOT_RETRANSMISSION, kIgnored, NOT_HANDSHAKE); | 64 clock_.Now(), NOT_RETRANSMISSION, kIgnored, NOT_HANDSHAKE); |
| 64 clock_.AdvanceTime(advance_time); | 65 clock_.AdvanceTime(advance_time); |
| 65 EXPECT_TRUE(manager_->TimeUntilSend( | 66 EXPECT_TRUE(manager_->TimeUntilSend( |
| 66 clock_.Now(), NOT_RETRANSMISSION, kIgnored, NOT_HANDSHAKE).IsZero()); | 67 clock_.Now(), NOT_RETRANSMISSION, kIgnored, NOT_HANDSHAKE).IsZero()); |
| 67 manager_->SentPacket(i, clock_.Now(), 1000, NOT_RETRANSMISSION); | 68 manager_->SentPacket(i, clock_.Now(), 1000, NOT_RETRANSMISSION, |
| 69 HAS_RETRANSMITTABLE_DATA); |
| 68 // Ack the packet we sent. | 70 // Ack the packet we sent. |
| 69 ack.received_info.largest_observed = i; | 71 ack.received_info.largest_observed = i; |
| 70 manager_->OnIncomingAckFrame(ack, clock_.Now()); | 72 manager_->OnIncomingAckFrame(ack, clock_.Now()); |
| 71 } | 73 } |
| 72 EXPECT_EQ(100, manager_->BandwidthEstimate().ToKBytesPerSecond()); | 74 EXPECT_EQ(100, manager_->BandwidthEstimate().ToKBytesPerSecond()); |
| 73 EXPECT_NEAR(100, | 75 EXPECT_NEAR(100, |
| 74 InterArrivalSender::CalculateSentBandwidth( | 76 InterArrivalSender::CalculateSentBandwidth( |
| 75 manager_->packet_history_map(), | 77 manager_->packet_history_map(), |
| 76 clock_.Now()).ToKBytesPerSecond(), | 78 clock_.Now()).ToKBytesPerSecond(), |
| 77 4); | 79 4); |
| 78 } | 80 } |
| 79 | 81 |
| 80 TEST_F(QuicCongestionManagerTest, BandwidthWith1SecondGap) { | 82 TEST_F(QuicCongestionManagerTest, BandwidthWith1SecondGap) { |
| 81 SetUpCongestionType(kFixRate); | 83 SetUpCongestionType(kFixRate); |
| 82 QuicAckFrame ack; | 84 QuicAckFrame ack; |
| 83 manager_->OnIncomingAckFrame(ack, clock_.Now()); | 85 manager_->OnIncomingAckFrame(ack, clock_.Now()); |
| 84 | 86 |
| 85 QuicCongestionFeedbackFrame feedback; | 87 QuicCongestionFeedbackFrame feedback; |
| 86 feedback.type = kFixRate; | 88 feedback.type = kFixRate; |
| 87 feedback.fix_rate.bitrate = QuicBandwidth::FromKBytesPerSecond(100); | 89 feedback.fix_rate.bitrate = QuicBandwidth::FromKBytesPerSecond(100); |
| 88 manager_->OnIncomingQuicCongestionFeedbackFrame(feedback, clock_.Now()); | 90 manager_->OnIncomingQuicCongestionFeedbackFrame(feedback, clock_.Now()); |
| 89 | 91 |
| 90 for (QuicPacketSequenceNumber sequence_number = 1; sequence_number <= 100; | 92 for (QuicPacketSequenceNumber sequence_number = 1; sequence_number <= 100; |
| 91 ++sequence_number) { | 93 ++sequence_number) { |
| 92 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10)); | 94 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10)); |
| 93 EXPECT_TRUE(manager_->TimeUntilSend( | 95 EXPECT_TRUE(manager_->TimeUntilSend( |
| 94 clock_.Now(), NOT_RETRANSMISSION, kIgnored, NOT_HANDSHAKE).IsZero()); | 96 clock_.Now(), NOT_RETRANSMISSION, kIgnored, NOT_HANDSHAKE).IsZero()); |
| 95 manager_->SentPacket( | 97 manager_->SentPacket(sequence_number, clock_.Now(), 1000, |
| 96 sequence_number, clock_.Now(), 1000, NOT_RETRANSMISSION); | 98 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA); |
| 97 // Ack the packet we sent. | 99 // Ack the packet we sent. |
| 98 ack.received_info.largest_observed = sequence_number; | 100 ack.received_info.largest_observed = sequence_number; |
| 99 manager_->OnIncomingAckFrame(ack, clock_.Now()); | 101 manager_->OnIncomingAckFrame(ack, clock_.Now()); |
| 100 } | 102 } |
| 101 EXPECT_EQ(100000, manager_->BandwidthEstimate().ToBytesPerSecond()); | 103 EXPECT_EQ(100000, manager_->BandwidthEstimate().ToBytesPerSecond()); |
| 102 EXPECT_NEAR(100000, | 104 EXPECT_NEAR(100000, |
| 103 InterArrivalSender::CalculateSentBandwidth( | 105 InterArrivalSender::CalculateSentBandwidth( |
| 104 manager_->packet_history_map(), | 106 manager_->packet_history_map(), |
| 105 clock_.Now()).ToBytesPerSecond(), | 107 clock_.Now()).ToBytesPerSecond(), |
| 106 2000); | 108 2000); |
| 107 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(500)); | 109 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(500)); |
| 108 EXPECT_NEAR(50000, | 110 EXPECT_NEAR(50000, |
| 109 InterArrivalSender::CalculateSentBandwidth( | 111 InterArrivalSender::CalculateSentBandwidth( |
| 110 manager_->packet_history_map(), | 112 manager_->packet_history_map(), |
| 111 clock_.Now()).ToBytesPerSecond(), | 113 clock_.Now()).ToBytesPerSecond(), |
| 112 1000); | 114 1000); |
| 113 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(501)); | 115 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(501)); |
| 114 EXPECT_NEAR(100000, manager_->BandwidthEstimate().ToBytesPerSecond(), 2000); | 116 EXPECT_NEAR(100000, manager_->BandwidthEstimate().ToBytesPerSecond(), 2000); |
| 115 EXPECT_TRUE(InterArrivalSender::CalculateSentBandwidth( | 117 EXPECT_TRUE(InterArrivalSender::CalculateSentBandwidth( |
| 116 manager_->packet_history_map(), | 118 manager_->packet_history_map(), |
| 117 clock_.Now()).IsZero()); | 119 clock_.Now()).IsZero()); |
| 118 for (int i = 1; i <= 150; ++i) { | 120 for (int i = 1; i <= 150; ++i) { |
| 119 EXPECT_TRUE(manager_->TimeUntilSend( | 121 EXPECT_TRUE(manager_->TimeUntilSend( |
| 120 clock_.Now(), NOT_RETRANSMISSION, kIgnored, NOT_HANDSHAKE).IsZero()); | 122 clock_.Now(), NOT_RETRANSMISSION, kIgnored, NOT_HANDSHAKE).IsZero()); |
| 121 manager_->SentPacket(i + 100, clock_.Now(), 1000, NOT_RETRANSMISSION); | 123 manager_->SentPacket(i + 100, clock_.Now(), 1000, NOT_RETRANSMISSION, |
| 124 HAS_RETRANSMITTABLE_DATA); |
| 122 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10)); | 125 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10)); |
| 123 // Ack the packet we sent. | 126 // Ack the packet we sent. |
| 124 ack.received_info.largest_observed = i + 100; | 127 ack.received_info.largest_observed = i + 100; |
| 125 manager_->OnIncomingAckFrame(ack, clock_.Now()); | 128 manager_->OnIncomingAckFrame(ack, clock_.Now()); |
| 126 } | 129 } |
| 127 EXPECT_EQ(100, manager_->BandwidthEstimate().ToKBytesPerSecond()); | 130 EXPECT_EQ(100, manager_->BandwidthEstimate().ToKBytesPerSecond()); |
| 128 EXPECT_NEAR(100, | 131 EXPECT_NEAR(100, |
| 129 InterArrivalSender::CalculateSentBandwidth( | 132 InterArrivalSender::CalculateSentBandwidth( |
| 130 manager_->packet_history_map(), | 133 manager_->packet_history_map(), |
| 131 clock_.Now()).ToKBytesPerSecond(), | 134 clock_.Now()).ToKBytesPerSecond(), |
| 132 2); | 135 2); |
| 133 } | 136 } |
| 134 | 137 |
| 135 TEST_F(QuicCongestionManagerTest, Rtt) { | 138 TEST_F(QuicCongestionManagerTest, Rtt) { |
| 136 SetUpCongestionType(kFixRate); | 139 SetUpCongestionType(kFixRate); |
| 137 | 140 |
| 138 MockSendAlgorithm* send_algorithm = new StrictMock<MockSendAlgorithm>; | 141 MockSendAlgorithm* send_algorithm = new StrictMock<MockSendAlgorithm>; |
| 139 manager_->SetSendAlgorithm(send_algorithm); | 142 manager_->SetSendAlgorithm(send_algorithm); |
| 140 | 143 |
| 141 QuicPacketSequenceNumber sequence_number = 1; | 144 QuicPacketSequenceNumber sequence_number = 1; |
| 142 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(15); | 145 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(15); |
| 143 | 146 |
| 144 EXPECT_CALL(*send_algorithm, SentPacket(_, _, _, _)).Times(1); | 147 EXPECT_CALL(*send_algorithm, SentPacket(_, _, _, _, _)) |
| 148 .Times(1).WillOnce(Return(true)); |
| 145 EXPECT_CALL(*send_algorithm, | 149 EXPECT_CALL(*send_algorithm, |
| 146 OnIncomingAck(sequence_number, _, expected_rtt)).Times(1); | 150 OnIncomingAck(sequence_number, _, expected_rtt)).Times(1); |
| 147 | 151 |
| 148 manager_->SentPacket(sequence_number, clock_.Now(), 1000, NOT_RETRANSMISSION); | 152 manager_->SentPacket(sequence_number, clock_.Now(), 1000, NOT_RETRANSMISSION, |
| 153 HAS_RETRANSMITTABLE_DATA); |
| 149 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(20)); | 154 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(20)); |
| 150 | 155 |
| 151 QuicAckFrame ack; | 156 QuicAckFrame ack; |
| 152 ack.received_info.largest_observed = sequence_number; | 157 ack.received_info.largest_observed = sequence_number; |
| 153 ack.received_info.delta_time_largest_observed = | 158 ack.received_info.delta_time_largest_observed = |
| 154 QuicTime::Delta::FromMilliseconds(5); | 159 QuicTime::Delta::FromMilliseconds(5); |
| 155 manager_->OnIncomingAckFrame(ack, clock_.Now()); | 160 manager_->OnIncomingAckFrame(ack, clock_.Now()); |
| 156 EXPECT_EQ(manager_->rtt(), expected_rtt); | 161 EXPECT_EQ(manager_->rtt(), expected_rtt); |
| 157 } | 162 } |
| 158 | 163 |
| 159 TEST_F(QuicCongestionManagerTest, RttWithInvalidDelta) { | 164 TEST_F(QuicCongestionManagerTest, RttWithInvalidDelta) { |
| 160 // Expect that the RTT is infinite since the delta_time_largest_observed is | 165 // Expect that the RTT is infinite since the delta_time_largest_observed is |
| 161 // larger than the local time elapsed aka invalid. | 166 // larger than the local time elapsed aka invalid. |
| 162 SetUpCongestionType(kFixRate); | 167 SetUpCongestionType(kFixRate); |
| 163 | 168 |
| 164 MockSendAlgorithm* send_algorithm = new StrictMock<MockSendAlgorithm>; | 169 MockSendAlgorithm* send_algorithm = new StrictMock<MockSendAlgorithm>; |
| 165 manager_->SetSendAlgorithm(send_algorithm); | 170 manager_->SetSendAlgorithm(send_algorithm); |
| 166 | 171 |
| 167 QuicPacketSequenceNumber sequence_number = 1; | 172 QuicPacketSequenceNumber sequence_number = 1; |
| 168 QuicTime::Delta expected_rtt = QuicTime::Delta::Infinite(); | 173 QuicTime::Delta expected_rtt = QuicTime::Delta::Infinite(); |
| 169 | 174 |
| 170 EXPECT_CALL(*send_algorithm, SentPacket(_, _, _, _)).Times(1); | 175 EXPECT_CALL(*send_algorithm, SentPacket(_, _, _, _, _)) |
| 176 .Times(1).WillOnce(Return(true)); |
| 171 EXPECT_CALL(*send_algorithm, | 177 EXPECT_CALL(*send_algorithm, |
| 172 OnIncomingAck(sequence_number, _, expected_rtt)).Times(1); | 178 OnIncomingAck(sequence_number, _, expected_rtt)).Times(1); |
| 173 | 179 |
| 174 manager_->SentPacket(sequence_number, clock_.Now(), 1000, NOT_RETRANSMISSION); | 180 manager_->SentPacket(sequence_number, clock_.Now(), 1000, NOT_RETRANSMISSION, |
| 181 HAS_RETRANSMITTABLE_DATA); |
| 175 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10)); | 182 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10)); |
| 176 | 183 |
| 177 QuicAckFrame ack; | 184 QuicAckFrame ack; |
| 178 ack.received_info.largest_observed = sequence_number; | 185 ack.received_info.largest_observed = sequence_number; |
| 179 ack.received_info.delta_time_largest_observed = | 186 ack.received_info.delta_time_largest_observed = |
| 180 QuicTime::Delta::FromMilliseconds(11); | 187 QuicTime::Delta::FromMilliseconds(11); |
| 181 manager_->OnIncomingAckFrame(ack, clock_.Now()); | 188 manager_->OnIncomingAckFrame(ack, clock_.Now()); |
| 182 EXPECT_EQ(manager_->rtt(), expected_rtt); | 189 EXPECT_EQ(manager_->rtt(), expected_rtt); |
| 183 } | 190 } |
| 184 | 191 |
| 185 TEST_F(QuicCongestionManagerTest, RttInfiniteDelta) { | 192 TEST_F(QuicCongestionManagerTest, RttInfiniteDelta) { |
| 186 // Expect that the RTT is infinite since the delta_time_largest_observed is | 193 // Expect that the RTT is infinite since the delta_time_largest_observed is |
| 187 // infinite aka invalid. | 194 // infinite aka invalid. |
| 188 SetUpCongestionType(kFixRate); | 195 SetUpCongestionType(kFixRate); |
| 189 | 196 |
| 190 MockSendAlgorithm* send_algorithm = new StrictMock<MockSendAlgorithm>; | 197 MockSendAlgorithm* send_algorithm = new StrictMock<MockSendAlgorithm>; |
| 191 manager_->SetSendAlgorithm(send_algorithm); | 198 manager_->SetSendAlgorithm(send_algorithm); |
| 192 | 199 |
| 193 QuicPacketSequenceNumber sequence_number = 1; | 200 QuicPacketSequenceNumber sequence_number = 1; |
| 194 QuicTime::Delta expected_rtt = QuicTime::Delta::Infinite(); | 201 QuicTime::Delta expected_rtt = QuicTime::Delta::Infinite(); |
| 195 | 202 |
| 196 EXPECT_CALL(*send_algorithm, SentPacket(_, _, _, _)).Times(1); | 203 EXPECT_CALL(*send_algorithm, SentPacket(_, _, _, _, _)) |
| 204 .Times(1).WillOnce(Return(true)); |
| 197 EXPECT_CALL(*send_algorithm, | 205 EXPECT_CALL(*send_algorithm, |
| 198 OnIncomingAck(sequence_number, _, expected_rtt)).Times(1); | 206 OnIncomingAck(sequence_number, _, expected_rtt)).Times(1); |
| 199 | 207 |
| 200 manager_->SentPacket(sequence_number, clock_.Now(), 1000, NOT_RETRANSMISSION); | 208 manager_->SentPacket(sequence_number, clock_.Now(), 1000, NOT_RETRANSMISSION, |
| 209 HAS_RETRANSMITTABLE_DATA); |
| 201 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10)); | 210 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10)); |
| 202 | 211 |
| 203 QuicAckFrame ack; | 212 QuicAckFrame ack; |
| 204 ack.received_info.largest_observed = sequence_number; | 213 ack.received_info.largest_observed = sequence_number; |
| 205 ack.received_info.delta_time_largest_observed = QuicTime::Delta::Infinite(); | 214 ack.received_info.delta_time_largest_observed = QuicTime::Delta::Infinite(); |
| 206 manager_->OnIncomingAckFrame(ack, clock_.Now()); | 215 manager_->OnIncomingAckFrame(ack, clock_.Now()); |
| 207 EXPECT_EQ(manager_->rtt(), expected_rtt); | 216 EXPECT_EQ(manager_->rtt(), expected_rtt); |
| 208 } | 217 } |
| 209 | 218 |
| 210 TEST_F(QuicCongestionManagerTest, RttZeroDelta) { | 219 TEST_F(QuicCongestionManagerTest, RttZeroDelta) { |
| 211 // Expect that the RTT is the time between send and receive since the | 220 // Expect that the RTT is the time between send and receive since the |
| 212 // delta_time_largest_observed is zero. | 221 // delta_time_largest_observed is zero. |
| 213 SetUpCongestionType(kFixRate); | 222 SetUpCongestionType(kFixRate); |
| 214 | 223 |
| 215 MockSendAlgorithm* send_algorithm = new StrictMock<MockSendAlgorithm>; | 224 MockSendAlgorithm* send_algorithm = new StrictMock<MockSendAlgorithm>; |
| 216 manager_->SetSendAlgorithm(send_algorithm); | 225 manager_->SetSendAlgorithm(send_algorithm); |
| 217 | 226 |
| 218 QuicPacketSequenceNumber sequence_number = 1; | 227 QuicPacketSequenceNumber sequence_number = 1; |
| 219 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10); | 228 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10); |
| 220 | 229 |
| 221 EXPECT_CALL(*send_algorithm, SentPacket(_, _, _, _)).Times(1); | 230 EXPECT_CALL(*send_algorithm, SentPacket(_, _, _, _, _)) |
| 222 EXPECT_CALL(*send_algorithm, | 231 .Times(1).WillOnce(Return(true)); |
| 223 OnIncomingAck(sequence_number, _, expected_rtt)).Times(1); | 232 EXPECT_CALL(*send_algorithm, OnIncomingAck(sequence_number, _, expected_rtt)) |
| 233 .Times(1); |
| 224 | 234 |
| 225 manager_->SentPacket(sequence_number, clock_.Now(), 1000, NOT_RETRANSMISSION); | 235 manager_->SentPacket(sequence_number, clock_.Now(), 1000, NOT_RETRANSMISSION, |
| 236 HAS_RETRANSMITTABLE_DATA); |
| 226 clock_.AdvanceTime(expected_rtt); | 237 clock_.AdvanceTime(expected_rtt); |
| 227 | 238 |
| 228 QuicAckFrame ack; | 239 QuicAckFrame ack; |
| 229 ack.received_info.largest_observed = sequence_number; | 240 ack.received_info.largest_observed = sequence_number; |
| 230 ack.received_info.delta_time_largest_observed = QuicTime::Delta::Zero(); | 241 ack.received_info.delta_time_largest_observed = QuicTime::Delta::Zero(); |
| 231 manager_->OnIncomingAckFrame(ack, clock_.Now()); | 242 manager_->OnIncomingAckFrame(ack, clock_.Now()); |
| 232 EXPECT_EQ(manager_->rtt(), expected_rtt); | 243 EXPECT_EQ(manager_->rtt(), expected_rtt); |
| 233 } | 244 } |
| 234 | 245 |
| 235 } // namespace test | 246 } // namespace test |
| 236 } // namespace net | 247 } // namespace net |
| OLD | NEW |