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 "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" |
| 11 #include "net/quic/congestion_control/loss_detection_interface.h" |
11 #include "net/quic/congestion_control/receive_algorithm_interface.h" | 12 #include "net/quic/congestion_control/receive_algorithm_interface.h" |
12 #include "net/quic/congestion_control/send_algorithm_interface.h" | 13 #include "net/quic/congestion_control/send_algorithm_interface.h" |
13 #include "net/quic/crypto/null_encrypter.h" | 14 #include "net/quic/crypto/null_encrypter.h" |
14 #include "net/quic/crypto/quic_decrypter.h" | 15 #include "net/quic/crypto/quic_decrypter.h" |
15 #include "net/quic/crypto/quic_encrypter.h" | 16 #include "net/quic/crypto/quic_encrypter.h" |
16 #include "net/quic/quic_protocol.h" | 17 #include "net/quic/quic_protocol.h" |
17 #include "net/quic/quic_sent_packet_manager.h" | 18 #include "net/quic/quic_sent_packet_manager.h" |
18 #include "net/quic/quic_utils.h" | 19 #include "net/quic/quic_utils.h" |
19 #include "net/quic/test_tools/mock_clock.h" | 20 #include "net/quic/test_tools/mock_clock.h" |
20 #include "net/quic/test_tools/mock_random.h" | 21 #include "net/quic/test_tools/mock_random.h" |
(...skipping 398 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
419 } | 420 } |
420 | 421 |
421 void SetReceiveAlgorithm(TestReceiveAlgorithm* receive_algorithm) { | 422 void SetReceiveAlgorithm(TestReceiveAlgorithm* receive_algorithm) { |
422 QuicConnectionPeer::SetReceiveAlgorithm(this, receive_algorithm); | 423 QuicConnectionPeer::SetReceiveAlgorithm(this, receive_algorithm); |
423 } | 424 } |
424 | 425 |
425 void SetSendAlgorithm(SendAlgorithmInterface* send_algorithm) { | 426 void SetSendAlgorithm(SendAlgorithmInterface* send_algorithm) { |
426 QuicConnectionPeer::SetSendAlgorithm(this, send_algorithm); | 427 QuicConnectionPeer::SetSendAlgorithm(this, send_algorithm); |
427 } | 428 } |
428 | 429 |
| 430 void SetLossAlgorithm(LossDetectionInterface* loss_algorithm) { |
| 431 QuicSentPacketManagerPeer::SetLossAlgorithm( |
| 432 QuicConnectionPeer::GetSentPacketManager(this), loss_algorithm); |
| 433 } |
| 434 |
429 void SendPacket(EncryptionLevel level, | 435 void SendPacket(EncryptionLevel level, |
430 QuicPacketSequenceNumber sequence_number, | 436 QuicPacketSequenceNumber sequence_number, |
431 QuicPacket* packet, | 437 QuicPacket* packet, |
432 QuicPacketEntropyHash entropy_hash, | 438 QuicPacketEntropyHash entropy_hash, |
433 HasRetransmittableData retransmittable) { | 439 HasRetransmittableData retransmittable) { |
434 RetransmittableFrames* retransmittable_frames = | 440 RetransmittableFrames* retransmittable_frames = |
435 retransmittable == HAS_RETRANSMITTABLE_DATA ? | 441 retransmittable == HAS_RETRANSMITTABLE_DATA ? |
436 new RetransmittableFrames() : NULL; | 442 new RetransmittableFrames() : NULL; |
437 OnSerializedPacket( | 443 OnSerializedPacket( |
438 SerializedPacket(sequence_number, PACKET_6BYTE_SEQUENCE_NUMBER, | 444 SerializedPacket(sequence_number, PACKET_6BYTE_SEQUENCE_NUMBER, |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
532 DISALLOW_COPY_AND_ASSIGN(TestConnection); | 538 DISALLOW_COPY_AND_ASSIGN(TestConnection); |
533 }; | 539 }; |
534 | 540 |
535 class QuicConnectionTest : public ::testing::TestWithParam<QuicVersion> { | 541 class QuicConnectionTest : public ::testing::TestWithParam<QuicVersion> { |
536 protected: | 542 protected: |
537 QuicConnectionTest() | 543 QuicConnectionTest() |
538 : guid_(42), | 544 : guid_(42), |
539 framer_(SupportedVersions(version()), QuicTime::Zero(), false), | 545 framer_(SupportedVersions(version()), QuicTime::Zero(), false), |
540 creator_(guid_, &framer_, &random_generator_, false), | 546 creator_(guid_, &framer_, &random_generator_, false), |
541 send_algorithm_(new StrictMock<MockSendAlgorithm>), | 547 send_algorithm_(new StrictMock<MockSendAlgorithm>), |
| 548 loss_algorithm_(NULL), |
542 helper_(new TestConnectionHelper(&clock_, &random_generator_)), | 549 helper_(new TestConnectionHelper(&clock_, &random_generator_)), |
543 writer_(new TestPacketWriter(version())), | 550 writer_(new TestPacketWriter(version())), |
544 connection_(guid_, IPEndPoint(), helper_.get(), writer_.get(), | 551 connection_(guid_, IPEndPoint(), helper_.get(), writer_.get(), |
545 false, version()), | 552 false, version()), |
546 frame1_(1, false, 0, MakeIOVector(data1)), | 553 frame1_(1, false, 0, MakeIOVector(data1)), |
547 frame2_(1, false, 3, MakeIOVector(data2)), | 554 frame2_(1, false, 3, MakeIOVector(data2)), |
548 accept_packet_(true) { | 555 accept_packet_(true) { |
549 connection_.set_visitor(&visitor_); | 556 connection_.set_visitor(&visitor_); |
550 connection_.SetSendAlgorithm(send_algorithm_); | 557 connection_.SetSendAlgorithm(send_algorithm_); |
551 framer_.set_received_entropy_calculator(&entropy_calculator_); | 558 framer_.set_received_entropy_calculator(&entropy_calculator_); |
(...skipping 12 matching lines...) Expand all Loading... |
564 QuicBandwidth::FromKBitsPerSecond(100))); | 571 QuicBandwidth::FromKBitsPerSecond(100))); |
565 EXPECT_CALL(*send_algorithm_, SmoothedRtt()).WillRepeatedly(Return( | 572 EXPECT_CALL(*send_algorithm_, SmoothedRtt()).WillRepeatedly(Return( |
566 QuicTime::Delta::FromMilliseconds(100))); | 573 QuicTime::Delta::FromMilliseconds(100))); |
567 ON_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 574 ON_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
568 .WillByDefault(Return(true)); | 575 .WillByDefault(Return(true)); |
569 EXPECT_CALL(visitor_, HasPendingWrites()).Times(AnyNumber()); | 576 EXPECT_CALL(visitor_, HasPendingWrites()).Times(AnyNumber()); |
570 EXPECT_CALL(visitor_, HasPendingHandshake()).Times(AnyNumber()); | 577 EXPECT_CALL(visitor_, HasPendingHandshake()).Times(AnyNumber()); |
571 EXPECT_CALL(visitor_, OnCanWrite()).Times(AnyNumber()); | 578 EXPECT_CALL(visitor_, OnCanWrite()).Times(AnyNumber()); |
572 } | 579 } |
573 | 580 |
| 581 void SetUpMockLossAlgorithm() { |
| 582 loss_algorithm_ = new MockLossAlgorithm(); |
| 583 connection_.SetLossAlgorithm(loss_algorithm_); |
| 584 EXPECT_CALL(*loss_algorithm_, GetLossTimeout()) |
| 585 .WillRepeatedly(Return(QuicTime::Zero())); |
| 586 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _)) |
| 587 .WillRepeatedly(Return(SequenceNumberSet())); |
| 588 } |
| 589 |
574 QuicVersion version() { | 590 QuicVersion version() { |
575 return GetParam(); | 591 return GetParam(); |
576 } | 592 } |
577 | 593 |
578 QuicAckFrame* outgoing_ack() { | 594 QuicAckFrame* outgoing_ack() { |
579 outgoing_ack_.reset(QuicConnectionPeer::CreateAckFrame(&connection_)); | 595 outgoing_ack_.reset(QuicConnectionPeer::CreateAckFrame(&connection_)); |
580 return outgoing_ack_.get(); | 596 return outgoing_ack_.get(); |
581 } | 597 } |
582 | 598 |
583 QuicPacketSequenceNumber least_unacked() { | 599 QuicPacketSequenceNumber least_unacked() { |
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
895 writer_->BlockOnNextWrite(); | 911 writer_->BlockOnNextWrite(); |
896 EXPECT_CALL(visitor_, OnWriteBlocked()).Times(AtLeast(1)); | 912 EXPECT_CALL(visitor_, OnWriteBlocked()).Times(AtLeast(1)); |
897 } | 913 } |
898 | 914 |
899 QuicGuid guid_; | 915 QuicGuid guid_; |
900 QuicFramer framer_; | 916 QuicFramer framer_; |
901 QuicPacketCreator creator_; | 917 QuicPacketCreator creator_; |
902 MockEntropyCalculator entropy_calculator_; | 918 MockEntropyCalculator entropy_calculator_; |
903 | 919 |
904 MockSendAlgorithm* send_algorithm_; | 920 MockSendAlgorithm* send_algorithm_; |
| 921 MockLossAlgorithm* loss_algorithm_; |
905 TestReceiveAlgorithm* receive_algorithm_; | 922 TestReceiveAlgorithm* receive_algorithm_; |
906 MockClock clock_; | 923 MockClock clock_; |
907 MockRandom random_generator_; | 924 MockRandom random_generator_; |
908 scoped_ptr<TestConnectionHelper> helper_; | 925 scoped_ptr<TestConnectionHelper> helper_; |
909 scoped_ptr<TestPacketWriter> writer_; | 926 scoped_ptr<TestPacketWriter> writer_; |
910 TestConnection connection_; | 927 TestConnection connection_; |
911 StrictMock<MockConnectionVisitor> visitor_; | 928 StrictMock<MockConnectionVisitor> visitor_; |
912 | 929 |
913 QuicPacketHeader header_; | 930 QuicPacketHeader header_; |
914 QuicStreamFrame frame1_; | 931 QuicStreamFrame frame1_; |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1102 ProcessPacket(1); | 1119 ProcessPacket(1); |
1103 // Should ack immediately, since this fills the last hole. | 1120 // Should ack immediately, since this fills the last hole. |
1104 EXPECT_EQ(3u, writer_->packets_write_attempts()); | 1121 EXPECT_EQ(3u, writer_->packets_write_attempts()); |
1105 | 1122 |
1106 ProcessPacket(4); | 1123 ProcessPacket(4); |
1107 // Should not cause an ack. | 1124 // Should not cause an ack. |
1108 EXPECT_EQ(3u, writer_->packets_write_attempts()); | 1125 EXPECT_EQ(3u, writer_->packets_write_attempts()); |
1109 } | 1126 } |
1110 | 1127 |
1111 TEST_P(QuicConnectionTest, AckReceiptCausesAckSend) { | 1128 TEST_P(QuicConnectionTest, AckReceiptCausesAckSend) { |
| 1129 SetUpMockLossAlgorithm(); |
1112 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 1130 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
1113 EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)).Times(1); | 1131 |
1114 QuicPacketSequenceNumber original; | 1132 QuicPacketSequenceNumber original; |
1115 QuicByteCount packet_size; | 1133 QuicByteCount packet_size; |
1116 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, NOT_RETRANSMISSION, _)) | 1134 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, NOT_RETRANSMISSION, _)) |
1117 .WillOnce(DoAll(SaveArg<1>(&original), SaveArg<2>(&packet_size), | 1135 .WillOnce(DoAll(SaveArg<1>(&original), SaveArg<2>(&packet_size), |
1118 Return(true))); | 1136 Return(true))); |
1119 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _)).Times(1); | |
1120 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL); | 1137 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL); |
1121 QuicAckFrame frame = InitAckFrame(original, 1); | 1138 QuicAckFrame frame = InitAckFrame(original, 1); |
1122 NackPacket(original, &frame); | 1139 NackPacket(original, &frame); |
1123 // First nack triggers early retransmit. | 1140 // First nack triggers early retransmit. |
| 1141 SequenceNumberSet lost_packets; |
| 1142 lost_packets.insert(1); |
| 1143 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _)) |
| 1144 .WillOnce(Return(lost_packets)); |
1124 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); | 1145 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); |
| 1146 EXPECT_CALL(*send_algorithm_, OnPacketLost(1, _)).Times(1); |
| 1147 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _)).Times(1); |
1125 QuicPacketSequenceNumber retransmission; | 1148 QuicPacketSequenceNumber retransmission; |
1126 EXPECT_CALL(*send_algorithm_, | 1149 EXPECT_CALL(*send_algorithm_, |
1127 OnPacketSent(_, _, packet_size - kQuicVersionSize, | 1150 OnPacketSent(_, _, packet_size - kQuicVersionSize, |
1128 NACK_RETRANSMISSION, _)) | 1151 NACK_RETRANSMISSION, _)) |
1129 .WillOnce(DoAll(SaveArg<1>(&retransmission), Return(true))); | 1152 .WillOnce(DoAll(SaveArg<1>(&retransmission), Return(true))); |
1130 | 1153 |
1131 ProcessAckPacket(&frame); | 1154 ProcessAckPacket(&frame); |
1132 | 1155 |
1133 QuicAckFrame frame2 = InitAckFrame(retransmission, 1); | 1156 QuicAckFrame frame2 = InitAckFrame(retransmission, 1); |
1134 NackPacket(original, &frame2); | 1157 NackPacket(original, &frame2); |
1135 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); | 1158 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); |
1136 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)); | 1159 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)); |
| 1160 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _)) |
| 1161 .WillOnce(Return(SequenceNumberSet())); |
1137 ProcessAckPacket(&frame2); | 1162 ProcessAckPacket(&frame2); |
1138 | 1163 |
1139 // Now if the peer sends an ack which still reports the retransmitted packet | 1164 // Now if the peer sends an ack which still reports the retransmitted packet |
1140 // as missing, that will bundle an ack with data after two acks in a row | 1165 // as missing, that will bundle an ack with data after two acks in a row |
1141 // indicate the high water mark needs to be raised. | 1166 // indicate the high water mark needs to be raised. |
1142 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, NOT_RETRANSMISSION, | 1167 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, NOT_RETRANSMISSION, |
1143 HAS_RETRANSMITTABLE_DATA)); | 1168 HAS_RETRANSMITTABLE_DATA)); |
1144 connection_.SendStreamDataWithString(3, "foo", 3, !kFin, NULL); | 1169 connection_.SendStreamDataWithString(3, "foo", 3, !kFin, NULL); |
1145 // No ack sent. | 1170 // No ack sent. |
1146 EXPECT_EQ(1u, writer_->frame_count()); | 1171 EXPECT_EQ(1u, writer_->frame_count()); |
1147 EXPECT_EQ(1u, writer_->stream_frames()->size()); | 1172 EXPECT_EQ(1u, writer_->stream_frames()->size()); |
1148 writer_->Reset(); | 1173 writer_->Reset(); |
1149 | 1174 |
| 1175 // No more packet loss for the rest of the test. |
| 1176 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _)) |
| 1177 .WillRepeatedly(Return(SequenceNumberSet())); |
1150 ProcessAckPacket(&frame2); | 1178 ProcessAckPacket(&frame2); |
1151 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, NOT_RETRANSMISSION, | 1179 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, NOT_RETRANSMISSION, |
1152 HAS_RETRANSMITTABLE_DATA)); | 1180 HAS_RETRANSMITTABLE_DATA)); |
1153 connection_.SendStreamDataWithString(3, "foo", 3, !kFin, NULL); | 1181 connection_.SendStreamDataWithString(3, "foo", 3, !kFin, NULL); |
1154 // Ack bundled. | 1182 // Ack bundled. |
1155 if (version() > QUIC_VERSION_15) { | 1183 if (version() > QUIC_VERSION_15) { |
1156 EXPECT_EQ(3u, writer_->frame_count()); | 1184 EXPECT_EQ(3u, writer_->frame_count()); |
1157 } else { | 1185 } else { |
1158 EXPECT_EQ(2u, writer_->frame_count()); | 1186 EXPECT_EQ(2u, writer_->frame_count()); |
1159 } | 1187 } |
(...skipping 621 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1781 | 1809 |
1782 // Parse the last packet and ensure it's the two stream frames from | 1810 // Parse the last packet and ensure it's the two stream frames from |
1783 // two different streams. | 1811 // two different streams. |
1784 EXPECT_EQ(2u, writer_->frame_count()); | 1812 EXPECT_EQ(2u, writer_->frame_count()); |
1785 EXPECT_EQ(2u, writer_->stream_frames()->size()); | 1813 EXPECT_EQ(2u, writer_->stream_frames()->size()); |
1786 EXPECT_EQ(kStreamId3, (*writer_->stream_frames())[0].stream_id); | 1814 EXPECT_EQ(kStreamId3, (*writer_->stream_frames())[0].stream_id); |
1787 EXPECT_EQ(kStreamId5, (*writer_->stream_frames())[1].stream_id); | 1815 EXPECT_EQ(kStreamId5, (*writer_->stream_frames())[1].stream_id); |
1788 } | 1816 } |
1789 | 1817 |
1790 TEST_P(QuicConnectionTest, RetransmitOnNack) { | 1818 TEST_P(QuicConnectionTest, RetransmitOnNack) { |
1791 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); | 1819 SetUpMockLossAlgorithm(); |
1792 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)); | |
1793 EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)).Times(1); | |
1794 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(2, _)).Times(1); | |
1795 QuicPacketSequenceNumber last_packet; | 1820 QuicPacketSequenceNumber last_packet; |
1796 QuicByteCount second_packet_size; | 1821 QuicByteCount second_packet_size; |
1797 SendStreamDataToPeer(3, "foo", 0, !kFin, &last_packet); // Packet 1 | 1822 SendStreamDataToPeer(3, "foo", 0, !kFin, &last_packet); // Packet 1 |
1798 second_packet_size = | 1823 second_packet_size = |
1799 SendStreamDataToPeer(3, "foos", 3, !kFin, &last_packet); // Packet 2 | 1824 SendStreamDataToPeer(3, "foos", 3, !kFin, &last_packet); // Packet 2 |
1800 SendStreamDataToPeer(3, "fooos", 7, !kFin, &last_packet); // Packet 3 | 1825 SendStreamDataToPeer(3, "fooos", 7, !kFin, &last_packet); // Packet 3 |
1801 | 1826 |
1802 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 1827 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
1803 | 1828 |
1804 // Peer acks one but not two or three. Right now we only retransmit on | 1829 // Don't lose a packet on an ack, and nothing is retransmitted. |
1805 // explicit nack, so it should not trigger a retransmission. | 1830 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); |
| 1831 EXPECT_CALL(*send_algorithm_, OnPacketAcked(1, _)); |
1806 QuicAckFrame ack_one = InitAckFrame(1, 0); | 1832 QuicAckFrame ack_one = InitAckFrame(1, 0); |
1807 ProcessAckPacket(&ack_one); | 1833 ProcessAckPacket(&ack_one); |
1808 ProcessAckPacket(&ack_one); | |
1809 ProcessAckPacket(&ack_one); | |
1810 | 1834 |
1811 // Peer acks up to 3 with two explicitly missing. | 1835 // Lose a packet and ensure it triggers retransmission. |
1812 // Early retransmit causes 2 to be retransmitted on the first ack. | |
1813 QuicAckFrame nack_two = InitAckFrame(3, 0); | 1836 QuicAckFrame nack_two = InitAckFrame(3, 0); |
1814 NackPacket(2, &nack_two); | 1837 NackPacket(2, &nack_two); |
1815 // The third nack should trigger a retransmission. | 1838 SequenceNumberSet lost_packets; |
| 1839 lost_packets.insert(2); |
| 1840 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _)) |
| 1841 .WillOnce(Return(lost_packets)); |
1816 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); | 1842 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); |
1817 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)); | 1843 EXPECT_CALL(*send_algorithm_, OnPacketAcked(3, _)); |
| 1844 EXPECT_CALL(*send_algorithm_, OnPacketLost(2, _)).Times(1); |
| 1845 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(2, _)).Times(1); |
1818 EXPECT_CALL(*send_algorithm_, | 1846 EXPECT_CALL(*send_algorithm_, |
1819 OnPacketSent(_, _, second_packet_size - kQuicVersionSize, | 1847 OnPacketSent(_, _, second_packet_size - kQuicVersionSize, |
1820 NACK_RETRANSMISSION, _)).Times(1); | 1848 NACK_RETRANSMISSION, _)).Times(1); |
1821 ProcessAckPacket(&nack_two); | 1849 ProcessAckPacket(&nack_two); |
1822 } | 1850 } |
1823 | 1851 |
1824 TEST_P(QuicConnectionTest, DiscardRetransmit) { | 1852 TEST_P(QuicConnectionTest, DiscardRetransmit) { |
1825 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); | 1853 SetUpMockLossAlgorithm(); |
1826 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)); | |
1827 EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)).Times(1); | |
1828 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(2, _)).Times(1); | |
1829 QuicPacketSequenceNumber last_packet; | 1854 QuicPacketSequenceNumber last_packet; |
1830 SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet); // Packet 1 | 1855 SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet); // Packet 1 |
1831 SendStreamDataToPeer(1, "foos", 3, !kFin, &last_packet); // Packet 2 | 1856 SendStreamDataToPeer(1, "foos", 3, !kFin, &last_packet); // Packet 2 |
1832 SendStreamDataToPeer(1, "fooos", 7, !kFin, &last_packet); // Packet 3 | 1857 SendStreamDataToPeer(1, "fooos", 7, !kFin, &last_packet); // Packet 3 |
1833 | 1858 |
1834 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 1859 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
1835 | 1860 |
1836 // Peer acks one but not two or three. Right now we only retransmit on | 1861 // Instigate a loss with an ack. |
1837 // explicit nack, so it should not trigger a retransmission. | |
1838 QuicAckFrame ack_one = InitAckFrame(1, 0); | |
1839 ProcessAckPacket(&ack_one); | |
1840 ProcessAckPacket(&ack_one); | |
1841 ProcessAckPacket(&ack_one); | |
1842 | |
1843 // Peer acks up to 3 with two explicitly missing. Two nacks should cause no | |
1844 // change. | |
1845 QuicAckFrame nack_two = InitAckFrame(3, 0); | 1862 QuicAckFrame nack_two = InitAckFrame(3, 0); |
1846 NackPacket(2, &nack_two); | 1863 NackPacket(2, &nack_two); |
1847 // The first nack should trigger a fast retransmission, but we'll be | 1864 // The first nack should trigger a fast retransmission, but we'll be |
1848 // write blocked, so the packet will be queued. | 1865 // write blocked, so the packet will be queued. |
1849 BlockOnNextWrite(); | 1866 BlockOnNextWrite(); |
| 1867 SequenceNumberSet lost_packets; |
| 1868 lost_packets.insert(2); |
| 1869 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _)) |
| 1870 .WillOnce(Return(lost_packets)); |
1850 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); | 1871 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); |
1851 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)); | 1872 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(2); |
| 1873 EXPECT_CALL(*send_algorithm_, OnPacketLost(2, _)); |
| 1874 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(2, _)); |
1852 ProcessAckPacket(&nack_two); | 1875 ProcessAckPacket(&nack_two); |
1853 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 1876 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
1854 | 1877 |
1855 // Now, ack the previous transmission. | 1878 // Now, ack the previous transmission. |
| 1879 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _)) |
| 1880 .WillOnce(Return(SequenceNumberSet())); |
1856 QuicAckFrame ack_all = InitAckFrame(3, 0); | 1881 QuicAckFrame ack_all = InitAckFrame(3, 0); |
1857 ProcessAckPacket(&ack_all); | 1882 ProcessAckPacket(&ack_all); |
1858 | 1883 |
1859 // Unblock the socket and attempt to send the queued packets. However, | 1884 // Unblock the socket and attempt to send the queued packets. However, |
1860 // since the previous transmission has been acked, we will not | 1885 // since the previous transmission has been acked, we will not |
1861 // send the retransmission. | 1886 // send the retransmission. |
1862 EXPECT_CALL(*send_algorithm_, | 1887 EXPECT_CALL(*send_algorithm_, |
1863 OnPacketSent(_, _, _, _, _)).Times(0); | 1888 OnPacketSent(_, _, _, _, _)).Times(0); |
1864 | 1889 |
1865 writer_->SetWritable(); | 1890 writer_->SetWritable(); |
1866 connection_.OnCanWrite(); | 1891 connection_.OnCanWrite(); |
1867 | 1892 |
1868 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 1893 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
1869 } | 1894 } |
1870 | 1895 |
1871 TEST_P(QuicConnectionTest, RetransmitNackedLargestObserved) { | 1896 TEST_P(QuicConnectionTest, RetransmitNackedLargestObserved) { |
| 1897 SetUpMockLossAlgorithm(); |
1872 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 1898 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
1873 EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)).Times(1); | |
1874 QuicPacketSequenceNumber largest_observed; | 1899 QuicPacketSequenceNumber largest_observed; |
1875 QuicByteCount packet_size; | 1900 QuicByteCount packet_size; |
1876 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, NOT_RETRANSMISSION, _)) | 1901 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, NOT_RETRANSMISSION, _)) |
1877 .WillOnce(DoAll(SaveArg<1>(&largest_observed), SaveArg<2>(&packet_size), | 1902 .WillOnce(DoAll(SaveArg<1>(&largest_observed), SaveArg<2>(&packet_size), |
1878 Return(true))); | 1903 Return(true))); |
1879 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _)).Times(1); | |
1880 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL); | 1904 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL); |
| 1905 |
1881 QuicAckFrame frame = InitAckFrame(1, largest_observed); | 1906 QuicAckFrame frame = InitAckFrame(1, largest_observed); |
1882 NackPacket(largest_observed, &frame); | 1907 NackPacket(largest_observed, &frame); |
1883 // The first nack should retransmit the largest observed packet. | 1908 // The first nack should retransmit the largest observed packet. |
| 1909 SequenceNumberSet lost_packets; |
| 1910 lost_packets.insert(1); |
| 1911 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _)) |
| 1912 .WillOnce(Return(lost_packets)); |
1884 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); | 1913 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); |
| 1914 EXPECT_CALL(*send_algorithm_, OnPacketLost(1, _)).Times(1); |
| 1915 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _)).Times(1); |
1885 EXPECT_CALL(*send_algorithm_, | 1916 EXPECT_CALL(*send_algorithm_, |
1886 OnPacketSent(_, _, packet_size - kQuicVersionSize, | 1917 OnPacketSent(_, _, packet_size - kQuicVersionSize, |
1887 NACK_RETRANSMISSION, _)); | 1918 NACK_RETRANSMISSION, _)); |
1888 ProcessAckPacket(&frame); | 1919 ProcessAckPacket(&frame); |
1889 } | 1920 } |
1890 | 1921 |
1891 TEST_P(QuicConnectionTest, QueueAfterTwoRTOs) { | 1922 TEST_P(QuicConnectionTest, QueueAfterTwoRTOs) { |
1892 for (int i = 0; i < 10; ++i) { | 1923 for (int i = 0; i < 10; ++i) { |
1893 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); | 1924 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
1894 connection_.SendStreamDataWithString(3, "foo", i * 3, !kFin, NULL); | 1925 connection_.SendStreamDataWithString(3, "foo", i * 3, !kFin, NULL); |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1976 // attempt to write. | 2007 // attempt to write. |
1977 connection_.GetResumeWritesAlarm()->Set(clock_.ApproximateNow()); | 2008 connection_.GetResumeWritesAlarm()->Set(clock_.ApproximateNow()); |
1978 connection_.GetSendAlarm()->Set(clock_.ApproximateNow()); | 2009 connection_.GetSendAlarm()->Set(clock_.ApproximateNow()); |
1979 connection_.GetResumeWritesAlarm()->Fire(); | 2010 connection_.GetResumeWritesAlarm()->Fire(); |
1980 connection_.GetSendAlarm()->Fire(); | 2011 connection_.GetSendAlarm()->Fire(); |
1981 EXPECT_TRUE(writer_->IsWriteBlocked()); | 2012 EXPECT_TRUE(writer_->IsWriteBlocked()); |
1982 EXPECT_EQ(1u, writer_->packets_write_attempts()); | 2013 EXPECT_EQ(1u, writer_->packets_write_attempts()); |
1983 } | 2014 } |
1984 | 2015 |
1985 TEST_P(QuicConnectionTest, NoLimitPacketsPerNack) { | 2016 TEST_P(QuicConnectionTest, NoLimitPacketsPerNack) { |
| 2017 SetUpMockLossAlgorithm(); |
1986 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2018 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
1987 int offset = 0; | 2019 int offset = 0; |
1988 // Send packets 1 to 15. | 2020 // Send packets 1 to 15. |
1989 for (int i = 0; i < 15; ++i) { | 2021 for (int i = 0; i < 15; ++i) { |
1990 SendStreamDataToPeer(1, "foo", offset, !kFin, NULL); | 2022 SendStreamDataToPeer(1, "foo", offset, !kFin, NULL); |
1991 offset += 3; | 2023 offset += 3; |
1992 } | 2024 } |
1993 | 2025 |
1994 // Ack 15, nack 1-14. | 2026 // Ack 15, nack 1-14. |
| 2027 SequenceNumberSet lost_packets; |
1995 QuicAckFrame nack = InitAckFrame(15, 0); | 2028 QuicAckFrame nack = InitAckFrame(15, 0); |
1996 for (int i = 1; i < 15; ++i) { | 2029 for (int i = 1; i < 15; ++i) { |
1997 NackPacket(i, &nack); | 2030 NackPacket(i, &nack); |
| 2031 lost_packets.insert(i); |
1998 } | 2032 } |
1999 | 2033 |
2000 // 14 packets have been NACK'd and lost. In TCP cubic, PRR limits | 2034 // 14 packets have been NACK'd and lost. In TCP cubic, PRR limits |
2001 // the retransmission rate in the case of burst losses. | 2035 // the retransmission rate in the case of burst losses. |
| 2036 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _)) |
| 2037 .WillOnce(Return(lost_packets)); |
2002 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); | 2038 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); |
2003 EXPECT_CALL(*send_algorithm_, OnPacketAcked(15, _)).Times(1); | 2039 EXPECT_CALL(*send_algorithm_, OnPacketAcked(15, _)).Times(1); |
2004 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(14); | 2040 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(14); |
2005 EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)).Times(14); | 2041 EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)).Times(14); |
2006 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(14); | 2042 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(14); |
2007 ProcessAckPacket(&nack); | 2043 ProcessAckPacket(&nack); |
2008 } | 2044 } |
2009 | 2045 |
2010 // Test sending multiple acks from the connection to the session. | 2046 // Test sending multiple acks from the connection to the session. |
2011 TEST_P(QuicConnectionTest, MultipleAcks) { | 2047 TEST_P(QuicConnectionTest, MultipleAcks) { |
(...skipping 848 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2860 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2896 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
2861 ProcessPacket(1); | 2897 ProcessPacket(1); |
2862 connection_.SendStreamDataWithString(kCryptoStreamId, "foo", 0, !kFin, NULL); | 2898 connection_.SendStreamDataWithString(kCryptoStreamId, "foo", 0, !kFin, NULL); |
2863 // Check that ack is not bundled with outgoing data. | 2899 // Check that ack is not bundled with outgoing data. |
2864 EXPECT_EQ(1u, writer_->frame_count()); | 2900 EXPECT_EQ(1u, writer_->frame_count()); |
2865 EXPECT_FALSE(writer_->ack()); | 2901 EXPECT_FALSE(writer_->ack()); |
2866 EXPECT_TRUE(connection_.GetAckAlarm()->IsSet()); | 2902 EXPECT_TRUE(connection_.GetAckAlarm()->IsSet()); |
2867 } | 2903 } |
2868 | 2904 |
2869 TEST_P(QuicConnectionTest, BundleAckWithDataOnIncomingAck) { | 2905 TEST_P(QuicConnectionTest, BundleAckWithDataOnIncomingAck) { |
| 2906 SetUpMockLossAlgorithm(); |
2870 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2907 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
2871 connection_.SendStreamDataWithString(kStreamId3, "foo", 0, !kFin, NULL); | 2908 connection_.SendStreamDataWithString(kStreamId3, "foo", 0, !kFin, NULL); |
2872 connection_.SendStreamDataWithString(kStreamId3, "foo", 3, !kFin, NULL); | 2909 connection_.SendStreamDataWithString(kStreamId3, "foo", 3, !kFin, NULL); |
2873 // Ack the second packet, which will retransmit the first packet. | 2910 // Ack the second packet, which will retransmit the first packet. |
2874 QuicAckFrame ack = InitAckFrame(2, 0); | 2911 QuicAckFrame ack = InitAckFrame(2, 0); |
2875 NackPacket(1, &ack); | 2912 NackPacket(1, &ack); |
| 2913 SequenceNumberSet lost_packets; |
| 2914 lost_packets.insert(1); |
| 2915 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _)) |
| 2916 .WillOnce(Return(lost_packets)); |
2876 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); | 2917 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); |
2877 EXPECT_CALL(*send_algorithm_, OnPacketAcked(2, _)).Times(1); | 2918 EXPECT_CALL(*send_algorithm_, OnPacketAcked(2, _)).Times(1); |
2878 EXPECT_CALL(*send_algorithm_, OnPacketLost(1, _)).Times(1); | 2919 EXPECT_CALL(*send_algorithm_, OnPacketLost(1, _)).Times(1); |
2879 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _)).Times(1); | 2920 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _)).Times(1); |
2880 ProcessAckPacket(&ack); | 2921 ProcessAckPacket(&ack); |
2881 EXPECT_EQ(1u, writer_->frame_count()); | 2922 EXPECT_EQ(1u, writer_->frame_count()); |
2882 EXPECT_EQ(1u, writer_->stream_frames()->size()); | 2923 EXPECT_EQ(1u, writer_->stream_frames()->size()); |
2883 writer_->Reset(); | 2924 writer_->Reset(); |
2884 | 2925 |
2885 // Now ack the retransmission, which will both raise the high water mark | 2926 // Now ack the retransmission, which will both raise the high water mark |
2886 // and see if there is more data to send. | 2927 // and see if there is more data to send. |
2887 ack = InitAckFrame(3, 0); | 2928 ack = InitAckFrame(3, 0); |
2888 NackPacket(1, &ack); | 2929 NackPacket(1, &ack); |
| 2930 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _)) |
| 2931 .WillOnce(Return(SequenceNumberSet())); |
2889 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); | 2932 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); |
2890 EXPECT_CALL(*send_algorithm_, OnPacketAcked(3, _)).Times(1); | 2933 EXPECT_CALL(*send_algorithm_, OnPacketAcked(3, _)).Times(1); |
2891 ProcessAckPacket(&ack); | 2934 ProcessAckPacket(&ack); |
2892 | 2935 |
2893 // Check that no packet is sent and the ack alarm isn't set. | 2936 // Check that no packet is sent and the ack alarm isn't set. |
2894 EXPECT_EQ(0u, writer_->frame_count()); | 2937 EXPECT_EQ(0u, writer_->frame_count()); |
2895 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); | 2938 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); |
2896 writer_->Reset(); | 2939 writer_->Reset(); |
2897 | 2940 |
2898 // Send the same ack, but send both data and an ack together. | 2941 // Send the same ack, but send both data and an ack together. |
2899 ack = InitAckFrame(3, 0); | 2942 ack = InitAckFrame(3, 0); |
2900 NackPacket(1, &ack); | 2943 NackPacket(1, &ack); |
| 2944 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _)) |
| 2945 .WillOnce(Return(SequenceNumberSet())); |
2901 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce( | 2946 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce( |
2902 IgnoreResult(InvokeWithoutArgs( | 2947 IgnoreResult(InvokeWithoutArgs( |
2903 &connection_, | 2948 &connection_, |
2904 &TestConnection::EnsureWritableAndSendStreamData5))); | 2949 &TestConnection::EnsureWritableAndSendStreamData5))); |
2905 ProcessAckPacket(&ack); | 2950 ProcessAckPacket(&ack); |
2906 | 2951 |
2907 // Check that ack is bundled with outgoing data and the delayed ack | 2952 // Check that ack is bundled with outgoing data and the delayed ack |
2908 // alarm is reset. | 2953 // alarm is reset. |
2909 if (version() > QUIC_VERSION_15) { | 2954 if (version() > QUIC_VERSION_15) { |
2910 EXPECT_EQ(3u, writer_->frame_count()); | 2955 EXPECT_EQ(3u, writer_->frame_count()); |
(...skipping 647 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3558 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, delegate.get()); | 3603 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, delegate.get()); |
3559 | 3604 |
3560 // Process an ACK from the server which should trigger the callback. | 3605 // Process an ACK from the server which should trigger the callback. |
3561 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); | 3606 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); |
3562 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(1); | 3607 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(1); |
3563 QuicAckFrame frame = InitAckFrame(1, 0); | 3608 QuicAckFrame frame = InitAckFrame(1, 0); |
3564 ProcessAckPacket(&frame); | 3609 ProcessAckPacket(&frame); |
3565 } | 3610 } |
3566 | 3611 |
3567 TEST_P(QuicConnectionTest, AckNotifierFailToTriggerCallback) { | 3612 TEST_P(QuicConnectionTest, AckNotifierFailToTriggerCallback) { |
| 3613 SetUpMockLossAlgorithm(); |
3568 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 3614 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
3569 | 3615 |
3570 // Create a delegate which we don't expect to be called. | 3616 // Create a delegate which we don't expect to be called. |
3571 scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate); | 3617 scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate); |
3572 EXPECT_CALL(*delegate, OnAckNotification()).Times(0); | 3618 EXPECT_CALL(*delegate, OnAckNotification()).Times(0); |
3573 | 3619 |
3574 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); | 3620 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); |
3575 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(2); | 3621 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(2); |
3576 | 3622 |
3577 // Send some data, which will register the delegate to be notified. This will | 3623 // Send some data, which will register the delegate to be notified. This will |
3578 // not be ACKed and so the delegate should never be called. | 3624 // not be ACKed and so the delegate should never be called. |
3579 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, delegate.get()); | 3625 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, delegate.get()); |
3580 | 3626 |
3581 // Send some other data which we will ACK. | 3627 // Send some other data which we will ACK. |
3582 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL); | 3628 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL); |
3583 connection_.SendStreamDataWithString(1, "bar", 0, !kFin, NULL); | 3629 connection_.SendStreamDataWithString(1, "bar", 0, !kFin, NULL); |
3584 | 3630 |
3585 // Now we receive ACK for packets 2 and 3, but importantly missing packet 1 | 3631 // Now we receive ACK for packets 2 and 3, but importantly missing packet 1 |
3586 // which we registered to be notified about. | 3632 // which we registered to be notified about. |
3587 QuicAckFrame frame = InitAckFrame(3, 0); | 3633 QuicAckFrame frame = InitAckFrame(3, 0); |
3588 NackPacket(1, &frame); | 3634 NackPacket(1, &frame); |
3589 EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)); | 3635 SequenceNumberSet lost_packets; |
3590 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)); | 3636 lost_packets.insert(1); |
| 3637 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _)) |
| 3638 .WillOnce(Return(lost_packets)); |
| 3639 EXPECT_CALL(*send_algorithm_, OnPacketLost(1, _)); |
| 3640 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _)); |
3591 ProcessAckPacket(&frame); | 3641 ProcessAckPacket(&frame); |
3592 } | 3642 } |
3593 | 3643 |
3594 TEST_P(QuicConnectionTest, AckNotifierCallbackAfterRetransmission) { | 3644 TEST_P(QuicConnectionTest, AckNotifierCallbackAfterRetransmission) { |
| 3645 SetUpMockLossAlgorithm(); |
3595 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 3646 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
3596 | 3647 |
3597 // Create a delegate which we expect to be called. | 3648 // Create a delegate which we expect to be called. |
3598 scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate); | 3649 scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate); |
3599 EXPECT_CALL(*delegate, OnAckNotification()).Times(1); | 3650 EXPECT_CALL(*delegate, OnAckNotification()).Times(1); |
3600 | 3651 |
3601 // In total expect ACKs for all 4 packets. | |
3602 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)).Times(2); | |
3603 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(4); | |
3604 | |
3605 // Send four packets, and register to be notified on ACK of packet 2. | 3652 // Send four packets, and register to be notified on ACK of packet 2. |
3606 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL); | 3653 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL); |
3607 connection_.SendStreamDataWithString(3, "bar", 0, !kFin, delegate.get()); | 3654 connection_.SendStreamDataWithString(3, "bar", 0, !kFin, delegate.get()); |
3608 connection_.SendStreamDataWithString(3, "baz", 0, !kFin, NULL); | 3655 connection_.SendStreamDataWithString(3, "baz", 0, !kFin, NULL); |
3609 connection_.SendStreamDataWithString(3, "qux", 0, !kFin, NULL); | 3656 connection_.SendStreamDataWithString(3, "qux", 0, !kFin, NULL); |
3610 | 3657 |
3611 // Now we receive ACK for packets 1, 3, and 4, which invokes fast retransmit. | 3658 // Now we receive ACK for packets 1, 3, and 4 and lose 2. |
3612 QuicAckFrame frame = InitAckFrame(4, 0); | 3659 QuicAckFrame frame = InitAckFrame(4, 0); |
3613 NackPacket(2, &frame); | 3660 NackPacket(2, &frame); |
| 3661 SequenceNumberSet lost_packets; |
| 3662 lost_packets.insert(2); |
| 3663 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _)) |
| 3664 .WillOnce(Return(lost_packets)); |
| 3665 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); |
| 3666 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(3); |
3614 EXPECT_CALL(*send_algorithm_, OnPacketLost(2, _)); | 3667 EXPECT_CALL(*send_algorithm_, OnPacketLost(2, _)); |
3615 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(2, _)); | 3668 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(2, _)); |
3616 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); | 3669 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); |
3617 ProcessAckPacket(&frame); | 3670 ProcessAckPacket(&frame); |
3618 | 3671 |
3619 // Now we get an ACK for packet 5 (retransmitted packet 2), which should | 3672 // Now we get an ACK for packet 5 (retransmitted packet 2), which should |
3620 // trigger the callback. | 3673 // trigger the callback. |
| 3674 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _)) |
| 3675 .WillRepeatedly(Return(SequenceNumberSet())); |
| 3676 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); |
| 3677 EXPECT_CALL(*send_algorithm_, OnPacketAcked(5, _)); |
3621 QuicAckFrame second_ack_frame = InitAckFrame(5, 0); | 3678 QuicAckFrame second_ack_frame = InitAckFrame(5, 0); |
3622 ProcessAckPacket(&second_ack_frame); | 3679 ProcessAckPacket(&second_ack_frame); |
3623 } | 3680 } |
3624 | 3681 |
3625 // TODO(rjshade): Add a similar test that FEC recovery on peer (and resulting | 3682 // TODO(rjshade): Add a similar test that FEC recovery on peer (and resulting |
3626 // ACK) triggers notification on our end. | 3683 // ACK) triggers notification on our end. |
3627 TEST_P(QuicConnectionTest, AckNotifierCallbackAfterFECRecovery) { | 3684 TEST_P(QuicConnectionTest, AckNotifierCallbackAfterFECRecovery) { |
3628 if (version() < QUIC_VERSION_15) { | 3685 if (version() < QUIC_VERSION_15) { |
3629 return; | 3686 return; |
3630 } | 3687 } |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3768 QuicBlockedFrame blocked; | 3825 QuicBlockedFrame blocked; |
3769 blocked.stream_id = 3; | 3826 blocked.stream_id = 3; |
3770 EXPECT_CALL(visitor_, OnBlockedFrames(_)); | 3827 EXPECT_CALL(visitor_, OnBlockedFrames(_)); |
3771 ProcessFramePacket(QuicFrame(&blocked)); | 3828 ProcessFramePacket(QuicFrame(&blocked)); |
3772 EXPECT_TRUE(ack_alarm->IsSet()); | 3829 EXPECT_TRUE(ack_alarm->IsSet()); |
3773 } | 3830 } |
3774 | 3831 |
3775 } // namespace | 3832 } // namespace |
3776 } // namespace test | 3833 } // namespace test |
3777 } // namespace net | 3834 } // namespace net |
OLD | NEW |