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

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

Issue 138843003: Eliminate separate boolean tracking socket writeability in (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 11 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/test_tools/quic_connection_peer.h » ('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.h" 5 #include "net/quic/quic_connection.h"
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/stl_util.h" 9 #include "base/stl_util.h"
10 #include "net/base/net_errors.h" 10 #include "net/base/net_errors.h"
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
267 MockRandom* random_generator_; 267 MockRandom* random_generator_;
268 268
269 DISALLOW_COPY_AND_ASSIGN(TestConnectionHelper); 269 DISALLOW_COPY_AND_ASSIGN(TestConnectionHelper);
270 }; 270 };
271 271
272 class TestPacketWriter : public QuicPacketWriter { 272 class TestPacketWriter : public QuicPacketWriter {
273 public: 273 public:
274 TestPacketWriter() 274 TestPacketWriter()
275 : last_packet_size_(0), 275 : last_packet_size_(0),
276 write_blocked_(false), 276 write_blocked_(false),
277 block_next_write_(false),
277 is_write_blocked_data_buffered_(false), 278 is_write_blocked_data_buffered_(false),
278 is_server_(true), 279 is_server_(true),
279 final_bytes_of_last_packet_(0), 280 final_bytes_of_last_packet_(0),
280 final_bytes_of_previous_packet_(0), 281 final_bytes_of_previous_packet_(0),
281 use_tagging_decrypter_(false), 282 use_tagging_decrypter_(false),
282 packets_write_attempts_(0) { 283 packets_write_attempts_(0) {
283 } 284 }
284 285
285 // QuicPacketWriter 286 // QuicPacketWriter interface
286 virtual WriteResult WritePacket( 287 virtual WriteResult WritePacket(
287 const char* buffer, size_t buf_len, 288 const char* buffer, size_t buf_len,
288 const IPAddressNumber& self_address, 289 const IPAddressNumber& self_address,
289 const IPEndPoint& peer_address, 290 const IPEndPoint& peer_address,
290 QuicBlockedWriterInterface* blocked_writer) OVERRIDE { 291 QuicBlockedWriterInterface* blocked_writer) OVERRIDE {
291 QuicEncryptedPacket packet(buffer, buf_len); 292 QuicEncryptedPacket packet(buffer, buf_len);
292 ++packets_write_attempts_; 293 ++packets_write_attempts_;
293 294
294 if (packet.length() >= sizeof(final_bytes_of_last_packet_)) { 295 if (packet.length() >= sizeof(final_bytes_of_last_packet_)) {
295 final_bytes_of_previous_packet_ = final_bytes_of_last_packet_; 296 final_bytes_of_previous_packet_ = final_bytes_of_last_packet_;
296 memcpy(&final_bytes_of_last_packet_, packet.data() + packet.length() - 4, 297 memcpy(&final_bytes_of_last_packet_, packet.data() + packet.length() - 4,
297 sizeof(final_bytes_of_last_packet_)); 298 sizeof(final_bytes_of_last_packet_));
298 } 299 }
299 300
300 QuicFramer framer(QuicSupportedVersions(), QuicTime::Zero(), !is_server_); 301 QuicFramer framer(QuicSupportedVersions(), QuicTime::Zero(), !is_server_);
301 if (use_tagging_decrypter_) { 302 if (use_tagging_decrypter_) {
302 framer.SetDecrypter(new TaggingDecrypter); 303 framer.SetDecrypter(new TaggingDecrypter);
303 } 304 }
304 visitor_.Reset(); 305 visitor_.Reset();
305 framer.set_visitor(&visitor_); 306 framer.set_visitor(&visitor_);
306 EXPECT_TRUE(framer.ProcessPacket(packet)); 307 EXPECT_TRUE(framer.ProcessPacket(packet));
308 if (block_next_write_) {
309 write_blocked_ = true;
310 block_next_write_ = false;
311 }
307 if (IsWriteBlocked()) { 312 if (IsWriteBlocked()) {
308 return WriteResult(WRITE_STATUS_BLOCKED, -1); 313 return WriteResult(WRITE_STATUS_BLOCKED, -1);
309 } 314 }
310 last_packet_size_ = packet.length(); 315 last_packet_size_ = packet.length();
311 return WriteResult(WRITE_STATUS_OK, last_packet_size_); 316 return WriteResult(WRITE_STATUS_OK, last_packet_size_);
312 } 317 }
313 318
314 virtual bool IsWriteBlockedDataBuffered() const OVERRIDE { 319 virtual bool IsWriteBlockedDataBuffered() const OVERRIDE {
315 return is_write_blocked_data_buffered_; 320 return is_write_blocked_data_buffered_;
316 } 321 }
317 322
318 virtual bool IsWriteBlocked() const OVERRIDE { return write_blocked_; } 323 virtual bool IsWriteBlocked() const OVERRIDE { return write_blocked_; }
319 324
320 virtual void SetWritable() OVERRIDE { write_blocked_ = false; } 325 virtual void SetWritable() OVERRIDE { write_blocked_ = false; }
321 326
322 void SetWriteBlocked() { write_blocked_ = true; } 327 void BlockNextWrite() { block_next_write_ = true; }
323 328
324 // Resets the visitor's state by clearing out the headers and frames. 329 // Resets the visitor's state by clearing out the headers and frames.
325 void Reset() { 330 void Reset() {
326 visitor_.Reset(); 331 visitor_.Reset();
327 } 332 }
328 333
329 QuicPacketHeader* header() { return visitor_.header(); } 334 QuicPacketHeader* header() { return visitor_.header(); }
330 335
331 size_t frame_count() const { return visitor_.frame_count(); } 336 size_t frame_count() const { return visitor_.frame_count(); }
332 337
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 void use_tagging_decrypter() { 373 void use_tagging_decrypter() {
369 use_tagging_decrypter_ = true; 374 use_tagging_decrypter_ = true;
370 } 375 }
371 376
372 uint32 packets_write_attempts() { return packets_write_attempts_; } 377 uint32 packets_write_attempts() { return packets_write_attempts_; }
373 378
374 private: 379 private:
375 FramerVisitorCapturingFrames visitor_; 380 FramerVisitorCapturingFrames visitor_;
376 size_t last_packet_size_; 381 size_t last_packet_size_;
377 bool write_blocked_; 382 bool write_blocked_;
383 bool block_next_write_;
378 bool is_write_blocked_data_buffered_; 384 bool is_write_blocked_data_buffered_;
379 bool is_server_; 385 bool is_server_;
380 uint32 final_bytes_of_last_packet_; 386 uint32 final_bytes_of_last_packet_;
381 uint32 final_bytes_of_previous_packet_; 387 uint32 final_bytes_of_previous_packet_;
382 bool use_tagging_decrypter_; 388 bool use_tagging_decrypter_;
383 uint32 packets_write_attempts_; 389 uint32 packets_write_attempts_;
384 390
385 DISALLOW_COPY_AND_ASSIGN(TestPacketWriter); 391 DISALLOW_COPY_AND_ASSIGN(TestPacketWriter);
386 }; 392 };
387 393
(...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after
817 EXPECT_THAT(frame->received_info.missing_packets, Contains(arrived)); 823 EXPECT_THAT(frame->received_info.missing_packets, Contains(arrived));
818 frame->received_info.missing_packets.erase(arrived); 824 frame->received_info.missing_packets.erase(arrived);
819 frame->received_info.entropy_hash ^= 825 frame->received_info.entropy_hash ^=
820 QuicConnectionPeer::GetSentEntropyHash(&connection_, arrived); 826 QuicConnectionPeer::GetSentEntropyHash(&connection_, arrived);
821 if (arrived > 1) { 827 if (arrived > 1) {
822 frame->received_info.entropy_hash ^= 828 frame->received_info.entropy_hash ^=
823 QuicConnectionPeer::GetSentEntropyHash(&connection_, arrived - 1); 829 QuicConnectionPeer::GetSentEntropyHash(&connection_, arrived - 1);
824 } 830 }
825 } 831 }
826 832
833 void TriggerConnectionClose() {
834 // Send an erroneous packet to close the connection.
835 EXPECT_CALL(visitor_,
836 OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, false));
837 // Call ProcessDataPacket rather than ProcessPacket, as we should not get a
838 // packet call to the visitor.
839 ProcessDataPacket(6000, 0, !kEntropyFlag);
840 EXPECT_FALSE(
841 QuicConnectionPeer::GetConnectionClosePacket(&connection_) == NULL);
842 }
843
827 QuicGuid guid_; 844 QuicGuid guid_;
828 QuicFramer framer_; 845 QuicFramer framer_;
829 QuicPacketCreator creator_; 846 QuicPacketCreator creator_;
830 MockEntropyCalculator entropy_calculator_; 847 MockEntropyCalculator entropy_calculator_;
831 848
832 MockSendAlgorithm* send_algorithm_; 849 MockSendAlgorithm* send_algorithm_;
833 TestReceiveAlgorithm* receive_algorithm_; 850 TestReceiveAlgorithm* receive_algorithm_;
834 MockClock clock_; 851 MockClock clock_;
835 MockRandom random_generator_; 852 MockRandom random_generator_;
836 scoped_ptr<TestConnectionHelper> helper_; 853 scoped_ptr<TestConnectionHelper> helper_;
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
937 creator_.set_sequence_number(5); 954 creator_.set_sequence_number(5);
938 QuicAckFrame frame = InitAckFrame(0, 4); 955 QuicAckFrame frame = InitAckFrame(0, 4);
939 ProcessAckPacket(&frame); 956 ProcessAckPacket(&frame);
940 957
941 // Force an ack to be sent. 958 // Force an ack to be sent.
942 SendAckPacketToPeer(); 959 SendAckPacketToPeer();
943 EXPECT_TRUE(IsMissing(4)); 960 EXPECT_TRUE(IsMissing(4));
944 } 961 }
945 962
946 TEST_F(QuicConnectionTest, RejectPacketTooFarOut) { 963 TEST_F(QuicConnectionTest, RejectPacketTooFarOut) {
964 EXPECT_CALL(visitor_,
965 OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, false));
947 // Call ProcessDataPacket rather than ProcessPacket, as we should not get a 966 // Call ProcessDataPacket rather than ProcessPacket, as we should not get a
948 // packet call to the visitor. 967 // packet call to the visitor.
949 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, false));
950 ProcessDataPacket(6000, 0, !kEntropyFlag); 968 ProcessDataPacket(6000, 0, !kEntropyFlag);
969 EXPECT_FALSE(
970 QuicConnectionPeer::GetConnectionClosePacket(&connection_) == NULL);
951 } 971 }
952 972
953 TEST_F(QuicConnectionTest, TruncatedAck) { 973 TEST_F(QuicConnectionTest, TruncatedAck) {
954 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); 974 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
955 QuicPacketSequenceNumber num_packets = 256 * 2 + 1; 975 QuicPacketSequenceNumber num_packets = 256 * 2 + 1;
956 for (QuicPacketSequenceNumber i = 0; i < num_packets; ++i) { 976 for (QuicPacketSequenceNumber i = 0; i < num_packets; ++i) {
957 SendStreamDataToPeer(1, "foo", i * 3, !kFin, NULL); 977 SendStreamDataToPeer(1, "foo", i * 3, !kFin, NULL);
958 } 978 }
959 979
960 QuicAckFrame frame = InitAckFrame(num_packets, 1); 980 QuicAckFrame frame = InitAckFrame(num_packets, 1);
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
1314 // All packets carry version info till version is negotiated. 1334 // All packets carry version info till version is negotiated.
1315 size_t payload_length; 1335 size_t payload_length;
1316 connection_.options()->max_packet_length = 1336 connection_.options()->max_packet_length =
1317 GetPacketLengthForOneStream( 1337 GetPacketLengthForOneStream(
1318 connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER, 1338 connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER,
1319 IN_FEC_GROUP, &payload_length); 1339 IN_FEC_GROUP, &payload_length);
1320 // And send FEC every two packets. 1340 // And send FEC every two packets.
1321 connection_.options()->max_packets_per_fec_group = 2; 1341 connection_.options()->max_packets_per_fec_group = 2;
1322 1342
1323 EXPECT_EQ(0u, connection_.NumQueuedPackets()); 1343 EXPECT_EQ(0u, connection_.NumQueuedPackets());
1324 writer_->SetWriteBlocked(); 1344 writer_->BlockNextWrite();
1325 const string payload(payload_length, 'a'); 1345 const string payload(payload_length, 'a');
1326 connection_.SendStreamDataWithString(1, payload, 0, !kFin, NULL); 1346 connection_.SendStreamDataWithString(1, payload, 0, !kFin, NULL);
1327 EXPECT_FALSE(creator_.ShouldSendFec(true)); 1347 EXPECT_FALSE(creator_.ShouldSendFec(true));
1328 // Expect the first data packet and the fec packet to be queued. 1348 // Expect the first data packet and the fec packet to be queued.
1329 EXPECT_EQ(2u, connection_.NumQueuedPackets()); 1349 EXPECT_EQ(2u, connection_.NumQueuedPackets());
1330 } 1350 }
1331 1351
1332 TEST_F(QuicConnectionTest, AbandonFECFromCongestionWindow) { 1352 TEST_F(QuicConnectionTest, AbandonFECFromCongestionWindow) {
1333 connection_.options()->max_packets_per_fec_group = 1; 1353 connection_.options()->max_packets_per_fec_group = 1;
1334 // 1 Data and 1 FEC packet. 1354 // 1 Data and 1 FEC packet.
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
1584 EXPECT_EQ(1u, frame.stream_id); 1604 EXPECT_EQ(1u, frame.stream_id);
1585 EXPECT_EQ("ABCD", string(static_cast<char*> 1605 EXPECT_EQ("ABCD", string(static_cast<char*>
1586 (frame.data.iovec()[0].iov_base), 1606 (frame.data.iovec()[0].iov_base),
1587 (frame.data.iovec()[0].iov_len))); 1607 (frame.data.iovec()[0].iov_len)));
1588 } 1608 }
1589 1609
1590 TEST_F(QuicConnectionTest, FramePackingSendvQueued) { 1610 TEST_F(QuicConnectionTest, FramePackingSendvQueued) {
1591 // Try to send two stream frames in 1 packet by using writev. 1611 // Try to send two stream frames in 1 packet by using writev.
1592 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, NOT_RETRANSMISSION, _)); 1612 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, NOT_RETRANSMISSION, _));
1593 1613
1594 writer_->SetWriteBlocked(); 1614 writer_->BlockNextWrite();
1595 char data[] = "ABCD"; 1615 char data[] = "ABCD";
1596 IOVector data_iov; 1616 IOVector data_iov;
1597 data_iov.AppendNoCoalesce(data, 2); 1617 data_iov.AppendNoCoalesce(data, 2);
1598 data_iov.AppendNoCoalesce(data + 2, 2); 1618 data_iov.AppendNoCoalesce(data + 2, 2);
1599 connection_.SendStreamData(1, data_iov, 0, !kFin, NULL); 1619 connection_.SendStreamData(1, data_iov, 0, !kFin, NULL);
1600 1620
1601 EXPECT_EQ(1u, connection_.NumQueuedPackets()); 1621 EXPECT_EQ(1u, connection_.NumQueuedPackets());
1602 EXPECT_TRUE(connection_.HasQueuedData()); 1622 EXPECT_TRUE(connection_.HasQueuedData());
1603 1623
1604 // Attempt to send all packets, but since we're actually still
1605 // blocked, they should all remain queued.
1606 EXPECT_FALSE(connection_.OnCanWrite());
1607 EXPECT_EQ(1u, connection_.NumQueuedPackets());
1608
1609 // Unblock the writes and actually send. 1624 // Unblock the writes and actually send.
1610 writer_->SetWritable(); 1625 writer_->SetWritable();
1611 EXPECT_TRUE(connection_.OnCanWrite()); 1626 EXPECT_TRUE(connection_.OnCanWrite());
1612 EXPECT_EQ(0u, connection_.NumQueuedPackets()); 1627 EXPECT_EQ(0u, connection_.NumQueuedPackets());
1613 1628
1614 // Parse the last packet and ensure it's one stream frame from one stream. 1629 // Parse the last packet and ensure it's one stream frame from one stream.
1615 EXPECT_EQ(1u, writer_->frame_count()); 1630 EXPECT_EQ(1u, writer_->frame_count());
1616 EXPECT_EQ(1u, writer_->stream_frames()->size()); 1631 EXPECT_EQ(1u, writer_->stream_frames()->size());
1617 EXPECT_EQ(1u, (*writer_->stream_frames())[0].stream_id); 1632 EXPECT_EQ(1u, (*writer_->stream_frames())[0].stream_id);
1618 } 1633 }
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
1708 ProcessAckPacket(&ack_one); 1723 ProcessAckPacket(&ack_one);
1709 ProcessAckPacket(&ack_one); 1724 ProcessAckPacket(&ack_one);
1710 ProcessAckPacket(&ack_one); 1725 ProcessAckPacket(&ack_one);
1711 1726
1712 // Peer acks up to 3 with two explicitly missing. Two nacks should cause no 1727 // Peer acks up to 3 with two explicitly missing. Two nacks should cause no
1713 // change. 1728 // change.
1714 QuicAckFrame nack_two = InitAckFrame(3, 0); 1729 QuicAckFrame nack_two = InitAckFrame(3, 0);
1715 NackPacket(2, &nack_two); 1730 NackPacket(2, &nack_two);
1716 // The first nack should trigger a fast retransmission, but we'll be 1731 // The first nack should trigger a fast retransmission, but we'll be
1717 // write blocked, so the packet will be queued. 1732 // write blocked, so the packet will be queued.
1718 writer_->SetWriteBlocked(); 1733 writer_->BlockNextWrite();
1719 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); 1734 EXPECT_CALL(*send_algorithm_, UpdateRtt(_));
1720 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)); 1735 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _));
1721 1736
1722 ProcessAckPacket(&nack_two); 1737 ProcessAckPacket(&nack_two);
1723 EXPECT_EQ(1u, connection_.NumQueuedPackets()); 1738 EXPECT_EQ(1u, connection_.NumQueuedPackets());
1724 1739
1725 // Now, ack the previous transmission. 1740 // Now, ack the previous transmission.
1726 QuicAckFrame ack_all = InitAckFrame(3, 0); 1741 QuicAckFrame ack_all = InitAckFrame(3, 0);
1727 ProcessAckPacket(&ack_all); 1742 ProcessAckPacket(&ack_all);
1728 1743
(...skipping 29 matching lines...) Expand all
1758 ProcessAckPacket(&frame); 1773 ProcessAckPacket(&frame);
1759 } 1774 }
1760 1775
1761 TEST_F(QuicConnectionTest, QueueAfterTwoRTOs) { 1776 TEST_F(QuicConnectionTest, QueueAfterTwoRTOs) {
1762 for (int i = 0; i < 10; ++i) { 1777 for (int i = 0; i < 10; ++i) {
1763 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); 1778 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
1764 connection_.SendStreamDataWithString(3, "foo", i * 3, !kFin, NULL); 1779 connection_.SendStreamDataWithString(3, "foo", i * 3, !kFin, NULL);
1765 } 1780 }
1766 1781
1767 // Block the congestion window and ensure they're queued. 1782 // Block the congestion window and ensure they're queued.
1768 writer_->SetWriteBlocked(); 1783 writer_->BlockNextWrite();
1769 clock_.AdvanceTime(DefaultRetransmissionTime()); 1784 clock_.AdvanceTime(DefaultRetransmissionTime());
1770 // Only one packet should be retransmitted. 1785 // Only one packet should be retransmitted.
1771 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); 1786 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1772 connection_.GetRetransmissionAlarm()->Fire(); 1787 connection_.GetRetransmissionAlarm()->Fire();
1773 EXPECT_TRUE(connection_.HasQueuedData()); 1788 EXPECT_TRUE(connection_.HasQueuedData());
1774 1789
1775 // Unblock the congestion window. 1790 // Unblock the congestion window.
1776 writer_->SetWritable(); 1791 writer_->SetWritable();
1777 clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds( 1792 clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(
1778 2 * DefaultRetransmissionTime().ToMicroseconds())); 1793 2 * DefaultRetransmissionTime().ToMicroseconds()));
1779 // Retransmit already retransmitted packets event though the sequence number 1794 // Retransmit already retransmitted packets event though the sequence number
1780 // greater than the largest observed. 1795 // greater than the largest observed.
1781 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(10); 1796 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(10);
1782 connection_.GetRetransmissionAlarm()->Fire(); 1797 connection_.GetRetransmissionAlarm()->Fire();
1783 connection_.OnCanWrite(); 1798 connection_.OnCanWrite();
1784 } 1799 }
1785 1800
1786 TEST_F(QuicConnectionTest, WriteBlockedThenSent) { 1801 TEST_F(QuicConnectionTest, WriteBlockedThenSent) {
1787 writer_->SetWriteBlocked(); 1802 writer_->BlockNextWrite();
1803 writer_->set_is_write_blocked_data_buffered(true);
1788 1804
1789 writer_->set_is_write_blocked_data_buffered(true);
1790 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL); 1805 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
1791 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet()); 1806 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet());
1792 1807
1793 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); 1808 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
1794 connection_.OnPacketSent(WriteResult(WRITE_STATUS_OK, 0)); 1809 connection_.OnPacketSent(WriteResult(WRITE_STATUS_OK, 0));
1795 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); 1810 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet());
1796 } 1811 }
1797 1812
1798 TEST_F(QuicConnectionTest, WriteBlockedAckedThenSent) { 1813 TEST_F(QuicConnectionTest, WriteBlockedAckedThenSent) {
1799 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); 1814 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1800 writer_->SetWriteBlocked(); 1815 writer_->BlockNextWrite();
1801 1816
1802 writer_->set_is_write_blocked_data_buffered(true); 1817 writer_->set_is_write_blocked_data_buffered(true);
1803 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL); 1818 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
1804 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet()); 1819 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet());
1805 1820
1806 // Ack the sent packet before the callback returns, which happens in 1821 // Ack the sent packet before the callback returns, which happens in
1807 // rare circumstances with write blocked sockets. 1822 // rare circumstances with write blocked sockets.
1808 QuicAckFrame ack = InitAckFrame(1, 0); 1823 QuicAckFrame ack = InitAckFrame(1, 0);
1809 ProcessAckPacket(&ack); 1824 ProcessAckPacket(&ack);
1810 1825
1811 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0); 1826 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0);
1812 connection_.OnPacketSent(WriteResult(WRITE_STATUS_OK, 0)); 1827 connection_.OnPacketSent(WriteResult(WRITE_STATUS_OK, 0));
1813 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet()); 1828 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet());
1814 } 1829 }
1815 1830
1816 TEST_F(QuicConnectionTest, RetransmitWriteBlockedAckedOriginalThenSent) { 1831 TEST_F(QuicConnectionTest, RetransmitWriteBlockedAckedOriginalThenSent) {
1817 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); 1832 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1818 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL); 1833 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
1819 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); 1834 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet());
1820 1835
1821 writer_->SetWriteBlocked(); 1836 writer_->BlockNextWrite();
1822 writer_->set_is_write_blocked_data_buffered(true); 1837 writer_->set_is_write_blocked_data_buffered(true);
1823 1838
1824 // Simulate the retransmission alarm firing. 1839 // Simulate the retransmission alarm firing.
1825 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _)); 1840 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _));
1826 clock_.AdvanceTime(DefaultRetransmissionTime()); 1841 clock_.AdvanceTime(DefaultRetransmissionTime());
1827 connection_.GetRetransmissionAlarm()->Fire(); 1842 connection_.GetRetransmissionAlarm()->Fire();
1828 1843
1829 // Ack the sent packet before the callback returns, which happens in 1844 // Ack the sent packet before the callback returns, which happens in
1830 // rare circumstances with write blocked sockets. 1845 // rare circumstances with write blocked sockets.
1831 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); 1846 EXPECT_CALL(*send_algorithm_, UpdateRtt(_));
1832 QuicAckFrame ack = InitAckFrame(1, 0); 1847 QuicAckFrame ack = InitAckFrame(1, 0);
1833 ProcessAckPacket(&ack); 1848 ProcessAckPacket(&ack);
1834 1849
1835 connection_.OnPacketSent(WriteResult(WRITE_STATUS_OK, 0)); 1850 connection_.OnPacketSent(WriteResult(WRITE_STATUS_OK, 0));
1836 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); 1851 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet());
1837 } 1852 }
1838 1853
1839 TEST_F(QuicConnectionTest, ResumptionAlarmThenWriteBlocked) { 1854 TEST_F(QuicConnectionTest, ResumptionAlarmWhenWriteBlocked) {
1840 // Set the send and resumption alarm, then block the connection. 1855 // Block the connection.
1856 writer_->BlockNextWrite();
1857 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL);
1858 EXPECT_EQ(1u, writer_->packets_write_attempts());
1859 EXPECT_TRUE(writer_->IsWriteBlocked());
1860
1861 // Set the send and resumption alarms. Fire the alarms and ensure they don't
1862 // attempt to write.
1841 connection_.GetResumeWritesAlarm()->Set(clock_.ApproximateNow()); 1863 connection_.GetResumeWritesAlarm()->Set(clock_.ApproximateNow());
1842 connection_.GetSendAlarm()->Set(clock_.ApproximateNow()); 1864 connection_.GetSendAlarm()->Set(clock_.ApproximateNow());
1843 QuicConnectionPeer::SetIsWriteBlocked(&connection_, true);
1844
1845 // Fire the alarms and ensure the connection is still write blocked.
1846 connection_.GetResumeWritesAlarm()->Fire(); 1865 connection_.GetResumeWritesAlarm()->Fire();
1847 connection_.GetSendAlarm()->Fire(); 1866 connection_.GetSendAlarm()->Fire();
1848 EXPECT_TRUE(QuicConnectionPeer::IsWriteBlocked(&connection_)); 1867 EXPECT_TRUE(writer_->IsWriteBlocked());
1868 EXPECT_EQ(1u, writer_->packets_write_attempts());
1849 } 1869 }
1850 1870
1851 TEST_F(QuicConnectionTest, LimitPacketsPerNack) { 1871 TEST_F(QuicConnectionTest, LimitPacketsPerNack) {
1852 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); 1872 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1853 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); 1873 EXPECT_CALL(*send_algorithm_, UpdateRtt(_));
1854 EXPECT_CALL(*send_algorithm_, OnPacketAcked(15, _)).Times(1); 1874 EXPECT_CALL(*send_algorithm_, OnPacketAcked(15, _)).Times(1);
1855 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(4); 1875 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(4);
1856 int offset = 0; 1876 int offset = 0;
1857 // Send packets 1 to 15. 1877 // Send packets 1 to 15.
1858 for (int i = 0; i < 15; ++i) { 1878 for (int i = 0; i < 15; ++i) {
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after
2233 ASSERT_NE(0u, nack_sequence_number); 2253 ASSERT_NE(0u, nack_sequence_number);
2234 EXPECT_FALSE(QuicConnectionPeer::IsSavedForRetransmission( 2254 EXPECT_FALSE(QuicConnectionPeer::IsSavedForRetransmission(
2235 &connection_, rto_sequence_number)); 2255 &connection_, rto_sequence_number));
2236 ASSERT_TRUE(QuicConnectionPeer::IsSavedForRetransmission( 2256 ASSERT_TRUE(QuicConnectionPeer::IsSavedForRetransmission(
2237 &connection_, nack_sequence_number)); 2257 &connection_, nack_sequence_number));
2238 EXPECT_TRUE(QuicConnectionPeer::IsRetransmission( 2258 EXPECT_TRUE(QuicConnectionPeer::IsRetransmission(
2239 &connection_, nack_sequence_number)); 2259 &connection_, nack_sequence_number));
2240 } 2260 }
2241 2261
2242 TEST_F(QuicConnectionTest, SetRTOAfterWritingToSocket) { 2262 TEST_F(QuicConnectionTest, SetRTOAfterWritingToSocket) {
2243 writer_->SetWriteBlocked(); 2263 writer_->BlockNextWrite();
2244 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL); 2264 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
2245 // Make sure that RTO is not started when the packet is queued. 2265 // Make sure that RTO is not started when the packet is queued.
2246 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet()); 2266 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet());
2247 2267
2248 // Test that RTO is started once we write to the socket. 2268 // Test that RTO is started once we write to the socket.
2249 writer_->SetWritable(); 2269 writer_->SetWritable();
2250 connection_.OnCanWrite(); 2270 connection_.OnCanWrite();
2251 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); 2271 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet());
2252 } 2272 }
2253 2273
(...skipping 30 matching lines...) Expand all
2284 // than previously. 2304 // than previously.
2285 EXPECT_TRUE(retransmission_alarm->IsSet()); 2305 EXPECT_TRUE(retransmission_alarm->IsSet());
2286 QuicTime next_rto_time = retransmission_alarm->deadline(); 2306 QuicTime next_rto_time = retransmission_alarm->deadline();
2287 QuicTime expected_rto_time = 2307 QuicTime expected_rto_time =
2288 connection_.sent_packet_manager().GetRetransmissionTime(); 2308 connection_.sent_packet_manager().GetRetransmissionTime();
2289 EXPECT_EQ(next_rto_time, expected_rto_time); 2309 EXPECT_EQ(next_rto_time, expected_rto_time);
2290 } 2310 }
2291 2311
2292 TEST_F(QuicConnectionTest, TestQueued) { 2312 TEST_F(QuicConnectionTest, TestQueued) {
2293 EXPECT_EQ(0u, connection_.NumQueuedPackets()); 2313 EXPECT_EQ(0u, connection_.NumQueuedPackets());
2294 writer_->SetWriteBlocked(); 2314 writer_->BlockNextWrite();
2295 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL); 2315 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
2296 EXPECT_EQ(1u, connection_.NumQueuedPackets()); 2316 EXPECT_EQ(1u, connection_.NumQueuedPackets());
2297 2317
2298 // Attempt to send all packets, but since we're actually still
2299 // blocked, they should all remain queued.
2300 EXPECT_FALSE(connection_.OnCanWrite());
2301 EXPECT_EQ(1u, connection_.NumQueuedPackets());
2302
2303 // Unblock the writes and actually send. 2318 // Unblock the writes and actually send.
2304 writer_->SetWritable(); 2319 writer_->SetWritable();
2305 EXPECT_TRUE(connection_.OnCanWrite()); 2320 EXPECT_TRUE(connection_.OnCanWrite());
2306 EXPECT_EQ(0u, connection_.NumQueuedPackets()); 2321 EXPECT_EQ(0u, connection_.NumQueuedPackets());
2307 } 2322 }
2308 2323
2309 TEST_F(QuicConnectionTest, CloseFecGroup) { 2324 TEST_F(QuicConnectionTest, CloseFecGroup) {
2310 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); 2325 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2311 // Don't send missing packet 1. 2326 // Don't send missing packet 1.
2312 // Don't send missing packet 2. 2327 // Don't send missing packet 2.
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
2444 TimeUntilSend(_, NACK_RETRANSMISSION, _, _)).Times(0); 2459 TimeUntilSend(_, NACK_RETRANSMISSION, _, _)).Times(0);
2445 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); 2460 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
2446 connection_.SendPacket( 2461 connection_.SendPacket(
2447 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); 2462 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
2448 // XXX: fixme. was: connection_.SendPacket(1, packet, kForce); 2463 // XXX: fixme. was: connection_.SendPacket(1, packet, kForce);
2449 EXPECT_EQ(0u, connection_.NumQueuedPackets()); 2464 EXPECT_EQ(0u, connection_.NumQueuedPackets());
2450 } 2465 }
2451 2466
2452 TEST_F(QuicConnectionTest, SendSchedulerEAGAIN) { 2467 TEST_F(QuicConnectionTest, SendSchedulerEAGAIN) {
2453 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); 2468 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
2454 writer_->SetWriteBlocked(); 2469 writer_->BlockNextWrite();
2455 EXPECT_CALL(*send_algorithm_, 2470 EXPECT_CALL(*send_algorithm_,
2456 TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillOnce( 2471 TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillOnce(
2457 testing::Return(QuicTime::Delta::Zero())); 2472 testing::Return(QuicTime::Delta::Zero()));
2458 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, 1, _, _, _)).Times(0); 2473 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, 1, _, _, _)).Times(0);
2459 connection_.SendPacket( 2474 connection_.SendPacket(
2460 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); 2475 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
2461 EXPECT_EQ(1u, connection_.NumQueuedPackets()); 2476 EXPECT_EQ(1u, connection_.NumQueuedPackets());
2462 } 2477 }
2463 2478
2464 TEST_F(QuicConnectionTest, SendSchedulerDelayThenSend) { 2479 TEST_F(QuicConnectionTest, SendSchedulerDelayThenSend) {
(...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after
2919 QuicFrames frames; 2934 QuicFrames frames;
2920 QuicFrame frame(&frame1_); 2935 QuicFrame frame(&frame1_);
2921 frames.push_back(frame); 2936 frames.push_back(frame);
2922 scoped_ptr<QuicPacket> packet( 2937 scoped_ptr<QuicPacket> packet(
2923 framer_.BuildUnsizedDataPacket(header, frames).packet); 2938 framer_.BuildUnsizedDataPacket(header, frames).packet);
2924 scoped_ptr<QuicEncryptedPacket> encrypted( 2939 scoped_ptr<QuicEncryptedPacket> encrypted(
2925 framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet)); 2940 framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet));
2926 2941
2927 framer_.set_version(QuicVersionMax()); 2942 framer_.set_version(QuicVersionMax());
2928 connection_.set_is_server(true); 2943 connection_.set_is_server(true);
2929 writer_->SetWriteBlocked(); 2944 writer_->BlockNextWrite();
2930 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); 2945 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
2931 EXPECT_EQ(0u, writer_->last_packet_size()); 2946 EXPECT_EQ(0u, writer_->last_packet_size());
2932 EXPECT_TRUE(connection_.HasQueuedData()); 2947 EXPECT_TRUE(connection_.HasQueuedData());
2933 EXPECT_TRUE(QuicConnectionPeer::IsWriteBlocked(&connection_));
2934 2948
2935 writer_->SetWritable(); 2949 writer_->SetWritable();
2936 connection_.OnCanWrite(); 2950 connection_.OnCanWrite();
2937 EXPECT_TRUE(writer_->version_negotiation_packet() != NULL); 2951 EXPECT_TRUE(writer_->version_negotiation_packet() != NULL);
2938 2952
2939 size_t num_versions = arraysize(kSupportedQuicVersions); 2953 size_t num_versions = arraysize(kSupportedQuicVersions);
2940 EXPECT_EQ(num_versions, 2954 EXPECT_EQ(num_versions,
2941 writer_->version_negotiation_packet()->versions.size()); 2955 writer_->version_negotiation_packet()->versions.size());
2942 2956
2943 // We expect all versions in kSupportedQuicVersions to be 2957 // We expect all versions in kSupportedQuicVersions to be
(...skipping 20 matching lines...) Expand all
2964 QuicFrames frames; 2978 QuicFrames frames;
2965 QuicFrame frame(&frame1_); 2979 QuicFrame frame(&frame1_);
2966 frames.push_back(frame); 2980 frames.push_back(frame);
2967 scoped_ptr<QuicPacket> packet( 2981 scoped_ptr<QuicPacket> packet(
2968 framer_.BuildUnsizedDataPacket(header, frames).packet); 2982 framer_.BuildUnsizedDataPacket(header, frames).packet);
2969 scoped_ptr<QuicEncryptedPacket> encrypted( 2983 scoped_ptr<QuicEncryptedPacket> encrypted(
2970 framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet)); 2984 framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet));
2971 2985
2972 framer_.set_version(QuicVersionMax()); 2986 framer_.set_version(QuicVersionMax());
2973 connection_.set_is_server(true); 2987 connection_.set_is_server(true);
2974 writer_->SetWriteBlocked(); 2988 writer_->BlockNextWrite();
2975 writer_->set_is_write_blocked_data_buffered(true); 2989 writer_->set_is_write_blocked_data_buffered(true);
2976 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); 2990 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
2977 EXPECT_EQ(0u, writer_->last_packet_size()); 2991 EXPECT_EQ(0u, writer_->last_packet_size());
2978 EXPECT_FALSE(connection_.HasQueuedData()); 2992 EXPECT_FALSE(connection_.HasQueuedData());
2979 EXPECT_TRUE(QuicConnectionPeer::IsWriteBlocked(&connection_));
2980 } 2993 }
2981 2994
2982 TEST_F(QuicConnectionTest, ClientHandlesVersionNegotiation) { 2995 TEST_F(QuicConnectionTest, ClientHandlesVersionNegotiation) {
2983 // Start out with some unsupported version. 2996 // Start out with some unsupported version.
2984 QuicConnectionPeer::GetFramer(&connection_)->set_version_for_tests( 2997 QuicConnectionPeer::GetFramer(&connection_)->set_version_for_tests(
2985 QUIC_VERSION_UNSUPPORTED); 2998 QUIC_VERSION_UNSUPPORTED);
2986 2999
2987 QuicPacketHeader header; 3000 QuicPacketHeader header;
2988 header.public_header.guid = guid_; 3001 header.public_header.guid = guid_;
2989 header.public_header.reset_flag = false; 3002 header.public_header.reset_flag = false;
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
3199 lowest_version_vector.push_back(QuicVersionMin()); 3212 lowest_version_vector.push_back(QuicVersionMin());
3200 EXPECT_TRUE(connection_.SelectMutualVersion(lowest_version_vector)); 3213 EXPECT_TRUE(connection_.SelectMutualVersion(lowest_version_vector));
3201 EXPECT_EQ(QuicVersionMin(), connection_.version()); 3214 EXPECT_EQ(QuicVersionMin(), connection_.version());
3202 3215
3203 // Shouldn't be able to find a mutually supported version. 3216 // Shouldn't be able to find a mutually supported version.
3204 QuicVersionVector unsupported_version; 3217 QuicVersionVector unsupported_version;
3205 unsupported_version.push_back(QUIC_VERSION_UNSUPPORTED); 3218 unsupported_version.push_back(QUIC_VERSION_UNSUPPORTED);
3206 EXPECT_FALSE(connection_.SelectMutualVersion(unsupported_version)); 3219 EXPECT_FALSE(connection_.SelectMutualVersion(unsupported_version));
3207 } 3220 }
3208 3221
3209 TEST_F(QuicConnectionTest, ConnectionCloseWhenNotWriteBlocked) { 3222 TEST_F(QuicConnectionTest, ConnectionCloseWhenWritable) {
3210 writer_->SetWritable(); // Already default. 3223 EXPECT_FALSE(writer_->IsWriteBlocked());
3211 3224
3212 // Send a packet (but write will not block). 3225 // Send a packet.
3213 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL); 3226 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
3214 EXPECT_EQ(0u, connection_.NumQueuedPackets()); 3227 EXPECT_EQ(0u, connection_.NumQueuedPackets());
3215 EXPECT_EQ(1u, writer_->packets_write_attempts()); 3228 EXPECT_EQ(1u, writer_->packets_write_attempts());
3216 3229
3217 // Send an erroneous packet to close the connection. 3230 TriggerConnectionClose();
3218 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, false));
3219 ProcessDataPacket(6000, 0, !kEntropyFlag);
3220 EXPECT_EQ(2u, writer_->packets_write_attempts()); 3231 EXPECT_EQ(2u, writer_->packets_write_attempts());
3221 } 3232 }
3222 3233
3234 TEST_F(QuicConnectionTest, ConnectionCloseGettingWriteBlocked) {
3235 writer_->BlockNextWrite();
3236 TriggerConnectionClose();
3237 EXPECT_EQ(1u, writer_->packets_write_attempts());
3238 EXPECT_TRUE(writer_->IsWriteBlocked());
3239 }
3240
3223 TEST_F(QuicConnectionTest, ConnectionCloseWhenWriteBlocked) { 3241 TEST_F(QuicConnectionTest, ConnectionCloseWhenWriteBlocked) {
3224 EXPECT_EQ(0u, connection_.NumQueuedPackets()); 3242 writer_->BlockNextWrite();
3225 writer_->SetWriteBlocked();
3226
3227 // Send a packet to so that write will really block.
3228 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL); 3243 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
3229 EXPECT_EQ(1u, connection_.NumQueuedPackets()); 3244 EXPECT_EQ(1u, connection_.NumQueuedPackets());
3230 EXPECT_EQ(1u, writer_->packets_write_attempts()); 3245 EXPECT_EQ(1u, writer_->packets_write_attempts());
3231 3246 EXPECT_TRUE(writer_->IsWriteBlocked());
3232 // Send an erroneous packet to close the connection. 3247 TriggerConnectionClose();
3233 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, false));
3234 ProcessDataPacket(6000, 0, !kEntropyFlag);
3235 EXPECT_EQ(1u, writer_->packets_write_attempts()); 3248 EXPECT_EQ(1u, writer_->packets_write_attempts());
3236 } 3249 }
3237 3250
3238 TEST_F(QuicConnectionTest, ConnectionCloseWhenNothingPending) {
3239 writer_->SetWriteBlocked();
3240
3241 // Send an erroneous packet to close the connection.
3242 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, false));
3243 ProcessDataPacket(6000, 0, !kEntropyFlag);
3244 EXPECT_EQ(1u, writer_->packets_write_attempts());
3245 }
3246
3247 TEST_F(QuicConnectionTest, AckNotifierTriggerCallback) { 3251 TEST_F(QuicConnectionTest, AckNotifierTriggerCallback) {
3248 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); 3252 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3249 3253
3250 // Create a delegate which we expect to be called. 3254 // Create a delegate which we expect to be called.
3251 scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate); 3255 scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate);
3252 EXPECT_CALL(*delegate, OnAckNotification()).Times(1);; 3256 EXPECT_CALL(*delegate, OnAckNotification()).Times(1);
3253 3257
3254 // Send some data, which will register the delegate to be notified. 3258 // Send some data, which will register the delegate to be notified.
3255 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, delegate.get()); 3259 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, delegate.get());
3256 3260
3257 // Process an ACK from the server which should trigger the callback. 3261 // Process an ACK from the server which should trigger the callback.
3258 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); 3262 EXPECT_CALL(*send_algorithm_, UpdateRtt(_));
3259 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(1); 3263 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(1);
3260 QuicAckFrame frame = InitAckFrame(1, 0); 3264 QuicAckFrame frame = InitAckFrame(1, 0);
3261 ProcessAckPacket(&frame); 3265 ProcessAckPacket(&frame);
3262 } 3266 }
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
3320 } 3324 }
3321 3325
3322 // TODO(rjshade): Add a similar test that FEC recovery on peer (and resulting 3326 // TODO(rjshade): Add a similar test that FEC recovery on peer (and resulting
3323 // ACK) triggers notification on our end. 3327 // ACK) triggers notification on our end.
3324 TEST_F(QuicConnectionTest, AckNotifierCallbackAfterFECRecovery) { 3328 TEST_F(QuicConnectionTest, AckNotifierCallbackAfterFECRecovery) {
3325 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); 3329 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3326 EXPECT_CALL(visitor_, OnCanWrite()).Times(1).WillOnce(Return(true)); 3330 EXPECT_CALL(visitor_, OnCanWrite()).Times(1).WillOnce(Return(true));
3327 3331
3328 // Create a delegate which we expect to be called. 3332 // Create a delegate which we expect to be called.
3329 scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate); 3333 scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate);
3330 EXPECT_CALL(*delegate, OnAckNotification()).Times(1);; 3334 EXPECT_CALL(*delegate, OnAckNotification()).Times(1);
3331 3335
3332 // Expect ACKs for 1 packet. 3336 // Expect ACKs for 1 packet.
3333 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); 3337 EXPECT_CALL(*send_algorithm_, UpdateRtt(_));
3334 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(1); 3338 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(1);
3335 3339
3336 // Send one packet, and register to be notified on ACK. 3340 // Send one packet, and register to be notified on ACK.
3337 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, delegate.get()); 3341 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, delegate.get());
3338 3342
3339 // Ack packet gets dropped, but we receive an FEC packet that covers it. 3343 // Ack packet gets dropped, but we receive an FEC packet that covers it.
3340 // Should recover the Ack packet and trigger the notification callback. 3344 // Should recover the Ack packet and trigger the notification callback.
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
3433 true); 3437 true);
3434 TestConnection client(guid_, IPEndPoint(), helper_.get(), writer_.get(), 3438 TestConnection client(guid_, IPEndPoint(), helper_.get(), writer_.get(),
3435 false); 3439 false);
3436 EXPECT_TRUE(client.sent_packet_manager().using_pacing()); 3440 EXPECT_TRUE(client.sent_packet_manager().using_pacing());
3437 EXPECT_FALSE(server.sent_packet_manager().using_pacing()); 3441 EXPECT_FALSE(server.sent_packet_manager().using_pacing());
3438 } 3442 }
3439 3443
3440 } // namespace 3444 } // namespace
3441 } // namespace test 3445 } // namespace test
3442 } // namespace net 3446 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_connection.cc ('k') | net/quic/test_tools/quic_connection_peer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698