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.h" | 5 #include "net/quic/quic_connection.h" |
6 | 6 |
7 #include <ostream> | 7 #include <ostream> |
8 | 8 |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
232 DISALLOW_COPY_AND_ASSIGN(TestConnectionHelper); | 232 DISALLOW_COPY_AND_ASSIGN(TestConnectionHelper); |
233 }; | 233 }; |
234 | 234 |
235 class TestPacketWriter : public QuicPacketWriter { | 235 class TestPacketWriter : public QuicPacketWriter { |
236 public: | 236 public: |
237 TestPacketWriter(QuicVersion version, MockClock* clock) | 237 TestPacketWriter(QuicVersion version, MockClock* clock) |
238 : version_(version), | 238 : version_(version), |
239 framer_(SupportedVersions(version_)), | 239 framer_(SupportedVersions(version_)), |
240 last_packet_size_(0), | 240 last_packet_size_(0), |
241 write_blocked_(false), | 241 write_blocked_(false), |
| 242 write_should_fail_(false), |
242 block_on_next_write_(false), | 243 block_on_next_write_(false), |
243 is_write_blocked_data_buffered_(false), | 244 is_write_blocked_data_buffered_(false), |
244 final_bytes_of_last_packet_(0), | 245 final_bytes_of_last_packet_(0), |
245 final_bytes_of_previous_packet_(0), | 246 final_bytes_of_previous_packet_(0), |
246 use_tagging_decrypter_(false), | 247 use_tagging_decrypter_(false), |
247 packets_write_attempts_(0), | 248 packets_write_attempts_(0), |
248 clock_(clock), | 249 clock_(clock), |
249 write_pause_time_delta_(QuicTime::Delta::Zero()), | 250 write_pause_time_delta_(QuicTime::Delta::Zero()), |
250 max_packet_size_(kMaxPacketSize) {} | 251 max_packet_size_(kMaxPacketSize) {} |
251 | 252 |
(...skipping 15 matching lines...) Expand all Loading... |
267 framer_.framer()->SetDecrypter(ENCRYPTION_NONE, new TaggingDecrypter); | 268 framer_.framer()->SetDecrypter(ENCRYPTION_NONE, new TaggingDecrypter); |
268 } | 269 } |
269 EXPECT_TRUE(framer_.ProcessPacket(packet)); | 270 EXPECT_TRUE(framer_.ProcessPacket(packet)); |
270 if (block_on_next_write_) { | 271 if (block_on_next_write_) { |
271 write_blocked_ = true; | 272 write_blocked_ = true; |
272 block_on_next_write_ = false; | 273 block_on_next_write_ = false; |
273 } | 274 } |
274 if (IsWriteBlocked()) { | 275 if (IsWriteBlocked()) { |
275 return WriteResult(WRITE_STATUS_BLOCKED, -1); | 276 return WriteResult(WRITE_STATUS_BLOCKED, -1); |
276 } | 277 } |
| 278 |
| 279 if (ShouldWriteFail()) { |
| 280 return WriteResult(WRITE_STATUS_ERROR, 0); |
| 281 } |
| 282 |
277 last_packet_size_ = packet.length(); | 283 last_packet_size_ = packet.length(); |
278 | 284 |
279 if (!write_pause_time_delta_.IsZero()) { | 285 if (!write_pause_time_delta_.IsZero()) { |
280 clock_->AdvanceTime(write_pause_time_delta_); | 286 clock_->AdvanceTime(write_pause_time_delta_); |
281 } | 287 } |
282 return WriteResult(WRITE_STATUS_OK, last_packet_size_); | 288 return WriteResult(WRITE_STATUS_OK, last_packet_size_); |
283 } | 289 } |
284 | 290 |
285 bool IsWriteBlockedDataBuffered() const override { | 291 bool IsWriteBlockedDataBuffered() const override { |
286 return is_write_blocked_data_buffered_; | 292 return is_write_blocked_data_buffered_; |
287 } | 293 } |
288 | 294 |
| 295 bool ShouldWriteFail() { return write_should_fail_; } |
| 296 |
289 bool IsWriteBlocked() const override { return write_blocked_; } | 297 bool IsWriteBlocked() const override { return write_blocked_; } |
290 | 298 |
291 void SetWritable() override { write_blocked_ = false; } | 299 void SetWritable() override { write_blocked_ = false; } |
292 | 300 |
| 301 void SetShouldWriteFail() { write_should_fail_ = true; } |
| 302 |
293 QuicByteCount GetMaxPacketSize( | 303 QuicByteCount GetMaxPacketSize( |
294 const IPEndPoint& /*peer_address*/) const override { | 304 const IPEndPoint& /*peer_address*/) const override { |
295 return max_packet_size_; | 305 return max_packet_size_; |
296 } | 306 } |
297 | 307 |
298 void BlockOnNextWrite() { block_on_next_write_ = true; } | 308 void BlockOnNextWrite() { block_on_next_write_ = true; } |
299 | 309 |
300 // Sets the amount of time that the writer should before the actual write. | 310 // Sets the amount of time that the writer should before the actual write. |
301 void SetWritePauseTimeDelta(QuicTime::Delta delta) { | 311 void SetWritePauseTimeDelta(QuicTime::Delta delta) { |
302 write_pause_time_delta_ = delta; | 312 write_pause_time_delta_ = delta; |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
376 | 386 |
377 void set_max_packet_size(QuicByteCount max_packet_size) { | 387 void set_max_packet_size(QuicByteCount max_packet_size) { |
378 max_packet_size_ = max_packet_size; | 388 max_packet_size_ = max_packet_size; |
379 } | 389 } |
380 | 390 |
381 private: | 391 private: |
382 QuicVersion version_; | 392 QuicVersion version_; |
383 SimpleQuicFramer framer_; | 393 SimpleQuicFramer framer_; |
384 size_t last_packet_size_; | 394 size_t last_packet_size_; |
385 bool write_blocked_; | 395 bool write_blocked_; |
| 396 bool write_should_fail_; |
386 bool block_on_next_write_; | 397 bool block_on_next_write_; |
387 bool is_write_blocked_data_buffered_; | 398 bool is_write_blocked_data_buffered_; |
388 uint32 final_bytes_of_last_packet_; | 399 uint32 final_bytes_of_last_packet_; |
389 uint32 final_bytes_of_previous_packet_; | 400 uint32 final_bytes_of_previous_packet_; |
390 bool use_tagging_decrypter_; | 401 bool use_tagging_decrypter_; |
391 uint32 packets_write_attempts_; | 402 uint32 packets_write_attempts_; |
392 MockClock *clock_; | 403 MockClock *clock_; |
393 // If non-zero, the clock will pause during WritePacket for this amount of | 404 // If non-zero, the clock will pause during WritePacket for this amount of |
394 // time. | 405 // time. |
395 QuicTime::Delta write_pause_time_delta_; | 406 QuicTime::Delta write_pause_time_delta_; |
(...skipping 3246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3642 | 3653 |
3643 TEST_P(QuicConnectionTest, SendScheduler) { | 3654 TEST_P(QuicConnectionTest, SendScheduler) { |
3644 // Test that if we send a packet without delay, it is not queued. | 3655 // Test that if we send a packet without delay, it is not queued. |
3645 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); | 3656 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
3646 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); | 3657 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); |
3647 connection_.SendPacket(ENCRYPTION_NONE, 1, packet, kTestEntropyHash, | 3658 connection_.SendPacket(ENCRYPTION_NONE, 1, packet, kTestEntropyHash, |
3648 HAS_RETRANSMITTABLE_DATA, false, false); | 3659 HAS_RETRANSMITTABLE_DATA, false, false); |
3649 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 3660 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
3650 } | 3661 } |
3651 | 3662 |
| 3663 TEST_P(QuicConnectionTest, FailToSendFirstPacket) { |
| 3664 // Test that the connection does not crash when it fails to send the first |
| 3665 // packet at which point self_address_ might be uninitialized. |
| 3666 EXPECT_CALL(visitor_, OnConnectionClosed(_, _)).Times(1); |
| 3667 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
| 3668 writer_->SetShouldWriteFail(); |
| 3669 connection_.SendPacket(ENCRYPTION_NONE, 1, packet, kTestEntropyHash, |
| 3670 HAS_RETRANSMITTABLE_DATA, false, false); |
| 3671 } |
| 3672 |
3652 TEST_P(QuicConnectionTest, SendSchedulerEAGAIN) { | 3673 TEST_P(QuicConnectionTest, SendSchedulerEAGAIN) { |
3653 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); | 3674 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
3654 BlockOnNextWrite(); | 3675 BlockOnNextWrite(); |
3655 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _)).Times(0); | 3676 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _)).Times(0); |
3656 connection_.SendPacket(ENCRYPTION_NONE, 1, packet, kTestEntropyHash, | 3677 connection_.SendPacket(ENCRYPTION_NONE, 1, packet, kTestEntropyHash, |
3657 HAS_RETRANSMITTABLE_DATA, false, false); | 3678 HAS_RETRANSMITTABLE_DATA, false, false); |
3658 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 3679 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
3659 } | 3680 } |
3660 | 3681 |
3661 TEST_P(QuicConnectionTest, TestQueueLimitsOnSendStreamData) { | 3682 TEST_P(QuicConnectionTest, TestQueueLimitsOnSendStreamData) { |
(...skipping 1143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4805 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); | 4826 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
4806 connection_.SendGoAway(QUIC_PEER_GOING_AWAY, kHeadersStreamId, "Going Away."); | 4827 connection_.SendGoAway(QUIC_PEER_GOING_AWAY, kHeadersStreamId, "Going Away."); |
4807 EXPECT_TRUE(connection_.goaway_sent()); | 4828 EXPECT_TRUE(connection_.goaway_sent()); |
4808 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0); | 4829 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0); |
4809 connection_.SendGoAway(QUIC_PEER_GOING_AWAY, kHeadersStreamId, "Going Away."); | 4830 connection_.SendGoAway(QUIC_PEER_GOING_AWAY, kHeadersStreamId, "Going Away."); |
4810 } | 4831 } |
4811 | 4832 |
4812 } // namespace | 4833 } // namespace |
4813 } // namespace test | 4834 } // namespace test |
4814 } // namespace net | 4835 } // namespace net |
OLD | NEW |