| 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 715 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 726 bool entropy_flag, | 726 bool entropy_flag, |
| 727 EncryptionLevel level) { | 727 EncryptionLevel level) { |
| 728 scoped_ptr<QuicPacket> packet(ConstructDataPacket(number, fec_group, | 728 scoped_ptr<QuicPacket> packet(ConstructDataPacket(number, fec_group, |
| 729 entropy_flag)); | 729 entropy_flag)); |
| 730 scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket( | 730 scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket( |
| 731 level, number, *packet)); | 731 level, number, *packet)); |
| 732 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); | 732 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); |
| 733 return encrypted->length(); | 733 return encrypted->length(); |
| 734 } | 734 } |
| 735 | 735 |
| 736 void ProcessPingPacket(QuicPacketSequenceNumber number) { | |
| 737 scoped_ptr<QuicPacket> packet(ConstructPingPacket(number)); | |
| 738 scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket( | |
| 739 ENCRYPTION_NONE, number, *packet)); | |
| 740 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); | |
| 741 } | |
| 742 | |
| 743 void ProcessClosePacket(QuicPacketSequenceNumber number, | 736 void ProcessClosePacket(QuicPacketSequenceNumber number, |
| 744 QuicFecGroupNumber fec_group) { | 737 QuicFecGroupNumber fec_group) { |
| 745 scoped_ptr<QuicPacket> packet(ConstructClosePacket(number, fec_group)); | 738 scoped_ptr<QuicPacket> packet(ConstructClosePacket(number, fec_group)); |
| 746 scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket( | 739 scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket( |
| 747 ENCRYPTION_NONE, number, *packet)); | 740 ENCRYPTION_NONE, number, *packet)); |
| 748 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); | 741 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); |
| 749 } | 742 } |
| 750 | 743 |
| 751 size_t ProcessFecProtectedPacket(QuicPacketSequenceNumber number, | 744 size_t ProcessFecProtectedPacket(QuicPacketSequenceNumber number, |
| 752 bool expect_revival, bool entropy_flag) { | 745 bool expect_revival, bool entropy_flag) { |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 868 header_.fec_flag = false; | 861 header_.fec_flag = false; |
| 869 header_.packet_sequence_number = number; | 862 header_.packet_sequence_number = number; |
| 870 header_.is_in_fec_group = fec_group == 0u ? NOT_IN_FEC_GROUP : IN_FEC_GROUP; | 863 header_.is_in_fec_group = fec_group == 0u ? NOT_IN_FEC_GROUP : IN_FEC_GROUP; |
| 871 header_.fec_group = fec_group; | 864 header_.fec_group = fec_group; |
| 872 | 865 |
| 873 QuicFrames frames; | 866 QuicFrames frames; |
| 874 QuicFrame frame(&frame1_); | 867 QuicFrame frame(&frame1_); |
| 875 frames.push_back(frame); | 868 frames.push_back(frame); |
| 876 QuicPacket* packet = | 869 QuicPacket* packet = |
| 877 BuildUnsizedDataPacket(&framer_, header_, frames).packet; | 870 BuildUnsizedDataPacket(&framer_, header_, frames).packet; |
| 878 EXPECT_TRUE(packet != NULL); | |
| 879 return packet; | |
| 880 } | |
| 881 | |
| 882 QuicPacket* ConstructPingPacket(QuicPacketSequenceNumber number) { | |
| 883 header_.public_header.connection_id = connection_id_; | |
| 884 header_.packet_sequence_number = number; | |
| 885 header_.public_header.reset_flag = false; | |
| 886 header_.public_header.version_flag = false; | |
| 887 header_.entropy_flag = false; | |
| 888 header_.fec_flag = false; | |
| 889 header_.is_in_fec_group = NOT_IN_FEC_GROUP; | |
| 890 header_.fec_group = 0; | |
| 891 | |
| 892 QuicPingFrame ping; | |
| 893 | |
| 894 QuicFrames frames; | |
| 895 QuicFrame frame(&ping); | |
| 896 frames.push_back(frame); | |
| 897 QuicPacket* packet = | |
| 898 BuildUnsizedDataPacket(&framer_, header_, frames).packet; | |
| 899 EXPECT_TRUE(packet != NULL); | 871 EXPECT_TRUE(packet != NULL); |
| 900 return packet; | 872 return packet; |
| 901 } | 873 } |
| 902 | 874 |
| 903 QuicPacket* ConstructClosePacket(QuicPacketSequenceNumber number, | 875 QuicPacket* ConstructClosePacket(QuicPacketSequenceNumber number, |
| 904 QuicFecGroupNumber fec_group) { | 876 QuicFecGroupNumber fec_group) { |
| 905 header_.public_header.connection_id = connection_id_; | 877 header_.public_header.connection_id = connection_id_; |
| 906 header_.packet_sequence_number = number; | 878 header_.packet_sequence_number = number; |
| 907 header_.public_header.reset_flag = false; | 879 header_.public_header.reset_flag = false; |
| 908 header_.public_header.version_flag = false; | 880 header_.public_header.version_flag = false; |
| (...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1393 Return(kMaxPacketSize * 256 * 256 * 256 * 256)); | 1365 Return(kMaxPacketSize * 256 * 256 * 256 * 256)); |
| 1394 | 1366 |
| 1395 SendStreamDataToPeer(1, "foo", 12, !kFin, &last_packet); | 1367 SendStreamDataToPeer(1, "foo", 12, !kFin, &last_packet); |
| 1396 EXPECT_EQ(5u, last_packet); | 1368 EXPECT_EQ(5u, last_packet); |
| 1397 EXPECT_EQ(PACKET_6BYTE_SEQUENCE_NUMBER, | 1369 EXPECT_EQ(PACKET_6BYTE_SEQUENCE_NUMBER, |
| 1398 creator->next_sequence_number_length()); | 1370 creator->next_sequence_number_length()); |
| 1399 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, | 1371 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, |
| 1400 writer_->header().public_header.sequence_number_length); | 1372 writer_->header().public_header.sequence_number_length); |
| 1401 } | 1373 } |
| 1402 | 1374 |
| 1403 // TODO(ianswett): Re-enable this test by finding a good way to test different | 1375 TEST_P(QuicConnectionTest, SendingDifferentSequenceNumberLengthsUnackedDelta) { |
| 1404 // sequence number lengths without sending packets with giant gaps. | |
| 1405 TEST_P(QuicConnectionTest, | |
| 1406 DISABLED_SendingDifferentSequenceNumberLengthsUnackedDelta) { | |
| 1407 QuicPacketSequenceNumber last_packet; | 1376 QuicPacketSequenceNumber last_packet; |
| 1408 QuicPacketCreator* creator = | 1377 QuicPacketCreator* creator = |
| 1409 QuicConnectionPeer::GetPacketCreator(&connection_); | 1378 QuicConnectionPeer::GetPacketCreator(&connection_); |
| 1410 SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet); | 1379 SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet); |
| 1411 EXPECT_EQ(1u, last_packet); | 1380 EXPECT_EQ(1u, last_packet); |
| 1412 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, | 1381 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, |
| 1413 creator->next_sequence_number_length()); | 1382 creator->next_sequence_number_length()); |
| 1414 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, | 1383 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, |
| 1415 writer_->header().public_header.sequence_number_length); | 1384 writer_->header().public_header.sequence_number_length); |
| 1416 | 1385 |
| (...skipping 1318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2735 EXPECT_EQ(default_timeout.Add(QuicTime::Delta::FromMilliseconds(5)), | 2704 EXPECT_EQ(default_timeout.Add(QuicTime::Delta::FromMilliseconds(5)), |
| 2736 clock_.ApproximateNow()); | 2705 clock_.ApproximateNow()); |
| 2737 connection_.GetTimeoutAlarm()->Fire(); | 2706 connection_.GetTimeoutAlarm()->Fire(); |
| 2738 EXPECT_FALSE(connection_.GetTimeoutAlarm()->IsSet()); | 2707 EXPECT_FALSE(connection_.GetTimeoutAlarm()->IsSet()); |
| 2739 EXPECT_FALSE(connection_.connected()); | 2708 EXPECT_FALSE(connection_.connected()); |
| 2740 } | 2709 } |
| 2741 | 2710 |
| 2742 TEST_P(QuicConnectionTest, SendScheduler) { | 2711 TEST_P(QuicConnectionTest, SendScheduler) { |
| 2743 // Test that if we send a packet without delay, it is not queued. | 2712 // Test that if we send a packet without delay, it is not queued. |
| 2744 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); | 2713 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
| 2714 EXPECT_CALL(*send_algorithm_, |
| 2715 TimeUntilSend(_, _, _)).WillOnce( |
| 2716 testing::Return(QuicTime::Delta::Zero())); |
| 2745 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); | 2717 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); |
| 2746 connection_.SendPacket( | 2718 connection_.SendPacket( |
| 2747 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); | 2719 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); |
| 2748 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 2720 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
| 2749 } | 2721 } |
| 2750 | 2722 |
| 2751 TEST_P(QuicConnectionTest, SendSchedulerEAGAIN) { | 2723 TEST_P(QuicConnectionTest, SendSchedulerDelay) { |
| 2724 // Test that if we send a packet with a delay, it ends up queued. |
| 2752 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); | 2725 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
| 2753 BlockOnNextWrite(); | 2726 EXPECT_CALL(*send_algorithm_, |
| 2727 TimeUntilSend(_, _, _)).WillOnce( |
| 2728 testing::Return(QuicTime::Delta::FromMicroseconds(1))); |
| 2754 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _)).Times(0); | 2729 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _)).Times(0); |
| 2755 connection_.SendPacket( | 2730 connection_.SendPacket( |
| 2756 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); | 2731 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); |
| 2757 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 2732 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 2758 } | 2733 } |
| 2759 | 2734 |
| 2735 TEST_P(QuicConnectionTest, SendSchedulerEAGAIN) { |
| 2736 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
| 2737 BlockOnNextWrite(); |
| 2738 EXPECT_CALL(*send_algorithm_, |
| 2739 TimeUntilSend(_, _, _)).WillOnce( |
| 2740 testing::Return(QuicTime::Delta::Zero())); |
| 2741 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _)).Times(0); |
| 2742 connection_.SendPacket( |
| 2743 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); |
| 2744 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 2745 } |
| 2746 |
| 2747 TEST_P(QuicConnectionTest, SendSchedulerDelayThenSend) { |
| 2748 // Test that if we send a packet with a delay, it ends up queued. |
| 2749 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
| 2750 EXPECT_CALL(*send_algorithm_, |
| 2751 TimeUntilSend(_, _, _)).WillOnce( |
| 2752 testing::Return(QuicTime::Delta::FromMicroseconds(1))); |
| 2753 connection_.SendPacket( |
| 2754 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); |
| 2755 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 2756 |
| 2757 // Advance the clock to fire the alarm, and configure the scheduler |
| 2758 // to permit the packet to be sent. |
| 2759 EXPECT_CALL(*send_algorithm_, |
| 2760 TimeUntilSend(_, _, _)).WillRepeatedly( |
| 2761 testing::Return(QuicTime::Delta::Zero())); |
| 2762 clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(1)); |
| 2763 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); |
| 2764 connection_.GetSendAlarm()->Fire(); |
| 2765 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
| 2766 } |
| 2767 |
| 2768 TEST_P(QuicConnectionTest, SendSchedulerDelayThenRetransmit) { |
| 2769 CongestionUnblockWrites(); |
| 2770 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _)); |
| 2771 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL); |
| 2772 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
| 2773 // Advance the time for retransmission of lost packet. |
| 2774 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(501)); |
| 2775 // Test that if we send a retransmit with a delay, it ends up queued in the |
| 2776 // sent packet manager, but not yet serialized. |
| 2777 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); |
| 2778 CongestionBlockWrites(); |
| 2779 connection_.GetRetransmissionAlarm()->Fire(); |
| 2780 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
| 2781 |
| 2782 // Advance the clock to fire the alarm, and configure the scheduler |
| 2783 // to permit the packet to be sent. |
| 2784 CongestionUnblockWrites(); |
| 2785 |
| 2786 // Ensure the scheduler is notified this is a retransmit. |
| 2787 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); |
| 2788 clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(1)); |
| 2789 connection_.GetSendAlarm()->Fire(); |
| 2790 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
| 2791 } |
| 2792 |
| 2793 TEST_P(QuicConnectionTest, SendSchedulerDelayAndQueue) { |
| 2794 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
| 2795 EXPECT_CALL(*send_algorithm_, |
| 2796 TimeUntilSend(_, _, _)).WillOnce( |
| 2797 testing::Return(QuicTime::Delta::FromMicroseconds(1))); |
| 2798 connection_.SendPacket( |
| 2799 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); |
| 2800 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 2801 |
| 2802 // Attempt to send another packet and make sure that it gets queued. |
| 2803 packet = ConstructDataPacket(2, 0, !kEntropyFlag); |
| 2804 connection_.SendPacket( |
| 2805 ENCRYPTION_NONE, 2, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); |
| 2806 EXPECT_EQ(2u, connection_.NumQueuedPackets()); |
| 2807 } |
| 2808 |
| 2809 TEST_P(QuicConnectionTest, SendSchedulerDelayThenAckAndSend) { |
| 2810 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 2811 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
| 2812 EXPECT_CALL(*send_algorithm_, |
| 2813 TimeUntilSend(_, _, _)).WillOnce( |
| 2814 testing::Return(QuicTime::Delta::FromMicroseconds(10))); |
| 2815 connection_.SendPacket( |
| 2816 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); |
| 2817 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 2818 |
| 2819 // Now send non-retransmitting information, that we're not going to |
| 2820 // retransmit 3. The far end should stop waiting for it. |
| 2821 QuicAckFrame frame = InitAckFrame(0); |
| 2822 EXPECT_CALL(*send_algorithm_, |
| 2823 TimeUntilSend(_, _, _)).WillRepeatedly( |
| 2824 testing::Return(QuicTime::Delta::Zero())); |
| 2825 EXPECT_CALL(*send_algorithm_, |
| 2826 OnPacketSent(_, _, _, _, _)); |
| 2827 ProcessAckPacket(&frame); |
| 2828 |
| 2829 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
| 2830 // Ensure alarm is not set |
| 2831 EXPECT_FALSE(connection_.GetSendAlarm()->IsSet()); |
| 2832 } |
| 2833 |
| 2834 TEST_P(QuicConnectionTest, SendSchedulerDelayThenAckAndHold) { |
| 2835 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 2836 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
| 2837 EXPECT_CALL(*send_algorithm_, |
| 2838 TimeUntilSend(_, _, _)).WillOnce( |
| 2839 testing::Return(QuicTime::Delta::FromMicroseconds(10))); |
| 2840 connection_.SendPacket( |
| 2841 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); |
| 2842 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 2843 |
| 2844 // Now send non-retransmitting information, that we're not going to |
| 2845 // retransmit 3. The far end should stop waiting for it. |
| 2846 QuicAckFrame frame = InitAckFrame(0); |
| 2847 EXPECT_CALL(*send_algorithm_, |
| 2848 TimeUntilSend(_, _, _)).WillOnce( |
| 2849 testing::Return(QuicTime::Delta::FromMicroseconds(1))); |
| 2850 ProcessAckPacket(&frame); |
| 2851 |
| 2852 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 2853 } |
| 2854 |
| 2855 TEST_P(QuicConnectionTest, SendSchedulerDelayThenOnCanWrite) { |
| 2856 // TODO(ianswett): This test is unrealistic, because we would not serialize |
| 2857 // new data if the send algorithm said not to. |
| 2858 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
| 2859 CongestionBlockWrites(); |
| 2860 connection_.SendPacket( |
| 2861 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); |
| 2862 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 2863 |
| 2864 // OnCanWrite should send the packet, because it won't consult the send |
| 2865 // algorithm for queued packets. |
| 2866 connection_.OnCanWrite(); |
| 2867 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
| 2868 } |
| 2869 |
| 2760 TEST_P(QuicConnectionTest, TestQueueLimitsOnSendStreamData) { | 2870 TEST_P(QuicConnectionTest, TestQueueLimitsOnSendStreamData) { |
| 2761 // All packets carry version info till version is negotiated. | 2871 // All packets carry version info till version is negotiated. |
| 2762 size_t payload_length; | 2872 size_t payload_length; |
| 2763 size_t length = GetPacketLengthForOneStream( | 2873 size_t length = GetPacketLengthForOneStream( |
| 2764 connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER, | 2874 connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER, |
| 2765 NOT_IN_FEC_GROUP, &payload_length); | 2875 NOT_IN_FEC_GROUP, &payload_length); |
| 2766 QuicConnectionPeer::GetPacketCreator(&connection_)->set_max_packet_length( | 2876 QuicConnectionPeer::GetPacketCreator(&connection_)->set_max_packet_length( |
| 2767 length); | 2877 length); |
| 2768 | 2878 |
| 2769 // Queue the first packet. | 2879 // Queue the first packet. |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2850 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2960 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 2851 ProcessPacket(1); | 2961 ProcessPacket(1); |
| 2852 ProcessPacket(2); | 2962 ProcessPacket(2); |
| 2853 // Check that ack is sent and that delayed ack alarm is reset. | 2963 // Check that ack is sent and that delayed ack alarm is reset. |
| 2854 EXPECT_EQ(2u, writer_->frame_count()); | 2964 EXPECT_EQ(2u, writer_->frame_count()); |
| 2855 EXPECT_FALSE(writer_->stop_waiting_frames().empty()); | 2965 EXPECT_FALSE(writer_->stop_waiting_frames().empty()); |
| 2856 EXPECT_FALSE(writer_->ack_frames().empty()); | 2966 EXPECT_FALSE(writer_->ack_frames().empty()); |
| 2857 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); | 2967 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); |
| 2858 } | 2968 } |
| 2859 | 2969 |
| 2860 TEST_P(QuicConnectionTest, SendDelayedAckForPing) { | |
| 2861 if (version() < QUIC_VERSION_18) { | |
| 2862 return; | |
| 2863 } | |
| 2864 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | |
| 2865 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); | |
| 2866 ProcessPingPacket(1); | |
| 2867 EXPECT_TRUE(connection_.GetAckAlarm()->IsSet()); | |
| 2868 } | |
| 2869 | |
| 2870 TEST_P(QuicConnectionTest, NoAckOnOldNacks) { | 2970 TEST_P(QuicConnectionTest, NoAckOnOldNacks) { |
| 2871 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2971 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 2872 // Drop one packet, triggering a sequence of acks. | 2972 // Drop one packet, triggering a sequence of acks. |
| 2873 ProcessPacket(2); | 2973 ProcessPacket(2); |
| 2874 size_t frames_per_ack = 2; | 2974 size_t frames_per_ack = 2; |
| 2875 EXPECT_EQ(frames_per_ack, writer_->frame_count()); | 2975 EXPECT_EQ(frames_per_ack, writer_->frame_count()); |
| 2876 EXPECT_FALSE(writer_->ack_frames().empty()); | 2976 EXPECT_FALSE(writer_->ack_frames().empty()); |
| 2877 writer_->Reset(); | 2977 writer_->Reset(); |
| 2878 ProcessPacket(3); | 2978 ProcessPacket(3); |
| 2879 EXPECT_EQ(frames_per_ack, writer_->frame_count()); | 2979 EXPECT_EQ(frames_per_ack, writer_->frame_count()); |
| (...skipping 983 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3863 QuicBlockedFrame blocked; | 3963 QuicBlockedFrame blocked; |
| 3864 blocked.stream_id = 3; | 3964 blocked.stream_id = 3; |
| 3865 EXPECT_CALL(visitor_, OnBlockedFrames(_)); | 3965 EXPECT_CALL(visitor_, OnBlockedFrames(_)); |
| 3866 ProcessFramePacket(QuicFrame(&blocked)); | 3966 ProcessFramePacket(QuicFrame(&blocked)); |
| 3867 EXPECT_TRUE(ack_alarm->IsSet()); | 3967 EXPECT_TRUE(ack_alarm->IsSet()); |
| 3868 } | 3968 } |
| 3869 | 3969 |
| 3870 } // namespace | 3970 } // namespace |
| 3871 } // namespace test | 3971 } // namespace test |
| 3872 } // namespace net | 3972 } // namespace net |
| OLD | NEW |