Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(366)

Side by Side Diff: net/quic/congestion_control/quic_congestion_manager_test.cc

Issue 23597045: Land Recent QUIC changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merged QuicPriority to RequestPriority changes Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
OLDNEW
« no previous file with comments | « net/quic/congestion_control/quic_congestion_manager.cc ('k') | net/quic/congestion_control/send_algorithm_interface.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698