OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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_sent_packet_manager.h" | 5 #include "net/quic/quic_sent_packet_manager.h" |
6 | 6 |
7 #include "base/stl_util.h" | 7 #include "base/stl_util.h" |
8 #include "net/quic/test_tools/quic_sent_packet_manager_peer.h" | 8 #include "net/quic/test_tools/quic_sent_packet_manager_peer.h" |
9 #include "net/quic/test_tools/quic_test_utils.h" | 9 #include "net/quic/test_tools/quic_test_utils.h" |
10 #include "testing/gmock/include/gmock/gmock.h" | 10 #include "testing/gmock/include/gmock/gmock.h" |
(...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
613 QuicPacketSequenceNumber unacked[] = { 1, 2 }; | 613 QuicPacketSequenceNumber unacked[] = { 1, 2 }; |
614 VerifyUnackedPackets(unacked, arraysize(unacked)); | 614 VerifyUnackedPackets(unacked, arraysize(unacked)); |
615 VerifyRetransmittablePackets(NULL, 0); | 615 VerifyRetransmittablePackets(NULL, 0); |
616 | 616 |
617 EXPECT_TRUE(manager_.HasUnackedPackets()); | 617 EXPECT_TRUE(manager_.HasUnackedPackets()); |
618 EXPECT_EQ(QuicTime::Zero(), | 618 EXPECT_EQ(QuicTime::Zero(), |
619 QuicSentPacketManagerPeer::GetSentTime(&manager_, 1)); | 619 QuicSentPacketManagerPeer::GetSentTime(&manager_, 1)); |
620 EXPECT_EQ(sent_time, QuicSentPacketManagerPeer::GetSentTime(&manager_, 2)); | 620 EXPECT_EQ(sent_time, QuicSentPacketManagerPeer::GetSentTime(&manager_, 2)); |
621 } | 621 } |
622 | 622 |
623 TEST_F(QuicSentPacketManagerTest, NackRetransmit1Packet) { | |
624 const size_t kNumSentPackets = 4; | |
625 // Transmit 4 packets. | |
626 for (size_t i = 1; i <= kNumSentPackets; ++i) { | |
627 SendDataPacket(i); | |
628 } | |
629 EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
630 | |
631 // Nack the first packet 3 times with increasing largest observed. | |
632 ReceivedPacketInfo received_info; | |
633 received_info.delta_time_largest_observed = | |
634 QuicTime::Delta::FromMilliseconds(5); | |
635 received_info.missing_packets.insert(1); | |
636 for (QuicPacketSequenceNumber i = 1; i <= 3; ++i) { | |
637 received_info.largest_observed = i + 1; | |
638 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); | |
639 EXPECT_CALL(*send_algorithm_, OnPacketAcked(i + 1, _)).Times(1); | |
640 if (i == 3) { | |
641 EXPECT_CALL(*send_algorithm_, OnPacketLost(1, _)).Times(1); | |
642 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _)).Times(1); | |
643 } | |
644 manager_.OnIncomingAck(received_info, clock_.Now()); | |
645 EXPECT_EQ( | |
646 i == 3 ? 1u : 0u, | |
647 QuicSentPacketManagerPeer::GetPendingRetransmissionCount(&manager_)); | |
648 EXPECT_EQ(i, QuicSentPacketManagerPeer::GetNackCount(&manager_, 1)); | |
649 } | |
650 EXPECT_EQ(1u, stats_.packets_lost); | |
651 } | |
652 | |
653 // A stretch ack is an ack that covers more than 1 packet of previously | |
654 // unacknowledged data. | |
655 TEST_F(QuicSentPacketManagerTest, NackRetransmit1PacketWith1StretchAck) { | |
656 const size_t kNumSentPackets = 4; | |
657 // Transmit 4 packets. | |
658 for (size_t i = 1; i <= kNumSentPackets; ++i) { | |
659 SendDataPacket(i); | |
660 } | |
661 | |
662 // Nack the first packet 3 times in a single StretchAck. | |
663 ReceivedPacketInfo received_info; | |
664 received_info.delta_time_largest_observed = | |
665 QuicTime::Delta::FromMilliseconds(5); | |
666 received_info.missing_packets.insert(1); | |
667 received_info.largest_observed = kNumSentPackets; | |
668 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); | |
669 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(3); | |
670 EXPECT_CALL(*send_algorithm_, OnPacketLost(1, _)).Times(1); | |
671 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _)).Times(1); | |
672 manager_.OnIncomingAck(received_info, clock_.Now()); | |
673 EXPECT_EQ( | |
674 1u, QuicSentPacketManagerPeer::GetPendingRetransmissionCount(&manager_)); | |
675 EXPECT_EQ(3u, QuicSentPacketManagerPeer::GetNackCount(&manager_, 1)); | |
676 EXPECT_EQ(1u, stats_.packets_lost); | |
677 } | |
678 | |
679 // Ack a packet 3 packets ahead, causing a retransmit. | |
680 TEST_F(QuicSentPacketManagerTest, NackRetransmit1PacketSingleAck) { | |
681 const size_t kNumSentPackets = 5; | |
682 // Transmit 5 packets. | |
683 for (size_t i = 1; i <= kNumSentPackets; ++i) { | |
684 SendDataPacket(i); | |
685 } | |
686 | |
687 // Nack the first packet 3 times in an AckFrame with three missing packets. | |
688 ReceivedPacketInfo received_info; | |
689 received_info.delta_time_largest_observed = | |
690 QuicTime::Delta::FromMilliseconds(5); | |
691 received_info.missing_packets.insert(1); | |
692 received_info.missing_packets.insert(2); | |
693 received_info.missing_packets.insert(3); | |
694 received_info.largest_observed = 4; | |
695 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); | |
696 EXPECT_CALL(*send_algorithm_, OnPacketAcked(4, _)).Times(1); | |
697 EXPECT_CALL(*send_algorithm_, OnPacketLost(1, _)).Times(1); | |
698 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _)).Times(1); | |
699 manager_.OnIncomingAck(received_info, clock_.Now()); | |
700 EXPECT_EQ( | |
701 1u, QuicSentPacketManagerPeer::GetPendingRetransmissionCount(&manager_)); | |
702 EXPECT_EQ(3u, QuicSentPacketManagerPeer::GetNackCount(&manager_, 1)); | |
703 EXPECT_EQ(1u, stats_.packets_lost); | |
704 } | |
705 | |
706 TEST_F(QuicSentPacketManagerTest, EarlyRetransmit1Packet) { | |
707 const size_t kNumSentPackets = 2; | |
708 // Transmit 2 packets. | |
709 for (size_t i = 1; i <= kNumSentPackets; ++i) { | |
710 SendDataPacket(i); | |
711 } | |
712 | |
713 // Early retransmit when the final packet gets acked and the first is nacked. | |
714 ReceivedPacketInfo received_info; | |
715 received_info.delta_time_largest_observed = | |
716 QuicTime::Delta::FromMilliseconds(5); | |
717 received_info.missing_packets.insert(1); | |
718 received_info.largest_observed = kNumSentPackets; | |
719 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); | |
720 EXPECT_CALL(*send_algorithm_, OnPacketAcked(kNumSentPackets, _)).Times(1); | |
721 EXPECT_CALL(*send_algorithm_, OnPacketLost(1, _)).Times(1); | |
722 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _)).Times(1); | |
723 manager_.OnIncomingAck(received_info, clock_.Now()); | |
724 EXPECT_EQ( | |
725 1u, QuicSentPacketManagerPeer::GetPendingRetransmissionCount(&manager_)); | |
726 EXPECT_EQ(1u, QuicSentPacketManagerPeer::GetNackCount(&manager_, 1)); | |
727 EXPECT_EQ(1u, stats_.packets_lost); | |
728 } | |
729 | |
730 TEST_F(QuicSentPacketManagerTest, EarlyRetransmitAllPackets) { | |
731 const size_t kNumSentPackets = 5; | |
732 for (size_t i = 1; i <= kNumSentPackets; ++i) { | |
733 SendDataPacket(i); | |
734 } | |
735 | |
736 // Early retransmit all packets when the final packet arrives, since we do | |
737 // not expect to receive any more acks. | |
738 ReceivedPacketInfo received_info; | |
739 received_info.delta_time_largest_observed = | |
740 QuicTime::Delta::FromMilliseconds(5); | |
741 received_info.missing_packets.insert(1); | |
742 received_info.missing_packets.insert(2); | |
743 received_info.missing_packets.insert(3); | |
744 received_info.missing_packets.insert(4); | |
745 received_info.largest_observed = kNumSentPackets; | |
746 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); | |
747 EXPECT_CALL(*send_algorithm_, OnPacketAcked(5, _)).Times(1); | |
748 EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)).Times(4); | |
749 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(4); | |
750 manager_.OnIncomingAck(received_info, clock_.Now()); | |
751 EXPECT_EQ( | |
752 4u, QuicSentPacketManagerPeer::GetPendingRetransmissionCount(&manager_)); | |
753 EXPECT_EQ(4u, QuicSentPacketManagerPeer::GetNackCount(&manager_, 1)); | |
754 EXPECT_EQ(4u, stats_.packets_lost); | |
755 } | |
756 | |
757 TEST_F(QuicSentPacketManagerTest, NackRetransmit2Packets) { | 623 TEST_F(QuicSentPacketManagerTest, NackRetransmit2Packets) { |
758 const size_t kNumSentPackets = 25; | 624 const size_t kNumSentPackets = 25; |
759 // Transmit 25 packets. | 625 // Transmit 25 packets. |
760 for (QuicPacketSequenceNumber i = 1; i <= kNumSentPackets; ++i) { | 626 for (QuicPacketSequenceNumber i = 1; i <= kNumSentPackets; ++i) { |
761 SendDataPacket(i); | 627 SendDataPacket(i); |
762 } | 628 } |
763 | 629 |
764 // Nack the first 19 packets 3 times, which does not trigger early retransmit. | 630 // Nack the first 19 packets 3 times, which does not trigger early retransmit. |
765 const size_t kLargestObserved = 20; | 631 const size_t kLargestObserved = 20; |
766 ReceivedPacketInfo received_info; | 632 ReceivedPacketInfo received_info; |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
820 } | 686 } |
821 | 687 |
822 // Ensure only the odd packets were retransmitted, since the others were not | 688 // Ensure only the odd packets were retransmitted, since the others were not |
823 // retransmittable(ie: acks). | 689 // retransmittable(ie: acks). |
824 for (size_t i = 0; i < 13; ++i) { | 690 for (size_t i = 0; i < 13; ++i) { |
825 EXPECT_EQ(1 + 2 * i, manager_.NextPendingRetransmission().sequence_number); | 691 EXPECT_EQ(1 + 2 * i, manager_.NextPendingRetransmission().sequence_number); |
826 manager_.OnRetransmittedPacket(1 + 2 * i, kNumSentPackets + 1 + i); | 692 manager_.OnRetransmittedPacket(1 + 2 * i, kNumSentPackets + 1 + i); |
827 } | 693 } |
828 } | 694 } |
829 | 695 |
830 TEST_F(QuicSentPacketManagerTest, NackTwiceThenAck) { | |
831 // Transmit 4 packets. | |
832 for (QuicPacketSequenceNumber i = 1; i <= 4; ++i) { | |
833 SendDataPacket(i); | |
834 } | |
835 | |
836 // Nack the first packet 2 times, then ack it. | |
837 ReceivedPacketInfo received_info; | |
838 received_info.missing_packets.insert(1); | |
839 for (size_t i = 1; i <= 3; ++i) { | |
840 if (i == 3) { | |
841 received_info.missing_packets.clear(); | |
842 } | |
843 received_info.largest_observed = i + 1; | |
844 received_info.delta_time_largest_observed = | |
845 QuicTime::Delta::FromMilliseconds(5); | |
846 EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); | |
847 EXPECT_CALL(*send_algorithm_, | |
848 OnPacketAcked(_, _)).Times(i == 3 ? 2 : 1); | |
849 manager_.OnIncomingAck(received_info, clock_.Now()); | |
850 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
851 // The nack count is not available once the packet has been acked. | |
852 if (i != 3) { | |
853 EXPECT_EQ(i, QuicSentPacketManagerPeer::GetNackCount(&manager_, 1)); | |
854 } | |
855 } | |
856 } | |
857 | |
858 TEST_F(QuicSentPacketManagerTest, Rtt) { | 696 TEST_F(QuicSentPacketManagerTest, Rtt) { |
859 QuicPacketSequenceNumber sequence_number = 1; | 697 QuicPacketSequenceNumber sequence_number = 1; |
860 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(15); | 698 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(15); |
861 SendDataPacket(sequence_number); | 699 SendDataPacket(sequence_number); |
862 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(20)); | 700 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(20)); |
863 | 701 |
864 EXPECT_CALL(*send_algorithm_, UpdateRtt(expected_rtt)); | 702 EXPECT_CALL(*send_algorithm_, UpdateRtt(expected_rtt)); |
865 EXPECT_CALL(*send_algorithm_, | 703 EXPECT_CALL(*send_algorithm_, |
866 OnPacketAcked(sequence_number, _)).Times(1); | 704 OnPacketAcked(sequence_number, _)).Times(1); |
867 ReceivedPacketInfo received_info; | 705 ReceivedPacketInfo received_info; |
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1278 delay = delay.Add(delay); | 1116 delay = delay.Add(delay); |
1279 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | 1117 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); |
1280 manager_.OnRetransmissionTimeout(); | 1118 manager_.OnRetransmissionTimeout(); |
1281 RetransmitNextPacket(i + 2); | 1119 RetransmitNextPacket(i + 2); |
1282 } | 1120 } |
1283 } | 1121 } |
1284 | 1122 |
1285 } // namespace | 1123 } // namespace |
1286 } // namespace test | 1124 } // namespace test |
1287 } // namespace net | 1125 } // namespace net |
OLD | NEW |