| 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 "net/base/net_errors.h" | 7 #include "net/base/net_errors.h" |
| 8 #include "net/quic/congestion_control/quic_receipt_metrics_collector.h" | 8 #include "net/quic/congestion_control/quic_receipt_metrics_collector.h" |
| 9 #include "net/quic/congestion_control/quic_send_scheduler.h" | 9 #include "net/quic/congestion_control/quic_send_scheduler.h" |
| 10 #include "net/quic/crypto/quic_encrypter.h" | 10 #include "net/quic/crypto/quic_encrypter.h" |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 162 void SetCollector(QuicReceiptMetricsCollector* collector) { | 162 void SetCollector(QuicReceiptMetricsCollector* collector) { |
| 163 QuicConnectionPeer::SetCollector(this, collector); | 163 QuicConnectionPeer::SetCollector(this, collector); |
| 164 } | 164 } |
| 165 | 165 |
| 166 void SetScheduler(QuicSendScheduler* scheduler) { | 166 void SetScheduler(QuicSendScheduler* scheduler) { |
| 167 QuicConnectionPeer::SetScheduler(this, scheduler); | 167 QuicConnectionPeer::SetScheduler(this, scheduler); |
| 168 } | 168 } |
| 169 | 169 |
| 170 bool SendPacket(QuicPacketSequenceNumber sequence_number, | 170 bool SendPacket(QuicPacketSequenceNumber sequence_number, |
| 171 QuicPacket* packet, | 171 QuicPacket* packet, |
| 172 bool resend, | 172 bool should_resend, |
| 173 bool force) { | 173 bool force, |
| 174 return QuicConnection::SendPacket(sequence_number, packet, resend, force); | 174 bool is_retransmit) { |
| 175 return QuicConnection::SendPacket( |
| 176 sequence_number, packet, should_resend, force, is_retransmit); |
| 175 } | 177 } |
| 176 }; | 178 }; |
| 177 | 179 |
| 178 class QuicConnectionTest : public ::testing::Test { | 180 class QuicConnectionTest : public ::testing::Test { |
| 179 protected: | 181 protected: |
| 180 QuicConnectionTest() | 182 QuicConnectionTest() |
| 181 : guid_(42), | 183 : guid_(42), |
| 182 framer_(QuicDecrypter::Create(kNULL), QuicEncrypter::Create(kNULL)), | 184 framer_(QuicDecrypter::Create(kNULL), QuicEncrypter::Create(kNULL)), |
| 183 creator_(guid_, &framer_), | 185 creator_(guid_, &framer_), |
| 184 scheduler_(new MockScheduler()), | 186 scheduler_(new MockScheduler()), |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 288 bool NonRetransmitting(QuicPacketSequenceNumber number) { | 290 bool NonRetransmitting(QuicPacketSequenceNumber number) { |
| 289 return last_frame()->sent_info.non_retransmiting.find( | 291 return last_frame()->sent_info.non_retransmiting.find( |
| 290 number) != | 292 number) != |
| 291 last_frame()->sent_info.non_retransmiting.end(); | 293 last_frame()->sent_info.non_retransmiting.end(); |
| 292 } | 294 } |
| 293 | 295 |
| 294 QuicPacket* ConstructDataPacket(QuicPacketSequenceNumber number, | 296 QuicPacket* ConstructDataPacket(QuicPacketSequenceNumber number, |
| 295 QuicFecGroupNumber fec_group) { | 297 QuicFecGroupNumber fec_group) { |
| 296 header_.guid = guid_; | 298 header_.guid = guid_; |
| 297 header_.packet_sequence_number = number; | 299 header_.packet_sequence_number = number; |
| 298 header_.retransmission_count = 0; | |
| 299 header_.transmission_time = 0; | 300 header_.transmission_time = 0; |
| 300 header_.flags = PACKET_FLAGS_NONE; | 301 header_.flags = PACKET_FLAGS_NONE; |
| 301 header_.fec_group = fec_group; | 302 header_.fec_group = fec_group; |
| 302 | 303 |
| 303 QuicFrames frames; | 304 QuicFrames frames; |
| 304 QuicFrame frame(&frame1_); | 305 QuicFrame frame(&frame1_); |
| 305 frames.push_back(frame); | 306 frames.push_back(frame); |
| 306 QuicPacket* packet = NULL; | 307 QuicPacket* packet = NULL; |
| 307 EXPECT_TRUE(framer_.ConstructFragementDataPacket(header_, frames, &packet)); | 308 EXPECT_TRUE(framer_.ConstructFrameDataPacket(header_, frames, &packet)); |
| 308 return packet; | 309 return packet; |
| 309 } | 310 } |
| 310 | 311 |
| 311 QuicGuid guid_; | 312 QuicGuid guid_; |
| 312 QuicFramer framer_; | 313 QuicFramer framer_; |
| 313 QuicPacketCreator creator_; | 314 QuicPacketCreator creator_; |
| 314 | 315 |
| 315 MockScheduler* scheduler_; | 316 MockScheduler* scheduler_; |
| 316 MockClock clock_; | 317 MockClock clock_; |
| 317 TestConnectionHelper* helper_; | 318 TestConnectionHelper* helper_; |
| (...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 681 ProcessFecProtectedPacket(4, false); | 682 ProcessFecProtectedPacket(4, false); |
| 682 ProcessFecProtectedPacket(5, true); | 683 ProcessFecProtectedPacket(5, true); |
| 683 } | 684 } |
| 684 | 685 |
| 685 TEST_F(QuicConnectionTest, TestResend) { | 686 TEST_F(QuicConnectionTest, TestResend) { |
| 686 // TODO(rch): make this work | 687 // TODO(rch): make this work |
| 687 // FLAGS_fake_packet_loss_percentage = 100; | 688 // FLAGS_fake_packet_loss_percentage = 100; |
| 688 const uint64 kDefaultResendTimeMs = 500u; | 689 const uint64 kDefaultResendTimeMs = 500u; |
| 689 | 690 |
| 690 connection_.SendStreamData(1, "foo", 0, false, NULL); | 691 connection_.SendStreamData(1, "foo", 0, false, NULL); |
| 691 EXPECT_EQ(0u, last_header()->retransmission_count); | 692 EXPECT_EQ(1u, last_header()->packet_sequence_number); |
| 692 EXPECT_EQ(0u, last_header()->transmission_time); | 693 EXPECT_EQ(0u, last_header()->transmission_time); |
| 693 EXPECT_EQ(1u, helper_->resend_alarms().size()); | 694 EXPECT_EQ(1u, helper_->resend_alarms().size()); |
| 694 EXPECT_EQ(kDefaultResendTimeMs * 1000, | 695 EXPECT_EQ(kDefaultResendTimeMs * 1000, |
| 695 helper_->resend_alarms().find(1)->second); | 696 helper_->resend_alarms().find(1)->second); |
| 696 // Simulate the resend alarm firing | 697 // Simulate the resend alarm firing |
| 697 clock_.AdvanceTimeInMicroseconds(kDefaultResendTimeMs * 1000); | 698 clock_.AdvanceTimeInMicroseconds(kDefaultResendTimeMs * 1000); |
| 698 connection_.MaybeResendPacket(1); | 699 connection_.MaybeResendPacket(1); |
| 699 EXPECT_EQ(1u, last_header()->retransmission_count); | 700 EXPECT_EQ(2u, last_header()->packet_sequence_number); |
| 700 EXPECT_EQ(kDefaultResendTimeMs * 1000, | 701 EXPECT_EQ(kDefaultResendTimeMs * 1000, |
| 701 last_header()->transmission_time); | 702 last_header()->transmission_time); |
| 702 } | 703 } |
| 703 | 704 |
| 704 | |
| 705 TEST_F(QuicConnectionTest, TestQueued) { | 705 TEST_F(QuicConnectionTest, TestQueued) { |
| 706 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 706 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
| 707 helper_->set_blocked(true); | 707 helper_->set_blocked(true); |
| 708 connection_.SendStreamData(1, "foo", 0, false, NULL); | 708 connection_.SendStreamData(1, "foo", 0, false, NULL); |
| 709 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 709 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 710 | 710 |
| 711 // Attempt to send all packets, but since we're actually still | 711 // Attempt to send all packets, but since we're actually still |
| 712 // blocked, they should all remain queued. | 712 // blocked, they should all remain queued. |
| 713 EXPECT_FALSE(connection_.OnCanWrite()); | 713 EXPECT_FALSE(connection_.OnCanWrite()); |
| 714 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 714 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 799 EXPECT_EQ(kDefaultTimeout + 5000, helper_->timeout_alarm()); | 799 EXPECT_EQ(kDefaultTimeout + 5000, helper_->timeout_alarm()); |
| 800 | 800 |
| 801 // This time, we should time out. | 801 // This time, we should time out. |
| 802 EXPECT_CALL(visitor_, ConnectionClose(QUIC_CONNECTION_TIMED_OUT, false)); | 802 EXPECT_CALL(visitor_, ConnectionClose(QUIC_CONNECTION_TIMED_OUT, false)); |
| 803 clock_.AdvanceTimeInMicroseconds(5000); | 803 clock_.AdvanceTimeInMicroseconds(5000); |
| 804 EXPECT_EQ(kDefaultTimeout + 5000, clock_.NowInUsec()); | 804 EXPECT_EQ(kDefaultTimeout + 5000, clock_.NowInUsec()); |
| 805 EXPECT_TRUE(connection_.CheckForTimeout()); | 805 EXPECT_TRUE(connection_.CheckForTimeout()); |
| 806 EXPECT_FALSE(connection_.connected()); | 806 EXPECT_FALSE(connection_.connected()); |
| 807 } | 807 } |
| 808 | 808 |
| 809 // TODO(ianswett): Add scheduler tests when resend is false. |
| 809 TEST_F(QuicConnectionTest, SendScheduler) { | 810 TEST_F(QuicConnectionTest, SendScheduler) { |
| 810 // Test that if we send a packet without delay, it is not queued. | 811 // Test that if we send a packet without delay, it is not queued. |
| 811 scoped_ptr<QuicPacket> packet(ConstructDataPacket(1, 0)); | 812 scoped_ptr<QuicPacket> packet(ConstructDataPacket(1, 0)); |
| 812 EXPECT_CALL(*scheduler_, TimeUntilSend(true)).WillOnce(testing::Return(0)); | 813 EXPECT_CALL(*scheduler_, TimeUntilSend(true)).WillOnce(testing::Return(0)); |
| 813 connection_.SendPacket(1, packet.get(), true, false); | 814 connection_.SendPacket(1, packet.get(), true, false, false); |
| 814 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 815 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
| 815 } | 816 } |
| 816 | 817 |
| 817 TEST_F(QuicConnectionTest, SendSchedulerDelay) { | 818 TEST_F(QuicConnectionTest, SendSchedulerDelay) { |
| 818 // Test that if we send a packet with a delay, it ends up queued. | 819 // Test that if we send a packet with a delay, it ends up queued. |
| 819 scoped_ptr<QuicPacket> packet(ConstructDataPacket(1, 0)); | 820 scoped_ptr<QuicPacket> packet(ConstructDataPacket(1, 0)); |
| 820 EXPECT_CALL(*scheduler_, TimeUntilSend(true)).WillOnce(testing::Return(1)); | 821 EXPECT_CALL(*scheduler_, TimeUntilSend(true)).WillOnce(testing::Return(1)); |
| 821 EXPECT_CALL(*scheduler_, SentPacket(1, _, _)).Times(0); | 822 EXPECT_CALL(*scheduler_, SentPacket(1, _, _)).Times(0); |
| 822 connection_.SendPacket(1, packet.get(), true, false); | 823 connection_.SendPacket(1, packet.get(), true, false, false); |
| 823 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 824 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 824 } | 825 } |
| 825 | 826 |
| 826 TEST_F(QuicConnectionTest, SendSchedulerForce) { | 827 TEST_F(QuicConnectionTest, SendSchedulerForce) { |
| 827 // Test that if we force send a packet, it is not queued. | 828 // Test that if we force send a packet, it is not queued. |
| 828 scoped_ptr<QuicPacket> packet(ConstructDataPacket(1, 0)); | 829 scoped_ptr<QuicPacket> packet(ConstructDataPacket(1, 0)); |
| 829 EXPECT_CALL(*scheduler_, TimeUntilSend(true)).Times(0); | 830 EXPECT_CALL(*scheduler_, TimeUntilSend(true)).Times(0); |
| 830 connection_.SendPacket(1, packet.get(), true, true); | 831 connection_.SendPacket(1, packet.get(), true, true, false); |
| 831 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 832 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
| 832 } | 833 } |
| 833 | 834 |
| 834 TEST_F(QuicConnectionTest, SendSchedulerEAGAIN) { | 835 TEST_F(QuicConnectionTest, SendSchedulerEAGAIN) { |
| 835 scoped_ptr<QuicPacket> packet(ConstructDataPacket(1, 0)); | 836 scoped_ptr<QuicPacket> packet(ConstructDataPacket(1, 0)); |
| 836 helper_->set_blocked(true); | 837 helper_->set_blocked(true); |
| 837 EXPECT_CALL(*scheduler_, TimeUntilSend(true)).WillOnce(testing::Return(0)); | 838 EXPECT_CALL(*scheduler_, TimeUntilSend(true)).WillOnce(testing::Return(0)); |
| 838 EXPECT_CALL(*scheduler_, SentPacket(1, _, _)).Times(0); | 839 EXPECT_CALL(*scheduler_, SentPacket(1, _, _)).Times(0); |
| 839 connection_.SendPacket(1, packet.get(), true, false); | 840 connection_.SendPacket(1, packet.get(), true, false, false); |
| 840 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 841 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 841 } | 842 } |
| 842 | 843 |
| 843 TEST_F(QuicConnectionTest, SendSchedulerDelayThenSend) { | 844 TEST_F(QuicConnectionTest, SendSchedulerDelayThenSend) { |
| 844 // Test that if we send a packet with a delay, it ends up queued. | 845 // Test that if we send a packet with a delay, it ends up queued. |
| 845 scoped_ptr<QuicPacket> packet(ConstructDataPacket(1, 0)); | 846 scoped_ptr<QuicPacket> packet(ConstructDataPacket(1, 0)); |
| 846 EXPECT_CALL(*scheduler_, TimeUntilSend(true)).WillOnce(testing::Return(1)); | 847 EXPECT_CALL(*scheduler_, TimeUntilSend(true)).WillOnce(testing::Return(1)); |
| 847 connection_.SendPacket(1, packet.get(), true, false); | 848 connection_.SendPacket(1, packet.get(), true, false, false); |
| 848 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 849 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 849 | 850 |
| 850 // Advance the clock to fire the alarm, and configure the scheduler | 851 // Advance the clock to fire the alarm, and configure the scheduler |
| 851 // to permit the packet to be sent. | 852 // to permit the packet to be sent. |
| 852 EXPECT_CALL(*scheduler_, TimeUntilSend(true)).WillOnce(testing::Return(0)); | 853 EXPECT_CALL(*scheduler_, TimeUntilSend(true)).WillOnce(testing::Return(0)); |
| 853 clock_.AdvanceTimeInMicroseconds(1); | 854 clock_.AdvanceTimeInMicroseconds(1); |
| 854 connection_.OnCanWrite(); | 855 connection_.OnCanWrite(); |
| 855 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 856 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
| 856 } | 857 } |
| 857 | 858 |
| 859 TEST_F(QuicConnectionTest, SendSchedulerDelayThenRetransmit) { |
| 860 // Test that if we send a retransmit with a delay, it ends up queued. |
| 861 scoped_ptr<QuicPacket> packet(ConstructDataPacket(1, 0)); |
| 862 EXPECT_CALL(*scheduler_, TimeUntilSend(true)).WillOnce(testing::Return(1)); |
| 863 connection_.SendPacket(1, packet.get(), true, false, true); |
| 864 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 865 |
| 866 // Advance the clock to fire the alarm, and configure the scheduler |
| 867 // to permit the packet to be sent. |
| 868 EXPECT_CALL(*scheduler_, TimeUntilSend(true)).WillOnce(testing::Return(0)); |
| 869 clock_.AdvanceTimeInMicroseconds(1); |
| 870 |
| 871 // Ensure the scheduler is notified this is a retransmit. |
| 872 EXPECT_CALL(*scheduler_, SentPacket(1, _, true)); |
| 873 clock_.AdvanceTimeInMicroseconds(1); |
| 874 connection_.OnCanWrite(); |
| 875 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
| 876 } |
| 877 |
| 858 TEST_F(QuicConnectionTest, SendSchedulerDelayAndQueue) { | 878 TEST_F(QuicConnectionTest, SendSchedulerDelayAndQueue) { |
| 859 scoped_ptr<QuicPacket> packet(ConstructDataPacket(1, 0)); | 879 scoped_ptr<QuicPacket> packet(ConstructDataPacket(1, 0)); |
| 860 EXPECT_CALL(*scheduler_, TimeUntilSend(true)).WillOnce(testing::Return(1)); | 880 EXPECT_CALL(*scheduler_, TimeUntilSend(true)).WillOnce(testing::Return(1)); |
| 861 connection_.SendPacket(1, packet.get(), true, false); | 881 connection_.SendPacket(1, packet.get(), true, false, false); |
| 862 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 882 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 863 | 883 |
| 864 // Attempt to send another packet and make sure that it gets queued. | 884 // Attempt to send another packet and make sure that it gets queued. |
| 865 connection_.SendPacket(2, packet.get(), true, false); | 885 connection_.SendPacket(2, packet.get(), true, false, false); |
| 866 EXPECT_EQ(2u, connection_.NumQueuedPackets()); | 886 EXPECT_EQ(2u, connection_.NumQueuedPackets()); |
| 867 } | 887 } |
| 868 | 888 |
| 869 TEST_F(QuicConnectionTest, SendSchedulerDelayThenAckAndSend) { | 889 TEST_F(QuicConnectionTest, SendSchedulerDelayThenAckAndSend) { |
| 870 scoped_ptr<QuicPacket> packet(ConstructDataPacket(1, 0)); | 890 scoped_ptr<QuicPacket> packet(ConstructDataPacket(1, 0)); |
| 871 EXPECT_CALL(*scheduler_, TimeUntilSend(true)).WillOnce(testing::Return(10)); | 891 EXPECT_CALL(*scheduler_, TimeUntilSend(true)).WillOnce(testing::Return(10)); |
| 872 connection_.SendPacket(1, packet.get(), true, false); | 892 connection_.SendPacket(1, packet.get(), true, false, false); |
| 873 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 893 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 874 | 894 |
| 875 // Now send non-retransmitting information, that we're not going to resend 3. | 895 // Now send non-retransmitting information, that we're not going to resend 3. |
| 876 // The far end should stop waiting for it. | 896 // The far end should stop waiting for it. |
| 877 QuicAckFrame frame(0, 0, 1); | 897 QuicAckFrame frame(0, 0, 1); |
| 878 frame.sent_info.non_retransmiting.insert(3); | 898 frame.sent_info.non_retransmiting.insert(3); |
| 879 EXPECT_CALL(*scheduler_, OnIncomingAckFrame(testing::_)); | 899 EXPECT_CALL(*scheduler_, OnIncomingAckFrame(testing::_)); |
| 880 EXPECT_CALL(*scheduler_, TimeUntilSend(true)) | 900 EXPECT_CALL(*scheduler_, TimeUntilSend(true)) |
| 881 .WillRepeatedly(testing::Return(0)); | 901 .WillRepeatedly(testing::Return(0)); |
| 882 SendAckPacket(&frame); | 902 SendAckPacket(&frame); |
| 883 | 903 |
| 884 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 904 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
| 885 // Ensure alarm is not set | 905 // Ensure alarm is not set |
| 886 EXPECT_FALSE(helper_->IsSendAlarmSet()); | 906 EXPECT_FALSE(helper_->IsSendAlarmSet()); |
| 887 } | 907 } |
| 888 | 908 |
| 889 TEST_F(QuicConnectionTest, SendSchedulerDelayThenAckAndHold) { | 909 TEST_F(QuicConnectionTest, SendSchedulerDelayThenAckAndHold) { |
| 890 scoped_ptr<QuicPacket> packet(ConstructDataPacket(1, 0)); | 910 scoped_ptr<QuicPacket> packet(ConstructDataPacket(1, 0)); |
| 891 EXPECT_CALL(*scheduler_, TimeUntilSend(true)).WillOnce(testing::Return(10)); | 911 EXPECT_CALL(*scheduler_, TimeUntilSend(true)).WillOnce(testing::Return(10)); |
| 892 connection_.SendPacket(1, packet.get(), true, false); | 912 connection_.SendPacket(1, packet.get(), true, false, false); |
| 893 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 913 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 894 | 914 |
| 895 // Now send non-resending information, that we're not going to resend 3. | 915 // Now send non-resending information, that we're not going to resend 3. |
| 896 // The far end should stop waiting for it. | 916 // The far end should stop waiting for it. |
| 897 QuicAckFrame frame(0, 0, 1); | 917 QuicAckFrame frame(0, 0, 1); |
| 898 frame.sent_info.non_retransmiting.insert(3); | 918 frame.sent_info.non_retransmiting.insert(3); |
| 899 EXPECT_CALL(*scheduler_, OnIncomingAckFrame(testing::_)); | 919 EXPECT_CALL(*scheduler_, OnIncomingAckFrame(testing::_)); |
| 900 EXPECT_CALL(*scheduler_, TimeUntilSend(true)).WillOnce(testing::Return(1)); | 920 EXPECT_CALL(*scheduler_, TimeUntilSend(true)).WillOnce(testing::Return(1)); |
| 901 SendAckPacket(&frame); | 921 SendAckPacket(&frame); |
| 902 | 922 |
| 903 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 923 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 904 } | 924 } |
| 905 | 925 |
| 906 TEST_F(QuicConnectionTest, SendSchedulerDelayThenOnCanWrite) { | 926 TEST_F(QuicConnectionTest, SendSchedulerDelayThenOnCanWrite) { |
| 907 scoped_ptr<QuicPacket> packet(ConstructDataPacket(1, 0)); | 927 scoped_ptr<QuicPacket> packet(ConstructDataPacket(1, 0)); |
| 908 EXPECT_CALL(*scheduler_, TimeUntilSend(true)).WillOnce(testing::Return(10)); | 928 EXPECT_CALL(*scheduler_, TimeUntilSend(true)).WillOnce(testing::Return(10)); |
| 909 connection_.SendPacket(1, packet.get(), true, false); | 929 connection_.SendPacket(1, packet.get(), true, false, false); |
| 910 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 930 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 911 | 931 |
| 912 // OnCanWrite should not send the packet (because of the delay) | 932 // OnCanWrite should not send the packet (because of the delay) |
| 913 // but should still return true. | 933 // but should still return true. |
| 914 EXPECT_TRUE(connection_.OnCanWrite()); | 934 EXPECT_TRUE(connection_.OnCanWrite()); |
| 915 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 935 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 916 } | 936 } |
| 917 | 937 |
| 918 } // namespace | 938 } // namespace |
| 919 } // namespace test | 939 } // namespace test |
| 920 } // namespace net | 940 } // namespace net |
| OLD | NEW |