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

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

Issue 11377096: Change from re-transmitting an packet with a retransmit number to sending a new packet with a new s… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 1 month 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_helper_test.cc ('k') | net/quic/quic_data_writer.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 "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
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
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
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
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
OLDNEW
« no previous file with comments | « net/quic/quic_connection_helper_test.cc ('k') | net/quic/quic_data_writer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698