| Index: net/quic/core/quic_sent_packet_manager_test.cc
|
| diff --git a/net/quic/core/quic_sent_packet_manager_test.cc b/net/quic/core/quic_sent_packet_manager_test.cc
|
| index 49354b50169587c0983ad5ef82503338ea31c27b..2263299ac0dd713bcb214c339d9ed604ff1f0c3b 100644
|
| --- a/net/quic/core/quic_sent_packet_manager_test.cc
|
| +++ b/net/quic/core/quic_sent_packet_manager_test.cc
|
| @@ -262,11 +262,20 @@ class QuicSentPacketManagerTest : public QuicTest {
|
| return frame;
|
| }
|
|
|
| - // Explicitly nack packet [lower, higher).
|
| - void NackPackets(QuicPacketNumber lower,
|
| - QuicPacketNumber higher,
|
| - QuicAckFrame* frame) {
|
| - frame->packets.Remove(lower, higher);
|
| + // Creates an ackframe that contains up to two ranges of packets
|
| + QuicAckFrame ConstructAckFrame(QuicPacketNumber range1_start,
|
| + QuicPacketNumber range1_end,
|
| + QuicPacketNumber range2_start,
|
| + QuicPacketNumber range2_end) {
|
| + QuicAckFrame ack_frame;
|
| + if (range1_start < range1_end) {
|
| + ack_frame.packets.Add(range1_start, range1_end);
|
| + }
|
| + if (range2_start <= range2_end) {
|
| + ack_frame.packets.Add(range2_start, range2_end + 1);
|
| + }
|
| + ack_frame.largest_observed = range2_end;
|
| + return ack_frame;
|
| }
|
|
|
| QuicSentPacketManager manager_;
|
| @@ -302,8 +311,8 @@ TEST_F(QuicSentPacketManagerTest, RetransmitThenAck) {
|
| RetransmitAndSendPacket(1, 2);
|
|
|
| // Ack 2 but not 1.
|
| - QuicAckFrame ack_frame = InitAckFrame(2);
|
| - NackPackets(1, 2, &ack_frame);
|
| + QuicAckFrame ack_frame = ConstructAckFrame(1, 1, 2, 2);
|
| +
|
| ExpectAck(2);
|
| manager_.OnIncomingAck(ack_frame, clock_.Now());
|
|
|
| @@ -388,18 +397,16 @@ TEST_F(QuicSentPacketManagerTest, RetransmitThenAckPreviousThenNackRetransmit) {
|
| clock_.AdvanceTime(rtt);
|
|
|
| // Next, NACK packet 2 three times.
|
| - ack_frame = InitAckFrame(3);
|
| - NackPackets(2, 3, &ack_frame);
|
| + ack_frame = ConstructAckFrame(1, 2, 3, 3);
|
| +
|
| ExpectAck(3);
|
| manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
|
|
|
| - ack_frame = InitAckFrame(4);
|
| - NackPackets(2, 3, &ack_frame);
|
| + ack_frame = ConstructAckFrame(1, 2, 3, 4);
|
| ExpectAck(4);
|
| manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
|
|
|
| - ack_frame = InitAckFrame(5);
|
| - NackPackets(2, 3, &ack_frame);
|
| + ack_frame = ConstructAckFrame(1, 2, 3, 5);
|
| ExpectAckAndLoss(true, 5, 2);
|
| manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
|
|
|
| @@ -469,8 +476,7 @@ TEST_F(QuicSentPacketManagerTest, RetransmitTwiceThenAckFirst) {
|
|
|
| // Ensure packet 2 is lost when 4 is sent and 3 and 4 are acked.
|
| SendDataPacket(4);
|
| - ack_frame = InitAckFrame(4);
|
| - NackPackets(2, 3, &ack_frame);
|
| + ack_frame = ConstructAckFrame(1, 2, 3, 4);
|
| QuicPacketNumber acked[] = {3, 4};
|
| ExpectAcksAndLosses(true, acked, arraysize(acked), nullptr, 0);
|
| manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
|
| @@ -480,8 +486,7 @@ TEST_F(QuicSentPacketManagerTest, RetransmitTwiceThenAckFirst) {
|
| EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
|
|
|
| SendDataPacket(5);
|
| - ack_frame = InitAckFrame(5);
|
| - NackPackets(2, 3, &ack_frame);
|
| + ack_frame = ConstructAckFrame(1, 2, 3, 5);
|
| ExpectAckAndLoss(true, 5, 2);
|
| EXPECT_CALL(debug_delegate, OnPacketLoss(2, LOSS_RETRANSMISSION, _));
|
| manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
|
| @@ -511,8 +516,7 @@ TEST_F(QuicSentPacketManagerTest, AckOriginalTransmission) {
|
| SendDataPacket(4);
|
| // Ack 4, which causes 3 to be retransmitted.
|
| {
|
| - QuicAckFrame ack_frame = InitAckFrame(4);
|
| - NackPackets(2, 4, &ack_frame);
|
| + QuicAckFrame ack_frame = ConstructAckFrame(1, 2, 4, 4);
|
| ExpectAck(4);
|
| EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _));
|
| manager_.OnIncomingAck(ack_frame, clock_.Now());
|
| @@ -520,10 +524,7 @@ TEST_F(QuicSentPacketManagerTest, AckOriginalTransmission) {
|
| }
|
|
|
| // Ack 3, which causes SpuriousRetransmitDetected to be called.
|
| - {
|
| - QuicAckFrame ack_frame = InitAckFrame(4);
|
| - NackPackets(2, 3, &ack_frame);
|
| - }
|
| + { QuicAckFrame ack_frame = ConstructAckFrame(1, 2, 3, 4); }
|
| }
|
|
|
| TEST_F(QuicSentPacketManagerTest, GetLeastUnacked) {
|
| @@ -648,8 +649,7 @@ TEST_F(QuicSentPacketManagerTest, TailLossProbeTimeout) {
|
| // Ack the third and ensure the first two are still pending.
|
| ExpectAck(3);
|
|
|
| - QuicAckFrame ack_frame = InitAckFrame(3);
|
| - NackPackets(1, 3, &ack_frame);
|
| + QuicAckFrame ack_frame = ConstructAckFrame(1, 1, 3, 3);
|
| manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
|
|
|
| EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
|
| @@ -657,8 +657,7 @@ TEST_F(QuicSentPacketManagerTest, TailLossProbeTimeout) {
|
| // Acking two more packets will lose both of them due to nacks.
|
| SendDataPacket(4);
|
| SendDataPacket(5);
|
| - ack_frame = InitAckFrame(5);
|
| - NackPackets(1, 3, &ack_frame);
|
| + ack_frame = ConstructAckFrame(1, 1, 3, 5);
|
| QuicPacketNumber acked[] = {4, 5};
|
| QuicPacketNumber lost[] = {1, 2};
|
| ExpectAcksAndLosses(true, acked, arraysize(acked), lost, arraysize(lost));
|
| @@ -724,8 +723,7 @@ TEST_F(QuicSentPacketManagerTest, TailLossProbeThenRTO) {
|
| QuicSentPacketManagerPeer::GetBytesInFlight(&manager_));
|
|
|
| RetransmitNextPacket(103);
|
| - QuicAckFrame ack_frame = InitAckFrame(103);
|
| - NackPackets(0, 103, &ack_frame);
|
| + QuicAckFrame ack_frame = ConstructAckFrame(1, 0, 103, 103);
|
| EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
|
| EXPECT_CALL(*send_algorithm_,
|
| OnCongestionEvent(true, _, _, ElementsAre(Pair(103, _)), _));
|
| @@ -767,9 +765,10 @@ TEST_F(QuicSentPacketManagerTest, CryptoHandshakeTimeout) {
|
| // and ensure the first four crypto packets get abandoned, but not lost.
|
| QuicPacketNumber acked[] = {3, 4, 5, 8, 9};
|
| ExpectAcksAndLosses(true, acked, arraysize(acked), nullptr, 0);
|
| - QuicAckFrame ack_frame = InitAckFrame(9);
|
| - NackPackets(1, 3, &ack_frame);
|
| - NackPackets(6, 8, &ack_frame);
|
| + QuicAckFrame ack_frame;
|
| + ack_frame.packets.Add(3, 6);
|
| + ack_frame.packets.Add(8, 10);
|
| + ack_frame.largest_observed = 9;
|
| manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
|
|
|
| EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
|
| @@ -817,10 +816,7 @@ TEST_F(QuicSentPacketManagerTest, CryptoHandshakeTimeoutVersionNegotiation) {
|
| // crypto packets.
|
| QuicPacketNumber acked[] = {8, 9};
|
| ExpectAcksAndLosses(true, acked, arraysize(acked), nullptr, 0);
|
| - QuicAckFrame ack_frame = InitAckFrame(9);
|
| - for (QuicPacketNumber i = 1; i < 8; ++i) {
|
| - NackPackets(i, i + 1, &ack_frame);
|
| - }
|
| + QuicAckFrame ack_frame = ConstructAckFrame(1, 1, 8, 9);
|
| manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
|
| EXPECT_EQ(10u, manager_.GetLeastUnacked());
|
| }
|
| @@ -841,8 +837,7 @@ TEST_F(QuicSentPacketManagerTest, CryptoHandshakeSpuriousRetransmission) {
|
| // Now ack the second crypto packet, and ensure the first gets removed, but
|
| // the third does not.
|
| ExpectUpdatedRtt(2);
|
| - QuicAckFrame ack_frame = InitAckFrame(2);
|
| - NackPackets(1, 2, &ack_frame);
|
| + QuicAckFrame ack_frame = ConstructAckFrame(1, 1, 2, 2);
|
| manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
|
|
|
| EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
|
| @@ -915,8 +910,7 @@ TEST_F(QuicSentPacketManagerTest,
|
| EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
|
|
|
| // Ensure both packets get discarded when packet 2 is acked.
|
| - QuicAckFrame ack_frame = InitAckFrame(3);
|
| - NackPackets(1, 3, &ack_frame);
|
| + QuicAckFrame ack_frame = ConstructAckFrame(1, 1, 3, 3);
|
| ExpectUpdatedRtt(3);
|
| manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
|
| VerifyUnackedPackets(nullptr, 0);
|
| @@ -943,8 +937,7 @@ TEST_F(QuicSentPacketManagerTest, RetransmissionTimeout) {
|
| EXPECT_FALSE(manager_.HasPendingRetransmissions());
|
|
|
| // Ack a retransmission.
|
| - QuicAckFrame ack_frame = InitAckFrame(102);
|
| - NackPackets(0, 102, &ack_frame);
|
| + QuicAckFrame ack_frame = ConstructAckFrame(1, 0, 102, 102);
|
| ack_frame.ack_delay_time = QuicTime::Delta::Zero();
|
| // Ensure no packets are lost.
|
| EXPECT_CALL(*send_algorithm_,
|
| @@ -992,8 +985,7 @@ TEST_F(QuicSentPacketManagerTest, NewRetransmissionTimeout) {
|
| EXPECT_FALSE(manager_.HasPendingRetransmissions());
|
|
|
| // Ack a retransmission and expect no call to OnRetransmissionTimeout.
|
| - QuicAckFrame ack_frame = InitAckFrame(102);
|
| - NackPackets(0, 102, &ack_frame);
|
| + QuicAckFrame ack_frame = ConstructAckFrame(1, 0, 102, 102);
|
| ack_frame.ack_delay_time = QuicTime::Delta::Zero();
|
| // This will include packets in the lost packet map.
|
| EXPECT_CALL(*send_algorithm_,
|
| @@ -1025,8 +1017,7 @@ TEST_F(QuicSentPacketManagerTest, TwoRetransmissionTimeoutsAckSecond) {
|
|
|
| // Ack a retransmission and ensure OnRetransmissionTimeout is called.
|
| EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
|
| - QuicAckFrame ack_frame = InitAckFrame(2);
|
| - NackPackets(1, 2, &ack_frame);
|
| + QuicAckFrame ack_frame = ConstructAckFrame(1, 1, 2, 2);
|
| ack_frame.ack_delay_time = QuicTime::Delta::Zero();
|
| ExpectAck(2);
|
| manager_.OnIncomingAck(ack_frame, clock_.Now());
|
| @@ -1058,8 +1049,7 @@ TEST_F(QuicSentPacketManagerTest, TwoRetransmissionTimeoutsAckFirst) {
|
|
|
| // Ack a retransmission and ensure OnRetransmissionTimeout is called.
|
| EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
|
| - QuicAckFrame ack_frame = InitAckFrame(3);
|
| - NackPackets(1, 3, &ack_frame);
|
| + QuicAckFrame ack_frame = ConstructAckFrame(1, 1, 3, 3);
|
| ack_frame.ack_delay_time = QuicTime::Delta::Zero();
|
| ExpectAck(3);
|
| manager_.OnIncomingAck(ack_frame, clock_.Now());
|
| @@ -1226,8 +1216,7 @@ TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeSpuriousRTO) {
|
|
|
| // Ack a packet before the first RTO and ensure the RTO timeout returns to the
|
| // original value and OnRetransmissionTimeout is not called or reverted.
|
| - QuicAckFrame ack_frame = InitAckFrame(2);
|
| - NackPackets(1, 2, &ack_frame);
|
| + QuicAckFrame ack_frame = ConstructAckFrame(1, 1, 2, 2);
|
| ExpectAck(2);
|
| manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
|
| EXPECT_FALSE(manager_.HasPendingRetransmissions());
|
| @@ -1337,8 +1326,7 @@ TEST_F(QuicSentPacketManagerTest, GetLossDelay) {
|
| // set the loss timeout.
|
| ExpectAck(2);
|
| EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _));
|
| - QuicAckFrame ack_frame = InitAckFrame(2);
|
| - NackPackets(1, 2, &ack_frame);
|
| + QuicAckFrame ack_frame = ConstructAckFrame(1, 1, 2, 2);
|
| manager_.OnIncomingAck(ack_frame, clock_.Now());
|
|
|
| QuicTime timeout(clock_.Now() + QuicTime::Delta::FromMilliseconds(10));
|
| @@ -1661,8 +1649,8 @@ TEST_F(QuicSentPacketManagerTest, NegotiateUndoFromOptionsAtServer) {
|
| }
|
| EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _))
|
| .WillOnce(SetArgPointee<4>(lost_packets));
|
| - QuicAckFrame ack_frame = InitAckFrame(kNumSentPackets);
|
| - NackPackets(1, kNumSentPackets, &ack_frame);
|
| + QuicAckFrame ack_frame =
|
| + ConstructAckFrame(1, 1, kNumSentPackets, kNumSentPackets);
|
| // Congestion block the sending right before losing the packets.
|
| EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _))
|
| .WillRepeatedly(Return(QuicTime::Delta::Infinite()));
|
| @@ -1672,8 +1660,7 @@ TEST_F(QuicSentPacketManagerTest, NegotiateUndoFromOptionsAtServer) {
|
|
|
| // Ack 1 and ensure the retransmissions are cancelled and put back in flight.
|
| EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _));
|
| - ack_frame = InitAckFrame(5);
|
| - NackPackets(2, kNumSentPackets, &ack_frame);
|
| + ack_frame = ConstructAckFrame(1, 2, kNumSentPackets, 5);
|
| manager_.OnIncomingAck(ack_frame, clock_.Now());
|
| EXPECT_FALSE(manager_.HasPendingRetransmissions());
|
| EXPECT_EQ(3u * kDefaultLength, BytesInFlight());
|
|
|