OLD | NEW |
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/crypto/quic_decrypter.h" | 10 #include "net/quic/crypto/quic_decrypter.h" |
(...skipping 12 matching lines...) Expand all Loading... |
23 namespace test { | 23 namespace test { |
24 | 24 |
25 const char kData[] = "foo"; | 25 const char kData[] = "foo"; |
26 const bool kHasData = true; | 26 const bool kHasData = true; |
27 | 27 |
28 class TestConnection : public QuicConnection { | 28 class TestConnection : public QuicConnection { |
29 public: | 29 public: |
30 TestConnection(QuicGuid guid, | 30 TestConnection(QuicGuid guid, |
31 IPEndPoint address, | 31 IPEndPoint address, |
32 QuicConnectionHelper* helper) | 32 QuicConnectionHelper* helper) |
33 : QuicConnection(guid, address, helper) { | 33 : QuicConnection(guid, address, helper, false) { |
34 } | 34 } |
35 | 35 |
36 void SendAck() { | 36 void SendAck() { |
37 QuicConnectionPeer::SendAck(this); | 37 QuicConnectionPeer::SendAck(this); |
38 } | 38 } |
39 | 39 |
40 void SetSendAlgorithm(SendAlgorithmInterface* send_algorithm) { | 40 void SetSendAlgorithm(SendAlgorithmInterface* send_algorithm) { |
41 QuicConnectionPeer::SetSendAlgorithm(this, send_algorithm); | 41 QuicConnectionPeer::SetSendAlgorithm(this, send_algorithm); |
42 } | 42 } |
43 | 43 |
(...skipping 10 matching lines...) Expand all Loading... |
54 packet(packet) { | 54 packet(packet) { |
55 } | 55 } |
56 IoMode mode; | 56 IoMode mode; |
57 QuicEncryptedPacket* packet; | 57 QuicEncryptedPacket* packet; |
58 }; | 58 }; |
59 | 59 |
60 QuicConnectionHelperTest() | 60 QuicConnectionHelperTest() |
61 : guid_(2), | 61 : guid_(2), |
62 framer_(kQuicVersion1, | 62 framer_(kQuicVersion1, |
63 QuicDecrypter::Create(kNULL), | 63 QuicDecrypter::Create(kNULL), |
64 QuicEncrypter::Create(kNULL)), | 64 QuicEncrypter::Create(kNULL), |
65 creator_(guid_, &framer_, QuicRandom::GetInstance()), | 65 false), |
66 net_log_(BoundNetLog()), | 66 net_log_(BoundNetLog()), |
67 frame_(1, false, 0, kData) { | 67 frame_(1, false, 0, kData) { |
68 Initialize(); | 68 Initialize(); |
69 } | 69 } |
70 | 70 |
71 ~QuicConnectionHelperTest() { | 71 ~QuicConnectionHelperTest() { |
72 for (size_t i = 0; i < writes_.size(); i++) { | 72 for (size_t i = 0; i < writes_.size(); i++) { |
73 delete writes_[i].packet; | 73 delete writes_[i].packet; |
74 } | 74 } |
75 } | 75 } |
(...skipping 24 matching lines...) Expand all Loading... |
100 socket_data_.reset(new StaticSocketDataProvider(NULL, 0, mock_writes_.get(), | 100 socket_data_.reset(new StaticSocketDataProvider(NULL, 0, mock_writes_.get(), |
101 writes_.size())); | 101 writes_.size())); |
102 | 102 |
103 MockUDPClientSocket* socket = | 103 MockUDPClientSocket* socket = |
104 new MockUDPClientSocket(socket_data_.get(), net_log_.net_log()); | 104 new MockUDPClientSocket(socket_data_.get(), net_log_.net_log()); |
105 socket->Connect(IPEndPoint()); | 105 socket->Connect(IPEndPoint()); |
106 runner_ = new TestTaskRunner(&clock_); | 106 runner_ = new TestTaskRunner(&clock_); |
107 helper_.reset(new QuicConnectionHelper(runner_.get(), &clock_, | 107 helper_.reset(new QuicConnectionHelper(runner_.get(), &clock_, |
108 &random_generator_, socket)); | 108 &random_generator_, socket)); |
109 send_algorithm_ = new testing::StrictMock<MockSendAlgorithm>(); | 109 send_algorithm_ = new testing::StrictMock<MockSendAlgorithm>(); |
110 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _)). | 110 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _)). |
111 WillRepeatedly(testing::Return(QuicTime::Delta::Zero())); | 111 WillRepeatedly(testing::Return(QuicTime::Delta::Zero())); |
112 connection_.reset(new TestConnection(guid_, IPEndPoint(), helper_.get())); | 112 connection_.reset(new TestConnection(guid_, IPEndPoint(), helper_.get())); |
113 connection_->set_visitor(&visitor_); | 113 connection_->set_visitor(&visitor_); |
114 connection_->SetSendAlgorithm(send_algorithm_); | 114 connection_->SetSendAlgorithm(send_algorithm_); |
115 } | 115 } |
116 | 116 |
117 // Returns a newly created packet to send kData on stream 1. | 117 // Returns a newly created packet to send kData on stream 1. |
118 QuicEncryptedPacket* ConstructDataPacket( | 118 QuicEncryptedPacket* ConstructDataPacket( |
119 QuicPacketSequenceNumber sequence_number) { | 119 QuicPacketSequenceNumber sequence_number) { |
120 InitializeHeader(sequence_number); | 120 InitializeHeader(sequence_number); |
121 | 121 |
122 return ConstructPacket(header_, QuicFrame(&frame_)); | 122 return ConstructPacket(header_, QuicFrame(&frame_)); |
123 } | 123 } |
124 | 124 |
125 // Returns a newly created packet to send kData on stream 1. | 125 // Returns a newly created packet to send kData on stream 1. |
126 QuicPacket* ConstructRawDataPacket( | 126 QuicPacket* ConstructRawDataPacket( |
127 QuicPacketSequenceNumber sequence_number) { | 127 QuicPacketSequenceNumber sequence_number) { |
128 InitializeHeader(sequence_number); | 128 InitializeHeader(sequence_number); |
129 | 129 |
130 QuicFrames frames; | 130 QuicFrames frames; |
131 frames.push_back(QuicFrame(&frame_)); | 131 frames.push_back(QuicFrame(&frame_)); |
132 return framer_.ConstructFrameDataPacket(header_, frames).packet; | 132 return framer_.ConstructFrameDataPacket(header_, frames).packet; |
133 } | 133 } |
134 | 134 |
135 // Returns a newly created packet to send ack data. | 135 // Returns a newly created packet to send ack data. |
136 QuicEncryptedPacket* ConstructAckPacket( | 136 QuicEncryptedPacket* ConstructAckPacket( |
137 QuicPacketSequenceNumber sequence_number) { | 137 QuicPacketSequenceNumber sequence_number) { |
138 InitializeHeader(sequence_number); | 138 InitializeHeader(sequence_number); |
139 | 139 |
140 QuicAckFrame ack(0, sequence_number); | 140 QuicAckFrame ack(0, QuicTime::Zero(), sequence_number); |
141 ack.sent_info.entropy_hash = 0; | 141 ack.sent_info.entropy_hash = 0; |
142 ack.received_info.entropy_hash = 0; | 142 ack.received_info.entropy_hash = 0; |
143 | 143 |
144 QuicCongestionFeedbackFrame feedback; | 144 QuicCongestionFeedbackFrame feedback; |
145 feedback.type = kTCP; | 145 feedback.type = kTCP; |
146 feedback.tcp.accumulated_number_of_lost_packets = 0; | 146 feedback.tcp.accumulated_number_of_lost_packets = 0; |
147 feedback.tcp.receive_window = 16000 << 4; | 147 feedback.tcp.receive_window = 16000 << 4; |
148 | 148 |
149 QuicFrames frames; | 149 QuicFrames frames; |
150 frames.push_back(QuicFrame(&ack)); | 150 frames.push_back(QuicFrame(&ack)); |
151 frames.push_back(QuicFrame(&feedback)); | 151 frames.push_back(QuicFrame(&feedback)); |
152 scoped_ptr<QuicPacket> packet( | 152 scoped_ptr<QuicPacket> packet( |
153 framer_.ConstructFrameDataPacket(header_, frames).packet); | 153 framer_.ConstructFrameDataPacket(header_, frames).packet); |
154 return framer_.EncryptPacket(header_.packet_sequence_number, *packet); | 154 return framer_.EncryptPacket(header_.packet_sequence_number, *packet); |
155 } | 155 } |
156 | 156 |
157 // Returns a newly created packet to send a connection close frame. | 157 // Returns a newly created packet to send a connection close frame. |
158 QuicEncryptedPacket* ConstructClosePacket( | 158 QuicEncryptedPacket* ConstructClosePacket( |
159 QuicPacketSequenceNumber sequence_number, | 159 QuicPacketSequenceNumber sequence_number, |
160 QuicPacketSequenceNumber least_waiting) { | 160 QuicPacketSequenceNumber least_waiting) { |
161 InitializeHeader(sequence_number); | 161 InitializeHeader(sequence_number); |
162 | 162 |
163 QuicFrames frames; | 163 QuicFrames frames; |
164 QuicAckFrame ack(0, least_waiting + 1); | 164 QuicAckFrame ack(0, QuicTime::Zero(), least_waiting + 1); |
165 ack.sent_info.entropy_hash = 0; | 165 ack.sent_info.entropy_hash = 0; |
166 ack.received_info.entropy_hash = 0; | 166 ack.received_info.entropy_hash = 0; |
167 QuicConnectionCloseFrame close; | 167 QuicConnectionCloseFrame close; |
168 close.error_code = QUIC_CONNECTION_TIMED_OUT; | 168 close.error_code = QUIC_CONNECTION_TIMED_OUT; |
169 close.ack_frame = ack; | 169 close.ack_frame = ack; |
170 | 170 |
171 return ConstructPacket(header_, QuicFrame(&close)); | 171 return ConstructPacket(header_, QuicFrame(&close)); |
172 } | 172 } |
173 | 173 |
174 testing::StrictMock<MockSendAlgorithm>* send_algorithm_; | 174 testing::StrictMock<MockSendAlgorithm>* send_algorithm_; |
175 scoped_refptr<TestTaskRunner> runner_; | 175 scoped_refptr<TestTaskRunner> runner_; |
176 scoped_ptr<QuicConnectionHelper> helper_; | 176 scoped_ptr<QuicConnectionHelper> helper_; |
177 scoped_array<MockWrite> mock_writes_; | 177 scoped_array<MockWrite> mock_writes_; |
178 MockClock clock_; | 178 MockClock clock_; |
179 MockRandom random_generator_; | 179 MockRandom random_generator_; |
180 scoped_ptr<TestConnection> connection_; | 180 scoped_ptr<TestConnection> connection_; |
181 testing::StrictMock<MockConnectionVisitor> visitor_; | 181 testing::StrictMock<MockConnectionVisitor> visitor_; |
182 | 182 |
183 private: | 183 private: |
184 void InitializeHeader(QuicPacketSequenceNumber sequence_number) { | 184 void InitializeHeader(QuicPacketSequenceNumber sequence_number) { |
185 header_.public_header.guid = guid_; | 185 header_.public_header.guid = guid_; |
186 header_.public_header.reset_flag = false; | 186 header_.public_header.reset_flag = false; |
187 header_.public_header.version_flag = false; | 187 header_.public_header.version_flag = true; |
188 header_.packet_sequence_number = sequence_number; | 188 header_.packet_sequence_number = sequence_number; |
189 header_.entropy_flag = false; | 189 header_.entropy_flag = false; |
190 header_.fec_entropy_flag = false; | 190 header_.fec_entropy_flag = false; |
191 header_.fec_flag = false; | 191 header_.fec_flag = false; |
192 header_.fec_group = 0; | 192 header_.fec_group = 0; |
193 } | 193 } |
194 | 194 |
195 QuicEncryptedPacket* ConstructPacket(const QuicPacketHeader& header, | 195 QuicEncryptedPacket* ConstructPacket(const QuicPacketHeader& header, |
196 const QuicFrame& frame) { | 196 const QuicFrame& frame) { |
197 QuicFrames frames; | 197 QuicFrames frames; |
198 frames.push_back(frame); | 198 frames.push_back(frame); |
199 scoped_ptr<QuicPacket> packet( | 199 scoped_ptr<QuicPacket> packet( |
200 framer_.ConstructFrameDataPacket(header_, frames).packet); | 200 framer_.ConstructFrameDataPacket(header_, frames).packet); |
201 return framer_.EncryptPacket(header_.packet_sequence_number, *packet); | 201 return framer_.EncryptPacket(header_.packet_sequence_number, *packet); |
202 } | 202 } |
203 | 203 |
204 QuicGuid guid_; | 204 QuicGuid guid_; |
205 QuicFramer framer_; | 205 QuicFramer framer_; |
206 QuicPacketCreator creator_; | |
207 QuicPacketHeader header_; | 206 QuicPacketHeader header_; |
208 BoundNetLog net_log_; | 207 BoundNetLog net_log_; |
209 QuicStreamFrame frame_; | 208 QuicStreamFrame frame_; |
210 scoped_ptr<StaticSocketDataProvider> socket_data_; | 209 scoped_ptr<StaticSocketDataProvider> socket_data_; |
211 std::vector<PacketToWrite> writes_; | 210 std::vector<PacketToWrite> writes_; |
212 }; | 211 }; |
213 | 212 |
214 TEST_F(QuicConnectionHelperTest, GetClock) { | 213 TEST_F(QuicConnectionHelperTest, GetClock) { |
215 EXPECT_EQ(&clock_, helper_->GetClock()); | 214 EXPECT_EQ(&clock_, helper_->GetClock()); |
216 } | 215 } |
(...skipping 25 matching lines...) Expand all Loading... |
242 ASSERT_EQ(1u, runner_->GetPostedTasks().size()); | 241 ASSERT_EQ(1u, runner_->GetPostedTasks().size()); |
243 | 242 |
244 QuicTime::Delta delta(QuicTime::Delta::FromMilliseconds(10)); | 243 QuicTime::Delta delta(QuicTime::Delta::FromMilliseconds(10)); |
245 helper_->SetAckAlarm(delta); | 244 helper_->SetAckAlarm(delta); |
246 | 245 |
247 // Verify that the ack alarm task has been posted. | 246 // Verify that the ack alarm task has been posted. |
248 ASSERT_EQ(2u, runner_->GetPostedTasks().size()); | 247 ASSERT_EQ(2u, runner_->GetPostedTasks().size()); |
249 EXPECT_EQ(base::TimeDelta::FromMicroseconds(delta.ToMicroseconds()), | 248 EXPECT_EQ(base::TimeDelta::FromMicroseconds(delta.ToMicroseconds()), |
250 runner_->GetPostedTasks()[1].delay); | 249 runner_->GetPostedTasks()[1].delay); |
251 | 250 |
252 EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, false, !kHasData)); | 251 EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, false)); |
253 runner_->RunNextTask(); | 252 runner_->RunNextTask(); |
254 EXPECT_EQ(QuicTime::Zero().Add(delta), clock_.ApproximateNow()); | 253 EXPECT_EQ(QuicTime::Zero().Add(delta), clock_.ApproximateNow()); |
255 } | 254 } |
256 | 255 |
257 TEST_F(QuicConnectionHelperTest, ClearAckAlarm) { | 256 TEST_F(QuicConnectionHelperTest, ClearAckAlarm) { |
258 Initialize(); | 257 Initialize(); |
259 | 258 |
260 // Verify that the timeout alarm task has been posted. | 259 // Verify that the timeout alarm task has been posted. |
261 ASSERT_EQ(1u, runner_->GetPostedTasks().size()); | 260 ASSERT_EQ(1u, runner_->GetPostedTasks().size()); |
262 | 261 |
(...skipping 23 matching lines...) Expand all Loading... |
286 ASSERT_EQ(2u, runner_->GetPostedTasks().size()); | 285 ASSERT_EQ(2u, runner_->GetPostedTasks().size()); |
287 | 286 |
288 // The task will execute at delta1, but will not send and ack, | 287 // The task will execute at delta1, but will not send and ack, |
289 // but it will reschedule itself for delta2 | 288 // but it will reschedule itself for delta2 |
290 runner_->RunNextTask(); | 289 runner_->RunNextTask(); |
291 EXPECT_EQ(QuicTime::Zero().Add(delta1), clock_.ApproximateNow()); | 290 EXPECT_EQ(QuicTime::Zero().Add(delta1), clock_.ApproximateNow()); |
292 | 291 |
293 // Verify that the ack alarm task has been re-posted. | 292 // Verify that the ack alarm task has been re-posted. |
294 ASSERT_EQ(2u, runner_->GetPostedTasks().size()); | 293 ASSERT_EQ(2u, runner_->GetPostedTasks().size()); |
295 | 294 |
296 EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, false, !kHasData)); | 295 EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, false)); |
297 runner_->RunNextTask(); | 296 runner_->RunNextTask(); |
298 EXPECT_EQ(QuicTime::Zero().Add(delta2), clock_.ApproximateNow()); | 297 EXPECT_EQ(QuicTime::Zero().Add(delta2), clock_.ApproximateNow()); |
299 } | 298 } |
300 | 299 |
301 TEST_F(QuicConnectionHelperTest, TestRetransmission) { | 300 TEST_F(QuicConnectionHelperTest, TestRetransmission) { |
302 AddWrite(SYNCHRONOUS, ConstructDataPacket(1)); | 301 AddWrite(SYNCHRONOUS, ConstructDataPacket(1)); |
303 AddWrite(SYNCHRONOUS, ConstructDataPacket(2)); | 302 AddWrite(SYNCHRONOUS, ConstructDataPacket(2)); |
304 Initialize(); | 303 Initialize(); |
305 | 304 |
306 QuicTime::Delta kDefaultRetransmissionTime = | 305 QuicTime::Delta kDefaultRetransmissionTime = |
307 QuicTime::Delta::FromMilliseconds(500); | 306 QuicTime::Delta::FromMilliseconds(500); |
308 QuicTime start = clock_.ApproximateNow(); | 307 QuicTime start = clock_.ApproximateNow(); |
309 | 308 |
310 EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, false, kHasData)); | 309 EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, false)); |
| 310 EXPECT_CALL(*send_algorithm_, AbandoningPacket(1, _)); |
311 // Send a packet. | 311 // Send a packet. |
312 connection_->SendStreamData(1, kData, 0, false); | 312 connection_->SendStreamData(1, kData, 0, false); |
313 EXPECT_CALL(*send_algorithm_, SentPacket(_, 2, _, true, kHasData)); | 313 EXPECT_CALL(*send_algorithm_, SentPacket(_, 2, _, true)); |
314 // Since no ack was received, the retransmission alarm will fire and | 314 // Since no ack was received, the retransmission alarm will fire and |
315 // retransmit it. | 315 // retransmit it. |
316 runner_->RunNextTask(); | 316 runner_->RunNextTask(); |
317 | 317 |
318 EXPECT_EQ(kDefaultRetransmissionTime, | 318 EXPECT_EQ(kDefaultRetransmissionTime, |
319 clock_.ApproximateNow().Subtract(start)); | 319 clock_.ApproximateNow().Subtract(start)); |
320 EXPECT_TRUE(AtEof()); | 320 EXPECT_TRUE(AtEof()); |
321 } | 321 } |
322 | 322 |
323 TEST_F(QuicConnectionHelperTest, InitialTimeout) { | 323 TEST_F(QuicConnectionHelperTest, InitialTimeout) { |
324 AddWrite(SYNCHRONOUS, ConstructClosePacket(1, 0)); | 324 AddWrite(SYNCHRONOUS, ConstructClosePacket(1, 0)); |
325 Initialize(); | 325 Initialize(); |
326 | 326 |
327 // Verify that a single task was posted. | 327 // Verify that a single task was posted. |
328 ASSERT_EQ(1u, runner_->GetPostedTasks().size()); | 328 ASSERT_EQ(1u, runner_->GetPostedTasks().size()); |
329 EXPECT_EQ(base::TimeDelta::FromMicroseconds(kDefaultTimeoutUs), | 329 EXPECT_EQ(base::TimeDelta::FromMicroseconds(kDefaultTimeoutUs), |
330 runner_->GetPostedTasks().front().delay); | 330 runner_->GetPostedTasks().front().delay); |
331 | 331 |
332 EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, false, !kHasData)); | 332 EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, false)); |
333 // After we run the next task, we should close the connection. | 333 // After we run the next task, we should close the connection. |
334 EXPECT_CALL(visitor_, ConnectionClose(QUIC_CONNECTION_TIMED_OUT, false)); | 334 EXPECT_CALL(visitor_, ConnectionClose(QUIC_CONNECTION_TIMED_OUT, false)); |
335 | 335 |
336 runner_->RunNextTask(); | 336 runner_->RunNextTask(); |
337 EXPECT_EQ(QuicTime::FromMicroseconds(kDefaultTimeoutUs), | 337 EXPECT_EQ(QuicTime::FromMicroseconds(kDefaultTimeoutUs), |
338 clock_.ApproximateNow()); | 338 clock_.ApproximateNow()); |
339 EXPECT_FALSE(connection_->connected()); | 339 EXPECT_FALSE(connection_->connected()); |
340 EXPECT_TRUE(AtEof()); | 340 EXPECT_TRUE(AtEof()); |
341 } | 341 } |
342 | 342 |
(...skipping 24 matching lines...) Expand all Loading... |
367 AddWrite(SYNCHRONOUS, ConstructAckPacket(1)); | 367 AddWrite(SYNCHRONOUS, ConstructAckPacket(1)); |
368 AddWrite(SYNCHRONOUS, ConstructClosePacket(2, 1)); | 368 AddWrite(SYNCHRONOUS, ConstructClosePacket(2, 1)); |
369 Initialize(); | 369 Initialize(); |
370 | 370 |
371 EXPECT_TRUE(connection_->connected()); | 371 EXPECT_TRUE(connection_->connected()); |
372 EXPECT_EQ(0u, clock_.ApproximateNow().ToMicroseconds()); | 372 EXPECT_EQ(0u, clock_.ApproximateNow().ToMicroseconds()); |
373 | 373 |
374 // When we send a packet, the timeout will change to 5000 + kDefaultTimeout. | 374 // When we send a packet, the timeout will change to 5000 + kDefaultTimeout. |
375 clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(5000)); | 375 clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(5000)); |
376 EXPECT_EQ(5000u, clock_.ApproximateNow().ToMicroseconds()); | 376 EXPECT_EQ(5000u, clock_.ApproximateNow().ToMicroseconds()); |
377 EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, false, !kHasData)); | 377 EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, false)); |
378 | 378 |
379 // Send an ack so we don't set the retransmission alarm. | 379 // Send an ack so we don't set the retransmission alarm. |
380 connection_->SendAck(); | 380 connection_->SendAck(); |
381 | 381 |
382 // The original alarm will fire. We should not time out because we had a | 382 // The original alarm will fire. We should not time out because we had a |
383 // network event at t=5000. The alarm will reregister. | 383 // network event at t=5000. The alarm will reregister. |
384 runner_->RunNextTask(); | 384 runner_->RunNextTask(); |
385 | 385 |
386 EXPECT_EQ(QuicTime::FromMicroseconds(kDefaultTimeoutUs), | 386 EXPECT_EQ(QuicTime::FromMicroseconds(kDefaultTimeoutUs), |
387 clock_.ApproximateNow()); | 387 clock_.ApproximateNow()); |
388 EXPECT_TRUE(connection_->connected()); | 388 EXPECT_TRUE(connection_->connected()); |
389 | 389 |
390 // This time, we should time out. | 390 // This time, we should time out. |
391 EXPECT_CALL(visitor_, ConnectionClose(QUIC_CONNECTION_TIMED_OUT, false)); | 391 EXPECT_CALL(visitor_, ConnectionClose(QUIC_CONNECTION_TIMED_OUT, false)); |
392 EXPECT_CALL(*send_algorithm_, SentPacket(_, 2, _, false, !kHasData)); | 392 EXPECT_CALL(*send_algorithm_, SentPacket(_, 2, _, false)); |
393 runner_->RunNextTask(); | 393 runner_->RunNextTask(); |
394 EXPECT_EQ(kDefaultTimeoutUs + 5000, clock_.ApproximateNow().ToMicroseconds()); | 394 EXPECT_EQ(kDefaultTimeoutUs + 5000, clock_.ApproximateNow().ToMicroseconds()); |
395 EXPECT_FALSE(connection_->connected()); | 395 EXPECT_FALSE(connection_->connected()); |
396 EXPECT_TRUE(AtEof()); | 396 EXPECT_TRUE(AtEof()); |
397 } | 397 } |
398 | 398 |
399 TEST_F(QuicConnectionHelperTest, SendSchedulerDelayThenSend) { | 399 TEST_F(QuicConnectionHelperTest, SendSchedulerDelayThenSend) { |
400 AddWrite(SYNCHRONOUS, ConstructDataPacket(1)); | 400 AddWrite(SYNCHRONOUS, ConstructDataPacket(1)); |
401 Initialize(); | 401 Initialize(); |
402 | 402 |
403 // Test that if we send a packet with a delay, it ends up queued. | 403 // Test that if we send a packet with a delay, it ends up queued. |
404 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, false)).WillOnce( | 404 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, false, _)).WillOnce( |
405 testing::Return(QuicTime::Delta::FromMicroseconds(1))); | 405 testing::Return(QuicTime::Delta::FromMicroseconds(1))); |
406 | 406 |
407 QuicPacket* packet = ConstructRawDataPacket(1); | 407 QuicPacket* packet = ConstructRawDataPacket(1); |
408 connection_->SendOrQueuePacket(1, packet, 0, kHasData); | 408 connection_->SendOrQueuePacket(1, packet, 0, kHasData); |
409 EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, false, kHasData)); | 409 EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, false)); |
410 EXPECT_EQ(1u, connection_->NumQueuedPackets()); | 410 EXPECT_EQ(1u, connection_->NumQueuedPackets()); |
411 | 411 |
412 // Advance the clock to fire the alarm, and configure the scheduler | 412 // Advance the clock to fire the alarm, and configure the scheduler |
413 // to permit the packet to be sent. | 413 // to permit the packet to be sent. |
414 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, false)).WillOnce( | 414 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, false, _)).WillRepeatedly( |
415 testing::Return(QuicTime::Delta::Zero())); | 415 testing::Return(QuicTime::Delta::Zero())); |
416 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(testing::Return(true)); | 416 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(testing::Return(true)); |
417 runner_->RunNextTask(); | 417 runner_->RunNextTask(); |
418 EXPECT_EQ(0u, connection_->NumQueuedPackets()); | 418 EXPECT_EQ(0u, connection_->NumQueuedPackets()); |
419 EXPECT_TRUE(AtEof()); | 419 EXPECT_TRUE(AtEof()); |
420 } | 420 } |
421 | 421 |
422 } // namespace test | 422 } // namespace test |
423 } // namespace net | 423 } // namespace net |
OLD | NEW |