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

Side by Side Diff: net/quic/quic_connection_helper_test.cc

Issue 12334063: Land recent QUIC changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: more EXPECT_FALSE Created 7 years, 10 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
« no previous file with comments | « net/quic/quic_connection.cc ('k') | net/quic/quic_connection_logger.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 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 "net/quic/quic_connection_helper.h" 5 #include "net/quic/quic_connection_helper.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "net/base/net_errors.h" 9 #include "net/base/net_errors.h"
10 #include "net/quic/test_tools/mock_clock.h" 10 #include "net/quic/test_tools/mock_clock.h"
(...skipping 19 matching lines...) Expand all
30 : QuicConnection(guid, address, helper) { 30 : QuicConnection(guid, address, helper) {
31 } 31 }
32 32
33 void SendAck() { 33 void SendAck() {
34 QuicConnectionPeer::SendAck(this); 34 QuicConnectionPeer::SendAck(this);
35 } 35 }
36 36
37 void SetSendAlgorithm(SendAlgorithmInterface* send_algorithm) { 37 void SetSendAlgorithm(SendAlgorithmInterface* send_algorithm) {
38 QuicConnectionPeer::SetSendAlgorithm(this, send_algorithm); 38 QuicConnectionPeer::SetSendAlgorithm(this, send_algorithm);
39 } 39 }
40
41 using QuicConnection::SendOrQueuePacket;
40 }; 42 };
41 43
42 class QuicConnectionHelperTest : public ::testing::Test { 44 class QuicConnectionHelperTest : public ::testing::Test {
43 protected: 45 protected:
44 // Holds a packet to be written to the wire, and the IO mode that should 46 // Holds a packet to be written to the wire, and the IO mode that should
45 // be used by the mock socket when performing the write. 47 // be used by the mock socket when performing the write.
46 struct PacketToWrite { 48 struct PacketToWrite {
47 PacketToWrite(IoMode mode, QuicEncryptedPacket* packet) 49 PacketToWrite(IoMode mode, QuicEncryptedPacket* packet)
48 : mode(mode), 50 : mode(mode),
49 packet(packet) { 51 packet(packet) {
50 } 52 }
51 IoMode mode; 53 IoMode mode;
52 QuicEncryptedPacket* packet; 54 QuicEncryptedPacket* packet;
53 }; 55 };
54 56
55 QuicConnectionHelperTest() 57 QuicConnectionHelperTest()
56 : guid_(2), 58 : guid_(2),
57 framer_(QuicDecrypter::Create(kNULL), QuicEncrypter::Create(kNULL)), 59 framer_(QuicDecrypter::Create(kNULL), QuicEncrypter::Create(kNULL)),
58 creator_(guid_, &framer_), 60 creator_(guid_, &framer_, QuicRandom::GetInstance()),
59 net_log_(BoundNetLog()), 61 net_log_(BoundNetLog()),
60 frame_(1, false, 0, kData) { 62 frame_(1, false, 0, kData) {
61 Initialize(); 63 Initialize();
62 } 64 }
63 65
64 ~QuicConnectionHelperTest() { 66 ~QuicConnectionHelperTest() {
65 for (size_t i = 0; i < writes_.size(); i++) { 67 for (size_t i = 0; i < writes_.size(); i++) {
66 delete writes_[i].packet; 68 delete writes_[i].packet;
67 } 69 }
68 } 70 }
(...skipping 24 matching lines...) Expand all
93 socket_data_.reset(new StaticSocketDataProvider(NULL, 0, mock_writes_.get(), 95 socket_data_.reset(new StaticSocketDataProvider(NULL, 0, mock_writes_.get(),
94 writes_.size())); 96 writes_.size()));
95 97
96 MockUDPClientSocket* socket = 98 MockUDPClientSocket* socket =
97 new MockUDPClientSocket(socket_data_.get(), net_log_.net_log()); 99 new MockUDPClientSocket(socket_data_.get(), net_log_.net_log());
98 socket->Connect(IPEndPoint()); 100 socket->Connect(IPEndPoint());
99 runner_ = new TestTaskRunner(&clock_); 101 runner_ = new TestTaskRunner(&clock_);
100 helper_.reset(new QuicConnectionHelper(runner_.get(), &clock_, 102 helper_.reset(new QuicConnectionHelper(runner_.get(), &clock_,
101 &random_generator_, socket)); 103 &random_generator_, socket));
102 send_algorithm_ = new testing::StrictMock<MockSendAlgorithm>(); 104 send_algorithm_ = new testing::StrictMock<MockSendAlgorithm>();
103 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_)). 105 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _)).
104 WillRepeatedly(testing::Return(QuicTime::Delta::Zero())); 106 WillRepeatedly(testing::Return(QuicTime::Delta::Zero()));
105 connection_.reset(new TestConnection(guid_, IPEndPoint(), helper_.get())); 107 connection_.reset(new TestConnection(guid_, IPEndPoint(), helper_.get()));
106 connection_->set_visitor(&visitor_); 108 connection_->set_visitor(&visitor_);
107 connection_->SetSendAlgorithm(send_algorithm_); 109 connection_->SetSendAlgorithm(send_algorithm_);
108 } 110 }
109 111
110 // Returns a newly created packet to send kData on stream 1. 112 // Returns a newly created packet to send kData on stream 1.
111 QuicEncryptedPacket* ConstructDataPacket( 113 QuicEncryptedPacket* ConstructDataPacket(
112 QuicPacketSequenceNumber sequence_number) { 114 QuicPacketSequenceNumber sequence_number) {
113 InitializeHeader(sequence_number); 115 InitializeHeader(sequence_number);
114 116
115 return ConstructPacket(header_, QuicFrame(&frame_)); 117 return ConstructPacket(header_, QuicFrame(&frame_));
116 } 118 }
117 119
120 // Returns a newly created packet to send kData on stream 1.
121 QuicPacket* ConstructRawDataPacket(
122 QuicPacketSequenceNumber sequence_number) {
123 InitializeHeader(sequence_number);
124
125 QuicFrames frames;
126 frames.push_back(QuicFrame(&frame_));
127 return framer_.ConstructFrameDataPacket(header_, frames).packet;
128 }
129
118 // Returns a newly created packet to send ack data. 130 // Returns a newly created packet to send ack data.
119 QuicEncryptedPacket* ConstructAckPacket( 131 QuicEncryptedPacket* ConstructAckPacket(
120 QuicPacketSequenceNumber sequence_number) { 132 QuicPacketSequenceNumber sequence_number) {
121 InitializeHeader(sequence_number); 133 InitializeHeader(sequence_number);
122 134
123 QuicAckFrame ack(0, sequence_number); 135 QuicAckFrame ack(0, sequence_number);
136 ack.sent_info.entropy_hash = 0;
137 ack.received_info.entropy_hash = 0;
124 138
125 QuicCongestionFeedbackFrame feedback; 139 QuicCongestionFeedbackFrame feedback;
126 feedback.type = kTCP; 140 feedback.type = kTCP;
127 feedback.tcp.accumulated_number_of_lost_packets = 0; 141 feedback.tcp.accumulated_number_of_lost_packets = 0;
128 feedback.tcp.receive_window = 16000 << 4; 142 feedback.tcp.receive_window = 16000 << 4;
129 143
130 QuicFrames frames; 144 QuicFrames frames;
131 frames.push_back(QuicFrame(&ack)); 145 frames.push_back(QuicFrame(&ack));
132 frames.push_back(QuicFrame(&feedback)); 146 frames.push_back(QuicFrame(&feedback));
133 scoped_ptr<QuicPacket> packet( 147 scoped_ptr<QuicPacket> packet(
134 framer_.ConstructFrameDataPacket(header_, frames)); 148 framer_.ConstructFrameDataPacket(header_, frames).packet);
135 return framer_.EncryptPacket(*packet); 149 return framer_.EncryptPacket(header_.packet_sequence_number, *packet);
136 } 150 }
137 151
138 // Returns a newly created packet to send a connection close frame. 152 // Returns a newly created packet to send a connection close frame.
139 QuicEncryptedPacket* ConstructClosePacket( 153 QuicEncryptedPacket* ConstructClosePacket(
140 QuicPacketSequenceNumber sequence_number, 154 QuicPacketSequenceNumber sequence_number,
141 QuicPacketSequenceNumber least_waiting) { 155 QuicPacketSequenceNumber least_waiting) {
142 InitializeHeader(sequence_number); 156 InitializeHeader(sequence_number);
143 157
144 QuicFrames frames; 158 QuicFrames frames;
145 QuicAckFrame ack(0, least_waiting); 159 QuicAckFrame ack(0, least_waiting + 1);
160 ack.sent_info.entropy_hash = 0;
161 ack.received_info.entropy_hash = 0;
146 QuicConnectionCloseFrame close; 162 QuicConnectionCloseFrame close;
147 close.error_code = QUIC_CONNECTION_TIMED_OUT; 163 close.error_code = QUIC_CONNECTION_TIMED_OUT;
148 close.ack_frame = ack; 164 close.ack_frame = ack;
149 165
150 return ConstructPacket(header_, QuicFrame(&close)); 166 return ConstructPacket(header_, QuicFrame(&close));
151 } 167 }
152 168
153 testing::StrictMock<MockSendAlgorithm>* send_algorithm_; 169 testing::StrictMock<MockSendAlgorithm>* send_algorithm_;
154 scoped_refptr<TestTaskRunner> runner_; 170 scoped_refptr<TestTaskRunner> runner_;
155 scoped_ptr<QuicConnectionHelper> helper_; 171 scoped_ptr<QuicConnectionHelper> helper_;
156 scoped_array<MockWrite> mock_writes_; 172 scoped_array<MockWrite> mock_writes_;
157 MockClock clock_; 173 MockClock clock_;
158 MockRandom random_generator_; 174 MockRandom random_generator_;
159 scoped_ptr<TestConnection> connection_; 175 scoped_ptr<TestConnection> connection_;
160 testing::StrictMock<MockConnectionVisitor> visitor_; 176 testing::StrictMock<MockConnectionVisitor> visitor_;
161 177
162 private: 178 private:
163 void InitializeHeader(QuicPacketSequenceNumber sequence_number) { 179 void InitializeHeader(QuicPacketSequenceNumber sequence_number) {
164 header_.public_header.guid = guid_; 180 header_.public_header.guid = guid_;
165 header_.public_header.flags = PACKET_PUBLIC_FLAGS_NONE; 181 header_.public_header.reset_flag = false;
182 header_.public_header.version_flag = false;
166 header_.packet_sequence_number = sequence_number; 183 header_.packet_sequence_number = sequence_number;
167 header_.private_flags = PACKET_PRIVATE_FLAGS_NONE; 184 header_.entropy_flag = false;
185 header_.fec_entropy_flag = false;
186 header_.fec_flag = false;
168 header_.fec_group = 0; 187 header_.fec_group = 0;
169 } 188 }
170 189
171 QuicEncryptedPacket* ConstructPacket(const QuicPacketHeader& header, 190 QuicEncryptedPacket* ConstructPacket(const QuicPacketHeader& header,
172 const QuicFrame& frame) { 191 const QuicFrame& frame) {
173 QuicFrames frames; 192 QuicFrames frames;
174 frames.push_back(frame); 193 frames.push_back(frame);
175 scoped_ptr<QuicPacket> packet( 194 scoped_ptr<QuicPacket> packet(
176 framer_.ConstructFrameDataPacket(header_, frames)); 195 framer_.ConstructFrameDataPacket(header_, frames).packet);
177 return framer_.EncryptPacket(*packet); 196 return framer_.EncryptPacket(header_.packet_sequence_number, *packet);
178 } 197 }
179 198
180 QuicGuid guid_; 199 QuicGuid guid_;
181 QuicFramer framer_; 200 QuicFramer framer_;
182 QuicPacketCreator creator_; 201 QuicPacketCreator creator_;
183 QuicPacketHeader header_; 202 QuicPacketHeader header_;
184 BoundNetLog net_log_; 203 BoundNetLog net_log_;
185 QuicStreamFrame frame_; 204 QuicStreamFrame frame_;
186 scoped_ptr<StaticSocketDataProvider> socket_data_; 205 scoped_ptr<StaticSocketDataProvider> socket_data_;
187 std::vector<PacketToWrite> writes_; 206 std::vector<PacketToWrite> writes_;
(...skipping 30 matching lines...) Expand all
218 ASSERT_EQ(1u, runner_->GetPostedTasks().size()); 237 ASSERT_EQ(1u, runner_->GetPostedTasks().size());
219 238
220 QuicTime::Delta delta(QuicTime::Delta::FromMilliseconds(10)); 239 QuicTime::Delta delta(QuicTime::Delta::FromMilliseconds(10));
221 helper_->SetAckAlarm(delta); 240 helper_->SetAckAlarm(delta);
222 241
223 // Verify that the ack alarm task has been posted. 242 // Verify that the ack alarm task has been posted.
224 ASSERT_EQ(2u, runner_->GetPostedTasks().size()); 243 ASSERT_EQ(2u, runner_->GetPostedTasks().size());
225 EXPECT_EQ(base::TimeDelta::FromMicroseconds(delta.ToMicroseconds()), 244 EXPECT_EQ(base::TimeDelta::FromMicroseconds(delta.ToMicroseconds()),
226 runner_->GetPostedTasks()[1].delay); 245 runner_->GetPostedTasks()[1].delay);
227 246
228 EXPECT_CALL(*send_algorithm_, SentPacket(1, _, false)); 247 EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, false));
229 runner_->RunNextTask(); 248 runner_->RunNextTask();
230 EXPECT_EQ(QuicTime::Zero().Add(delta), clock_.Now()); 249 EXPECT_EQ(QuicTime::Zero().Add(delta), clock_.ApproximateNow());
231 } 250 }
232 251
233 TEST_F(QuicConnectionHelperTest, ClearAckAlarm) { 252 TEST_F(QuicConnectionHelperTest, ClearAckAlarm) {
234 Initialize(); 253 Initialize();
235 254
236 // Verify that the timeout alarm task has been posted. 255 // Verify that the timeout alarm task has been posted.
237 ASSERT_EQ(1u, runner_->GetPostedTasks().size()); 256 ASSERT_EQ(1u, runner_->GetPostedTasks().size());
238 257
239 QuicTime::Delta delta(QuicTime::Delta::FromMilliseconds(10)); 258 QuicTime::Delta delta(QuicTime::Delta::FromMilliseconds(10));
240 helper_->SetAckAlarm(delta); 259 helper_->SetAckAlarm(delta);
241 260
242 helper_->ClearAckAlarm(); 261 helper_->ClearAckAlarm();
243 262
244 // When the AckAlarm actually fires, no ack will be sent. 263 // When the AckAlarm actually fires, no ack will be sent.
245 runner_->RunNextTask(); 264 runner_->RunNextTask();
246 EXPECT_EQ(QuicTime::Zero().Add(delta), clock_.Now()); 265 EXPECT_EQ(QuicTime::Zero().Add(delta), clock_.ApproximateNow());
247 } 266 }
248 267
249 TEST_F(QuicConnectionHelperTest, ResetAckAlarm) { 268 TEST_F(QuicConnectionHelperTest, ResetAckAlarm) {
250 AddWrite(SYNCHRONOUS, ConstructAckPacket(1)); 269 AddWrite(SYNCHRONOUS, ConstructAckPacket(1));
251 Initialize(); 270 Initialize();
252 271
253 // Verify that the timeout alarm task has been posted. 272 // Verify that the timeout alarm task has been posted.
254 ASSERT_EQ(1u, runner_->GetPostedTasks().size()); 273 ASSERT_EQ(1u, runner_->GetPostedTasks().size());
255 274
256 QuicTime::Delta delta1(QuicTime::Delta::FromMilliseconds(10)); 275 QuicTime::Delta delta1(QuicTime::Delta::FromMilliseconds(10));
257 QuicTime::Delta delta2(QuicTime::Delta::FromMilliseconds(20)); 276 QuicTime::Delta delta2(QuicTime::Delta::FromMilliseconds(20));
258 helper_->SetAckAlarm(delta1); 277 helper_->SetAckAlarm(delta1);
259 helper_->ClearAckAlarm(); 278 helper_->ClearAckAlarm();
260 helper_->SetAckAlarm(delta2); 279 helper_->SetAckAlarm(delta2);
261 // We should only have 1 ack alarm task posted. 280 // We should only have 1 ack alarm task posted.
262 ASSERT_EQ(2u, runner_->GetPostedTasks().size()); 281 ASSERT_EQ(2u, runner_->GetPostedTasks().size());
263 282
264 // The task will execute at delta1, but will not send and ack, 283 // The task will execute at delta1, but will not send and ack,
265 // but it will reschedule itself for delta2 284 // but it will reschedule itself for delta2
266 runner_->RunNextTask(); 285 runner_->RunNextTask();
267 EXPECT_EQ(QuicTime::Zero().Add(delta1), clock_.Now()); 286 EXPECT_EQ(QuicTime::Zero().Add(delta1), clock_.ApproximateNow());
268 287
269 // Verify that the ack alarm task has been re-posted. 288 // Verify that the ack alarm task has been re-posted.
270 ASSERT_EQ(2u, runner_->GetPostedTasks().size()); 289 ASSERT_EQ(2u, runner_->GetPostedTasks().size());
271 290
272 EXPECT_CALL(*send_algorithm_, SentPacket(1, _, false)); 291 EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, false));
273 runner_->RunNextTask(); 292 runner_->RunNextTask();
274 EXPECT_EQ(QuicTime::Zero().Add(delta2), clock_.Now()); 293 EXPECT_EQ(QuicTime::Zero().Add(delta2), clock_.ApproximateNow());
275 } 294 }
276 295
277 TEST_F(QuicConnectionHelperTest, TestRetransmission) { 296 TEST_F(QuicConnectionHelperTest, TestRetransmission) {
278 AddWrite(SYNCHRONOUS, ConstructDataPacket(1)); 297 AddWrite(SYNCHRONOUS, ConstructDataPacket(1));
279 AddWrite(SYNCHRONOUS, ConstructDataPacket(2)); 298 AddWrite(SYNCHRONOUS, ConstructDataPacket(2));
280 Initialize(); 299 Initialize();
281 300
282 QuicTime::Delta kDefaultRetransmissionTime = 301 QuicTime::Delta kDefaultRetransmissionTime =
283 QuicTime::Delta::FromMilliseconds(500); 302 QuicTime::Delta::FromMilliseconds(500);
284 QuicTime start = clock_.Now(); 303 QuicTime start = clock_.ApproximateNow();
285 304
286 EXPECT_CALL(*send_algorithm_, SentPacket(1, _, false)); 305 EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, false));
287 // Send a packet. 306 // Send a packet.
288 connection_->SendStreamData(1, kData, 0, false); 307 connection_->SendStreamData(1, kData, 0, false);
289 EXPECT_CALL(*send_algorithm_, SentPacket(2, _, true)); 308 EXPECT_CALL(*send_algorithm_, SentPacket(_, 2, _, true));
290 // Since no ack was received, the retransmission alarm will fire and 309 // Since no ack was received, the retransmission alarm will fire and
291 // retransmit it. 310 // retransmit it.
292 runner_->RunNextTask(); 311 runner_->RunNextTask();
293 312
294 EXPECT_EQ(kDefaultRetransmissionTime, clock_.Now().Subtract(start)); 313 EXPECT_EQ(kDefaultRetransmissionTime,
314 clock_.ApproximateNow().Subtract(start));
295 EXPECT_TRUE(AtEof()); 315 EXPECT_TRUE(AtEof());
296 } 316 }
297 317
298 TEST_F(QuicConnectionHelperTest, InitialTimeout) { 318 TEST_F(QuicConnectionHelperTest, InitialTimeout) {
299 AddWrite(SYNCHRONOUS, ConstructClosePacket(1, 0)); 319 AddWrite(SYNCHRONOUS, ConstructClosePacket(1, 0));
300 Initialize(); 320 Initialize();
301 321
302 // Verify that a single task was posted. 322 // Verify that a single task was posted.
303 ASSERT_EQ(1u, runner_->GetPostedTasks().size()); 323 ASSERT_EQ(1u, runner_->GetPostedTasks().size());
304 EXPECT_EQ(base::TimeDelta::FromMicroseconds(kDefaultTimeoutUs), 324 EXPECT_EQ(base::TimeDelta::FromMicroseconds(kDefaultTimeoutUs),
305 runner_->GetPostedTasks().front().delay); 325 runner_->GetPostedTasks().front().delay);
306 326
307 EXPECT_CALL(*send_algorithm_, SentPacket(1, _, false)); 327 EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, false));
308 // After we run the next task, we should close the connection. 328 // After we run the next task, we should close the connection.
309 EXPECT_CALL(visitor_, ConnectionClose(QUIC_CONNECTION_TIMED_OUT, false)); 329 EXPECT_CALL(visitor_, ConnectionClose(QUIC_CONNECTION_TIMED_OUT, false));
310 330
311 runner_->RunNextTask(); 331 runner_->RunNextTask();
312 EXPECT_EQ(QuicTime::FromMicroseconds(kDefaultTimeoutUs), clock_.Now()); 332 EXPECT_EQ(QuicTime::FromMicroseconds(kDefaultTimeoutUs),
333 clock_.ApproximateNow());
313 EXPECT_FALSE(connection_->connected()); 334 EXPECT_FALSE(connection_->connected());
314 EXPECT_TRUE(AtEof()); 335 EXPECT_TRUE(AtEof());
315 } 336 }
316 337
317 TEST_F(QuicConnectionHelperTest, WritePacketToWire) { 338 TEST_F(QuicConnectionHelperTest, WritePacketToWire) {
318 AddWrite(SYNCHRONOUS, ConstructDataPacket(1)); 339 AddWrite(SYNCHRONOUS, ConstructDataPacket(1));
319 Initialize(); 340 Initialize();
320 341
321 int len = GetWrite(0)->length(); 342 int len = GetWrite(0)->length();
322 int error = 0; 343 int error = 0;
(...skipping 13 matching lines...) Expand all
336 MessageLoop::current()->RunUntilIdle(); 357 MessageLoop::current()->RunUntilIdle();
337 EXPECT_TRUE(AtEof()); 358 EXPECT_TRUE(AtEof());
338 } 359 }
339 360
340 TEST_F(QuicConnectionHelperTest, TimeoutAfterSend) { 361 TEST_F(QuicConnectionHelperTest, TimeoutAfterSend) {
341 AddWrite(SYNCHRONOUS, ConstructAckPacket(1)); 362 AddWrite(SYNCHRONOUS, ConstructAckPacket(1));
342 AddWrite(SYNCHRONOUS, ConstructClosePacket(2, 1)); 363 AddWrite(SYNCHRONOUS, ConstructClosePacket(2, 1));
343 Initialize(); 364 Initialize();
344 365
345 EXPECT_TRUE(connection_->connected()); 366 EXPECT_TRUE(connection_->connected());
346 EXPECT_EQ(0u, clock_.Now().ToMicroseconds()); 367 EXPECT_EQ(0u, clock_.ApproximateNow().ToMicroseconds());
347 368
348 // When we send a packet, the timeout will change to 5000 + kDefaultTimeout. 369 // When we send a packet, the timeout will change to 5000 + kDefaultTimeout.
349 clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(5000)); 370 clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(5000));
350 EXPECT_EQ(5000u, clock_.Now().ToMicroseconds()); 371 EXPECT_EQ(5000u, clock_.ApproximateNow().ToMicroseconds());
351 EXPECT_CALL(*send_algorithm_, SentPacket(1, _, false)); 372 EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, false));
352 373
353 // Send an ack so we don't set the retransmission alarm. 374 // Send an ack so we don't set the retransmission alarm.
354 connection_->SendAck(); 375 connection_->SendAck();
355 376
356 // The original alarm will fire. We should not time out because we had a 377 // The original alarm will fire. We should not time out because we had a
357 // network event at t=5000. The alarm will reregister. 378 // network event at t=5000. The alarm will reregister.
358 runner_->RunNextTask(); 379 runner_->RunNextTask();
359 380
360 EXPECT_EQ(QuicTime::FromMicroseconds(kDefaultTimeoutUs), clock_.Now()); 381 EXPECT_EQ(QuicTime::FromMicroseconds(kDefaultTimeoutUs),
382 clock_.ApproximateNow());
361 EXPECT_TRUE(connection_->connected()); 383 EXPECT_TRUE(connection_->connected());
362 384
363 // This time, we should time out. 385 // This time, we should time out.
364 EXPECT_CALL(visitor_, ConnectionClose(QUIC_CONNECTION_TIMED_OUT, false)); 386 EXPECT_CALL(visitor_, ConnectionClose(QUIC_CONNECTION_TIMED_OUT, false));
365 EXPECT_CALL(*send_algorithm_, SentPacket(2, _, false)); 387 EXPECT_CALL(*send_algorithm_, SentPacket(_, 2, _, false));
366 runner_->RunNextTask(); 388 runner_->RunNextTask();
367 EXPECT_EQ(kDefaultTimeoutUs + 5000, clock_.Now().ToMicroseconds()); 389 EXPECT_EQ(kDefaultTimeoutUs + 5000, clock_.ApproximateNow().ToMicroseconds());
368 EXPECT_FALSE(connection_->connected()); 390 EXPECT_FALSE(connection_->connected());
369 EXPECT_TRUE(AtEof()); 391 EXPECT_TRUE(AtEof());
370 } 392 }
371 393
372 TEST_F(QuicConnectionHelperTest, SendSchedulerDelayThenSend) { 394 TEST_F(QuicConnectionHelperTest, SendSchedulerDelayThenSend) {
373 AddWrite(SYNCHRONOUS, ConstructDataPacket(1)); 395 AddWrite(SYNCHRONOUS, ConstructDataPacket(1));
374 Initialize(); 396 Initialize();
375 397
376 // Test that if we send a packet with a delay, it ends up queued. 398 // Test that if we send a packet with a delay, it ends up queued.
377 EXPECT_CALL(*send_algorithm_, TimeUntilSend(false)).WillOnce(testing::Return( 399 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, false)).WillOnce(
378 QuicTime::Delta::FromMicroseconds(1))); 400 testing::Return(QuicTime::Delta::FromMicroseconds(1)));
379 401
380 connection_->SendStreamData(1, kData, 0, false); 402 QuicPacket* packet = ConstructRawDataPacket(1);
381 EXPECT_CALL(*send_algorithm_, SentPacket(1, _, false)); 403 connection_->SendOrQueuePacket(1, packet, 0);
404 EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, false));
382 EXPECT_EQ(1u, connection_->NumQueuedPackets()); 405 EXPECT_EQ(1u, connection_->NumQueuedPackets());
383 406
384 // Advance the clock to fire the alarm, and configure the scheduler 407 // Advance the clock to fire the alarm, and configure the scheduler
385 // to permit the packet to be sent. 408 // to permit the packet to be sent.
386 EXPECT_CALL(*send_algorithm_, TimeUntilSend(false)).WillOnce(testing::Return( 409 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, false)).WillOnce(
387 QuicTime::Delta::Zero())); 410 testing::Return(QuicTime::Delta::Zero()));
388 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(testing::Return(true)); 411 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(testing::Return(true));
389 runner_->RunNextTask(); 412 runner_->RunNextTask();
390 EXPECT_EQ(0u, connection_->NumQueuedPackets()); 413 EXPECT_EQ(0u, connection_->NumQueuedPackets());
391 EXPECT_TRUE(AtEof()); 414 EXPECT_TRUE(AtEof());
392 } 415 }
393 416
394 } // namespace test 417 } // namespace test
395 } // namespace net 418 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_connection.cc ('k') | net/quic/quic_connection_logger.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698