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" |
(...skipping 2724 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2735 EXPECT_EQ(default_timeout.Add(QuicTime::Delta::FromMilliseconds(5)), | 2735 EXPECT_EQ(default_timeout.Add(QuicTime::Delta::FromMilliseconds(5)), |
2736 clock_.ApproximateNow()); | 2736 clock_.ApproximateNow()); |
2737 connection_.GetTimeoutAlarm()->Fire(); | 2737 connection_.GetTimeoutAlarm()->Fire(); |
2738 EXPECT_FALSE(connection_.GetTimeoutAlarm()->IsSet()); | 2738 EXPECT_FALSE(connection_.GetTimeoutAlarm()->IsSet()); |
2739 EXPECT_FALSE(connection_.connected()); | 2739 EXPECT_FALSE(connection_.connected()); |
2740 } | 2740 } |
2741 | 2741 |
2742 TEST_P(QuicConnectionTest, SendScheduler) { | 2742 TEST_P(QuicConnectionTest, SendScheduler) { |
2743 // Test that if we send a packet without delay, it is not queued. | 2743 // Test that if we send a packet without delay, it is not queued. |
2744 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); | 2744 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
2745 EXPECT_CALL(*send_algorithm_, | |
2746 TimeUntilSend(_, _, _)).WillOnce( | |
2747 testing::Return(QuicTime::Delta::Zero())); | |
2748 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); | 2745 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); |
2749 connection_.SendPacket( | 2746 connection_.SendPacket( |
2750 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); | 2747 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); |
2751 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 2748 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
2752 } | 2749 } |
2753 | 2750 |
2754 TEST_P(QuicConnectionTest, SendSchedulerDelay) { | 2751 TEST_P(QuicConnectionTest, SendSchedulerEAGAIN) { |
2755 // Test that if we send a packet with a delay, it ends up queued. | |
2756 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); | 2752 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
2757 EXPECT_CALL(*send_algorithm_, | 2753 BlockOnNextWrite(); |
2758 TimeUntilSend(_, _, _)).WillOnce( | |
2759 testing::Return(QuicTime::Delta::FromMicroseconds(1))); | |
2760 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _)).Times(0); | 2754 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _)).Times(0); |
2761 connection_.SendPacket( | 2755 connection_.SendPacket( |
2762 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); | 2756 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); |
2763 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 2757 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
2764 } | 2758 } |
2765 | 2759 |
2766 TEST_P(QuicConnectionTest, SendSchedulerEAGAIN) { | |
2767 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); | |
2768 BlockOnNextWrite(); | |
2769 EXPECT_CALL(*send_algorithm_, | |
2770 TimeUntilSend(_, _, _)).WillOnce( | |
2771 testing::Return(QuicTime::Delta::Zero())); | |
2772 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _)).Times(0); | |
2773 connection_.SendPacket( | |
2774 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); | |
2775 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | |
2776 } | |
2777 | |
2778 TEST_P(QuicConnectionTest, SendSchedulerDelayThenSend) { | |
2779 // Test that if we send a packet with a delay, it ends up queued. | |
2780 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); | |
2781 EXPECT_CALL(*send_algorithm_, | |
2782 TimeUntilSend(_, _, _)).WillOnce( | |
2783 testing::Return(QuicTime::Delta::FromMicroseconds(1))); | |
2784 connection_.SendPacket( | |
2785 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); | |
2786 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | |
2787 | |
2788 // Advance the clock to fire the alarm, and configure the scheduler | |
2789 // to permit the packet to be sent. | |
2790 EXPECT_CALL(*send_algorithm_, | |
2791 TimeUntilSend(_, _, _)).WillRepeatedly( | |
2792 testing::Return(QuicTime::Delta::Zero())); | |
2793 clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(1)); | |
2794 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); | |
2795 connection_.GetSendAlarm()->Fire(); | |
2796 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | |
2797 } | |
2798 | |
2799 TEST_P(QuicConnectionTest, SendSchedulerDelayThenRetransmit) { | |
2800 CongestionUnblockWrites(); | |
2801 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _)); | |
2802 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL); | |
2803 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | |
2804 // Advance the time for retransmission of lost packet. | |
2805 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(501)); | |
2806 // Test that if we send a retransmit with a delay, it ends up queued in the | |
2807 // sent packet manager, but not yet serialized. | |
2808 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | |
2809 CongestionBlockWrites(); | |
2810 connection_.GetRetransmissionAlarm()->Fire(); | |
2811 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | |
2812 | |
2813 // Advance the clock to fire the alarm, and configure the scheduler | |
2814 // to permit the packet to be sent. | |
2815 CongestionUnblockWrites(); | |
2816 | |
2817 // Ensure the scheduler is notified this is a retransmit. | |
2818 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); | |
2819 clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(1)); | |
2820 connection_.GetSendAlarm()->Fire(); | |
2821 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | |
2822 } | |
2823 | |
2824 TEST_P(QuicConnectionTest, SendSchedulerDelayAndQueue) { | |
2825 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); | |
2826 EXPECT_CALL(*send_algorithm_, | |
2827 TimeUntilSend(_, _, _)).WillOnce( | |
2828 testing::Return(QuicTime::Delta::FromMicroseconds(1))); | |
2829 connection_.SendPacket( | |
2830 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); | |
2831 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | |
2832 | |
2833 // Attempt to send another packet and make sure that it gets queued. | |
2834 packet = ConstructDataPacket(2, 0, !kEntropyFlag); | |
2835 connection_.SendPacket( | |
2836 ENCRYPTION_NONE, 2, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); | |
2837 EXPECT_EQ(2u, connection_.NumQueuedPackets()); | |
2838 } | |
2839 | |
2840 TEST_P(QuicConnectionTest, SendSchedulerDelayThenAckAndSend) { | |
2841 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | |
2842 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); | |
2843 EXPECT_CALL(*send_algorithm_, | |
2844 TimeUntilSend(_, _, _)).WillOnce( | |
2845 testing::Return(QuicTime::Delta::FromMicroseconds(10))); | |
2846 connection_.SendPacket( | |
2847 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); | |
2848 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | |
2849 | |
2850 // Now send non-retransmitting information, that we're not going to | |
2851 // retransmit 3. The far end should stop waiting for it. | |
2852 QuicAckFrame frame = InitAckFrame(0); | |
2853 EXPECT_CALL(*send_algorithm_, | |
2854 TimeUntilSend(_, _, _)).WillRepeatedly( | |
2855 testing::Return(QuicTime::Delta::Zero())); | |
2856 EXPECT_CALL(*send_algorithm_, | |
2857 OnPacketSent(_, _, _, _, _)); | |
2858 ProcessAckPacket(&frame); | |
2859 | |
2860 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | |
2861 // Ensure alarm is not set | |
2862 EXPECT_FALSE(connection_.GetSendAlarm()->IsSet()); | |
2863 } | |
2864 | |
2865 TEST_P(QuicConnectionTest, SendSchedulerDelayThenAckAndHold) { | |
2866 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | |
2867 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); | |
2868 EXPECT_CALL(*send_algorithm_, | |
2869 TimeUntilSend(_, _, _)).WillOnce( | |
2870 testing::Return(QuicTime::Delta::FromMicroseconds(10))); | |
2871 connection_.SendPacket( | |
2872 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); | |
2873 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | |
2874 | |
2875 // Now send non-retransmitting information, that we're not going to | |
2876 // retransmit 3. The far end should stop waiting for it. | |
2877 QuicAckFrame frame = InitAckFrame(0); | |
2878 EXPECT_CALL(*send_algorithm_, | |
2879 TimeUntilSend(_, _, _)).WillOnce( | |
2880 testing::Return(QuicTime::Delta::FromMicroseconds(1))); | |
2881 ProcessAckPacket(&frame); | |
2882 | |
2883 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | |
2884 } | |
2885 | |
2886 TEST_P(QuicConnectionTest, SendSchedulerDelayThenOnCanWrite) { | |
2887 // TODO(ianswett): This test is unrealistic, because we would not serialize | |
2888 // new data if the send algorithm said not to. | |
2889 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); | |
2890 CongestionBlockWrites(); | |
2891 connection_.SendPacket( | |
2892 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); | |
2893 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | |
2894 | |
2895 // OnCanWrite should send the packet, because it won't consult the send | |
2896 // algorithm for queued packets. | |
2897 connection_.OnCanWrite(); | |
2898 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | |
2899 } | |
2900 | |
2901 TEST_P(QuicConnectionTest, TestQueueLimitsOnSendStreamData) { | 2760 TEST_P(QuicConnectionTest, TestQueueLimitsOnSendStreamData) { |
2902 // All packets carry version info till version is negotiated. | 2761 // All packets carry version info till version is negotiated. |
2903 size_t payload_length; | 2762 size_t payload_length; |
2904 size_t length = GetPacketLengthForOneStream( | 2763 size_t length = GetPacketLengthForOneStream( |
2905 connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER, | 2764 connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER, |
2906 NOT_IN_FEC_GROUP, &payload_length); | 2765 NOT_IN_FEC_GROUP, &payload_length); |
2907 QuicConnectionPeer::GetPacketCreator(&connection_)->set_max_packet_length( | 2766 QuicConnectionPeer::GetPacketCreator(&connection_)->set_max_packet_length( |
2908 length); | 2767 length); |
2909 | 2768 |
2910 // Queue the first packet. | 2769 // Queue the first packet. |
(...skipping 1093 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4004 QuicBlockedFrame blocked; | 3863 QuicBlockedFrame blocked; |
4005 blocked.stream_id = 3; | 3864 blocked.stream_id = 3; |
4006 EXPECT_CALL(visitor_, OnBlockedFrames(_)); | 3865 EXPECT_CALL(visitor_, OnBlockedFrames(_)); |
4007 ProcessFramePacket(QuicFrame(&blocked)); | 3866 ProcessFramePacket(QuicFrame(&blocked)); |
4008 EXPECT_TRUE(ack_alarm->IsSet()); | 3867 EXPECT_TRUE(ack_alarm->IsSet()); |
4009 } | 3868 } |
4010 | 3869 |
4011 } // namespace | 3870 } // namespace |
4012 } // namespace test | 3871 } // namespace test |
4013 } // namespace net | 3872 } // namespace net |
OLD | NEW |