summaryrefslogtreecommitdiff
path: root/chromium/net/third_party/quiche/src/quic/core/congestion_control/general_loss_algorithm_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/third_party/quiche/src/quic/core/congestion_control/general_loss_algorithm_test.cc')
-rw-r--r--chromium/net/third_party/quiche/src/quic/core/congestion_control/general_loss_algorithm_test.cc489
1 files changed, 0 insertions, 489 deletions
diff --git a/chromium/net/third_party/quiche/src/quic/core/congestion_control/general_loss_algorithm_test.cc b/chromium/net/third_party/quiche/src/quic/core/congestion_control/general_loss_algorithm_test.cc
deleted file mode 100644
index b8cffab6529..00000000000
--- a/chromium/net/third_party/quiche/src/quic/core/congestion_control/general_loss_algorithm_test.cc
+++ /dev/null
@@ -1,489 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "quic/core/congestion_control/general_loss_algorithm.h"
-
-#include <algorithm>
-#include <cstdint>
-
-#include "quic/core/congestion_control/rtt_stats.h"
-#include "quic/core/quic_unacked_packet_map.h"
-#include "quic/core/quic_utils.h"
-#include "quic/platform/api/quic_flags.h"
-#include "quic/platform/api/quic_test.h"
-#include "quic/test_tools/mock_clock.h"
-
-namespace quic {
-namespace test {
-namespace {
-
-// Default packet length.
-const uint32_t kDefaultLength = 1000;
-
-class GeneralLossAlgorithmTest : public QuicTest {
- protected:
- GeneralLossAlgorithmTest() : unacked_packets_(Perspective::IS_CLIENT) {
- rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
- QuicTime::Delta::Zero(), clock_.Now());
- EXPECT_LT(0, rtt_stats_.smoothed_rtt().ToMicroseconds());
- loss_algorithm_.Initialize(HANDSHAKE_DATA, nullptr);
- }
-
- ~GeneralLossAlgorithmTest() override {}
-
- void SendDataPacket(uint64_t packet_number,
- QuicPacketLength encrypted_length) {
- QuicStreamFrame frame;
- frame.stream_id = QuicUtils::GetFirstBidirectionalStreamId(
- CurrentSupportedVersions()[0].transport_version,
- Perspective::IS_CLIENT);
- SerializedPacket packet(QuicPacketNumber(packet_number),
- PACKET_1BYTE_PACKET_NUMBER, nullptr,
- encrypted_length, false, false);
- packet.retransmittable_frames.push_back(QuicFrame(frame));
- unacked_packets_.AddSentPacket(&packet, NOT_RETRANSMISSION, clock_.Now(),
- true, true);
- }
-
- void SendDataPacket(uint64_t packet_number) {
- SendDataPacket(packet_number, kDefaultLength);
- }
-
- void SendAckPacket(uint64_t packet_number) {
- SerializedPacket packet(QuicPacketNumber(packet_number),
- PACKET_1BYTE_PACKET_NUMBER, nullptr, kDefaultLength,
- true, false);
- unacked_packets_.AddSentPacket(&packet, NOT_RETRANSMISSION, clock_.Now(),
- false, true);
- }
-
- void VerifyLosses(uint64_t largest_newly_acked,
- const AckedPacketVector& packets_acked,
- const std::vector<uint64_t>& losses_expected) {
- return VerifyLosses(largest_newly_acked, packets_acked, losses_expected,
- absl::nullopt, absl::nullopt);
- }
-
- void VerifyLosses(
- uint64_t largest_newly_acked,
- const AckedPacketVector& packets_acked,
- const std::vector<uint64_t>& losses_expected,
- absl::optional<QuicPacketCount> max_sequence_reordering_expected,
- absl::optional<QuicPacketCount>
- num_borderline_time_reorderings_expected) {
- unacked_packets_.MaybeUpdateLargestAckedOfPacketNumberSpace(
- APPLICATION_DATA, QuicPacketNumber(largest_newly_acked));
- LostPacketVector lost_packets;
- LossDetectionInterface::DetectionStats stats = loss_algorithm_.DetectLosses(
- unacked_packets_, clock_.Now(), rtt_stats_,
- QuicPacketNumber(largest_newly_acked), packets_acked, &lost_packets);
- if (max_sequence_reordering_expected.has_value()) {
- EXPECT_EQ(stats.sent_packets_max_sequence_reordering,
- max_sequence_reordering_expected.value());
- }
- if (num_borderline_time_reorderings_expected.has_value()) {
- EXPECT_EQ(stats.sent_packets_num_borderline_time_reorderings,
- num_borderline_time_reorderings_expected.value());
- }
- ASSERT_EQ(losses_expected.size(), lost_packets.size());
- for (size_t i = 0; i < losses_expected.size(); ++i) {
- EXPECT_EQ(lost_packets[i].packet_number,
- QuicPacketNumber(losses_expected[i]));
- }
- }
-
- QuicUnackedPacketMap unacked_packets_;
- GeneralLossAlgorithm loss_algorithm_;
- RttStats rtt_stats_;
- MockClock clock_;
-};
-
-TEST_F(GeneralLossAlgorithmTest, NackRetransmit1Packet) {
- const size_t kNumSentPackets = 5;
- // Transmit 5 packets.
- for (size_t i = 1; i <= kNumSentPackets; ++i) {
- SendDataPacket(i);
- }
- AckedPacketVector packets_acked;
- // No loss on one ack.
- unacked_packets_.RemoveFromInFlight(QuicPacketNumber(2));
- packets_acked.push_back(AckedPacket(
- QuicPacketNumber(2), kMaxOutgoingPacketSize, QuicTime::Zero()));
- VerifyLosses(2, packets_acked, std::vector<uint64_t>{}, 1, 0);
- packets_acked.clear();
- // No loss on two acks.
- unacked_packets_.RemoveFromInFlight(QuicPacketNumber(3));
- packets_acked.push_back(AckedPacket(
- QuicPacketNumber(3), kMaxOutgoingPacketSize, QuicTime::Zero()));
- VerifyLosses(3, packets_acked, std::vector<uint64_t>{}, 2, 0);
- packets_acked.clear();
- // Loss on three acks.
- unacked_packets_.RemoveFromInFlight(QuicPacketNumber(4));
- packets_acked.push_back(AckedPacket(
- QuicPacketNumber(4), kMaxOutgoingPacketSize, QuicTime::Zero()));
- VerifyLosses(4, packets_acked, {1}, 3, 0);
- EXPECT_EQ(QuicTime::Zero(), loss_algorithm_.GetLossTimeout());
-}
-
-// A stretch ack is an ack that covers more than 1 packet of previously
-// unacknowledged data.
-TEST_F(GeneralLossAlgorithmTest, NackRetransmit1PacketWith1StretchAck) {
- const size_t kNumSentPackets = 10;
- // Transmit 10 packets.
- for (size_t i = 1; i <= kNumSentPackets; ++i) {
- SendDataPacket(i);
- }
- AckedPacketVector packets_acked;
- // Nack the first packet 3 times in a single StretchAck.
- unacked_packets_.RemoveFromInFlight(QuicPacketNumber(2));
- packets_acked.push_back(AckedPacket(
- QuicPacketNumber(2), kMaxOutgoingPacketSize, QuicTime::Zero()));
- unacked_packets_.RemoveFromInFlight(QuicPacketNumber(3));
- packets_acked.push_back(AckedPacket(
- QuicPacketNumber(3), kMaxOutgoingPacketSize, QuicTime::Zero()));
- unacked_packets_.RemoveFromInFlight(QuicPacketNumber(4));
- packets_acked.push_back(AckedPacket(
- QuicPacketNumber(4), kMaxOutgoingPacketSize, QuicTime::Zero()));
- VerifyLosses(4, packets_acked, {1});
- EXPECT_EQ(QuicTime::Zero(), loss_algorithm_.GetLossTimeout());
-}
-
-// Ack a packet 3 packets ahead, causing a retransmit.
-TEST_F(GeneralLossAlgorithmTest, NackRetransmit1PacketSingleAck) {
- const size_t kNumSentPackets = 10;
- // Transmit 10 packets.
- for (size_t i = 1; i <= kNumSentPackets; ++i) {
- SendDataPacket(i);
- }
- AckedPacketVector packets_acked;
- // Nack the first packet 3 times in an AckFrame with three missing packets.
- unacked_packets_.RemoveFromInFlight(QuicPacketNumber(4));
- packets_acked.push_back(AckedPacket(
- QuicPacketNumber(4), kMaxOutgoingPacketSize, QuicTime::Zero()));
- VerifyLosses(4, packets_acked, {1});
- EXPECT_EQ(clock_.Now() + 1.25 * rtt_stats_.smoothed_rtt(),
- loss_algorithm_.GetLossTimeout());
-}
-
-TEST_F(GeneralLossAlgorithmTest, EarlyRetransmit1Packet) {
- const size_t kNumSentPackets = 2;
- // Transmit 2 packets.
- for (size_t i = 1; i <= kNumSentPackets; ++i) {
- SendDataPacket(i);
- }
- AckedPacketVector packets_acked;
- // Early retransmit when the final packet gets acked and the first is nacked.
- unacked_packets_.RemoveFromInFlight(QuicPacketNumber(2));
- packets_acked.push_back(AckedPacket(
- QuicPacketNumber(2), kMaxOutgoingPacketSize, QuicTime::Zero()));
- VerifyLosses(2, packets_acked, std::vector<uint64_t>{});
- packets_acked.clear();
- EXPECT_EQ(clock_.Now() + 1.25 * rtt_stats_.smoothed_rtt(),
- loss_algorithm_.GetLossTimeout());
-
- clock_.AdvanceTime(1.13 * rtt_stats_.latest_rtt());
- // If reordering_shift increases by one we should have detected a loss.
- VerifyLosses(2, packets_acked, {}, /*max_sequence_reordering_expected=*/1,
- /*num_borderline_time_reorderings_expected=*/1);
-
- clock_.AdvanceTime(0.13 * rtt_stats_.latest_rtt());
- VerifyLosses(2, packets_acked, {1});
- EXPECT_EQ(QuicTime::Zero(), loss_algorithm_.GetLossTimeout());
-}
-
-TEST_F(GeneralLossAlgorithmTest, EarlyRetransmitAllPackets) {
- const size_t kNumSentPackets = 5;
- for (size_t i = 1; i <= kNumSentPackets; ++i) {
- SendDataPacket(i);
- // Advance the time 1/4 RTT between 3 and 4.
- if (i == 3) {
- clock_.AdvanceTime(0.25 * rtt_stats_.smoothed_rtt());
- }
- }
- AckedPacketVector packets_acked;
- // Early retransmit when the final packet gets acked and 1.25 RTTs have
- // elapsed since the packets were sent.
- unacked_packets_.RemoveFromInFlight(QuicPacketNumber(kNumSentPackets));
- packets_acked.push_back(AckedPacket(QuicPacketNumber(kNumSentPackets),
- kMaxOutgoingPacketSize,
- QuicTime::Zero()));
- // This simulates a single ack following multiple missing packets with FACK.
- VerifyLosses(kNumSentPackets, packets_acked, {1, 2});
- packets_acked.clear();
- // The time has already advanced 1/4 an RTT, so ensure the timeout is set
- // 1.25 RTTs after the earliest pending packet(3), not the last(4).
- EXPECT_EQ(clock_.Now() + rtt_stats_.smoothed_rtt(),
- loss_algorithm_.GetLossTimeout());
-
- clock_.AdvanceTime(rtt_stats_.smoothed_rtt());
- VerifyLosses(kNumSentPackets, packets_acked, {3});
- EXPECT_EQ(clock_.Now() + 0.25 * rtt_stats_.smoothed_rtt(),
- loss_algorithm_.GetLossTimeout());
- clock_.AdvanceTime(0.25 * rtt_stats_.smoothed_rtt());
- VerifyLosses(kNumSentPackets, packets_acked, {4});
- EXPECT_EQ(QuicTime::Zero(), loss_algorithm_.GetLossTimeout());
-}
-
-TEST_F(GeneralLossAlgorithmTest, DontEarlyRetransmitNeuteredPacket) {
- const size_t kNumSentPackets = 2;
- // Transmit 2 packets.
- for (size_t i = 1; i <= kNumSentPackets; ++i) {
- SendDataPacket(i);
- }
- AckedPacketVector packets_acked;
- // Neuter packet 1.
- unacked_packets_.RemoveRetransmittability(QuicPacketNumber(1));
- clock_.AdvanceTime(rtt_stats_.smoothed_rtt());
-
- // Early retransmit when the final packet gets acked and the first is nacked.
- unacked_packets_.MaybeUpdateLargestAckedOfPacketNumberSpace(
- APPLICATION_DATA, QuicPacketNumber(2));
- unacked_packets_.RemoveFromInFlight(QuicPacketNumber(2));
- packets_acked.push_back(AckedPacket(
- QuicPacketNumber(2), kMaxOutgoingPacketSize, QuicTime::Zero()));
- VerifyLosses(2, packets_acked, std::vector<uint64_t>{});
- EXPECT_EQ(clock_.Now() + 0.25 * rtt_stats_.smoothed_rtt(),
- loss_algorithm_.GetLossTimeout());
-}
-
-TEST_F(GeneralLossAlgorithmTest, EarlyRetransmitWithLargerUnackablePackets) {
- // Transmit 2 data packets and one ack.
- SendDataPacket(1);
- SendDataPacket(2);
- SendAckPacket(3);
- AckedPacketVector packets_acked;
- clock_.AdvanceTime(rtt_stats_.smoothed_rtt());
-
- // Early retransmit when the final packet gets acked and the first is nacked.
- unacked_packets_.MaybeUpdateLargestAckedOfPacketNumberSpace(
- APPLICATION_DATA, QuicPacketNumber(2));
- unacked_packets_.RemoveFromInFlight(QuicPacketNumber(2));
- packets_acked.push_back(AckedPacket(
- QuicPacketNumber(2), kMaxOutgoingPacketSize, QuicTime::Zero()));
- VerifyLosses(2, packets_acked, std::vector<uint64_t>{});
- packets_acked.clear();
- EXPECT_EQ(clock_.Now() + 0.25 * rtt_stats_.smoothed_rtt(),
- loss_algorithm_.GetLossTimeout());
-
- // The packet should be lost once the loss timeout is reached.
- clock_.AdvanceTime(0.25 * rtt_stats_.latest_rtt());
- VerifyLosses(2, packets_acked, {1});
- EXPECT_EQ(QuicTime::Zero(), loss_algorithm_.GetLossTimeout());
-}
-
-TEST_F(GeneralLossAlgorithmTest, AlwaysLosePacketSent1RTTEarlier) {
- // Transmit 1 packet and then wait an rtt plus 1ms.
- SendDataPacket(1);
- clock_.AdvanceTime(rtt_stats_.smoothed_rtt() +
- QuicTime::Delta::FromMilliseconds(1));
-
- // Transmit 2 packets.
- SendDataPacket(2);
- SendDataPacket(3);
- AckedPacketVector packets_acked;
- // Wait another RTT and ack 2.
- clock_.AdvanceTime(rtt_stats_.smoothed_rtt());
- unacked_packets_.MaybeUpdateLargestAckedOfPacketNumberSpace(
- APPLICATION_DATA, QuicPacketNumber(2));
- unacked_packets_.RemoveFromInFlight(QuicPacketNumber(2));
- packets_acked.push_back(AckedPacket(
- QuicPacketNumber(2), kMaxOutgoingPacketSize, QuicTime::Zero()));
- VerifyLosses(2, packets_acked, {1});
-}
-
-TEST_F(GeneralLossAlgorithmTest, IncreaseTimeThresholdUponSpuriousLoss) {
- loss_algorithm_.enable_adaptive_time_threshold();
- loss_algorithm_.set_reordering_shift(kDefaultLossDelayShift);
- EXPECT_EQ(kDefaultLossDelayShift, loss_algorithm_.reordering_shift());
- EXPECT_TRUE(loss_algorithm_.use_adaptive_time_threshold());
- const size_t kNumSentPackets = 10;
- // Transmit 2 packets at 1/10th an RTT interval.
- for (size_t i = 1; i <= kNumSentPackets; ++i) {
- SendDataPacket(i);
- clock_.AdvanceTime(0.1 * rtt_stats_.smoothed_rtt());
- }
- EXPECT_EQ(QuicTime::Zero() + rtt_stats_.smoothed_rtt(), clock_.Now());
- AckedPacketVector packets_acked;
- // Expect the timer to not be set.
- EXPECT_EQ(QuicTime::Zero(), loss_algorithm_.GetLossTimeout());
- // Packet 1 should not be lost until 1/4 RTTs pass.
- unacked_packets_.RemoveFromInFlight(QuicPacketNumber(2));
- packets_acked.push_back(AckedPacket(
- QuicPacketNumber(2), kMaxOutgoingPacketSize, QuicTime::Zero()));
- VerifyLosses(2, packets_acked, std::vector<uint64_t>{});
- packets_acked.clear();
- // Expect the timer to be set to 1/4 RTT's in the future.
- EXPECT_EQ(rtt_stats_.smoothed_rtt() * (1.0f / 4),
- loss_algorithm_.GetLossTimeout() - clock_.Now());
- VerifyLosses(2, packets_acked, std::vector<uint64_t>{});
- clock_.AdvanceTime(rtt_stats_.smoothed_rtt() * (1.0f / 4));
- VerifyLosses(2, packets_acked, {1});
- EXPECT_EQ(QuicTime::Zero(), loss_algorithm_.GetLossTimeout());
- // Retransmit packet 1 as 11 and 2 as 12.
- SendDataPacket(11);
- SendDataPacket(12);
-
- // Advance the time 1/4 RTT and indicate the loss was spurious.
- // The new threshold should be 1/2 RTT.
- clock_.AdvanceTime(rtt_stats_.smoothed_rtt() * (1.0f / 4));
- loss_algorithm_.SpuriousLossDetected(unacked_packets_, rtt_stats_,
- clock_.Now(), QuicPacketNumber(1),
- QuicPacketNumber(2));
- EXPECT_EQ(1, loss_algorithm_.reordering_shift());
-}
-
-TEST_F(GeneralLossAlgorithmTest, IncreaseReorderingThresholdUponSpuriousLoss) {
- loss_algorithm_.set_use_adaptive_reordering_threshold(true);
- for (size_t i = 1; i <= 4; ++i) {
- SendDataPacket(i);
- }
- // Acking 4 causes 1 detected lost.
- AckedPacketVector packets_acked;
- unacked_packets_.RemoveFromInFlight(QuicPacketNumber(4));
- packets_acked.push_back(AckedPacket(
- QuicPacketNumber(4), kMaxOutgoingPacketSize, QuicTime::Zero()));
- VerifyLosses(4, packets_acked, std::vector<uint64_t>{1});
- packets_acked.clear();
-
- // Retransmit 1 as 5.
- SendDataPacket(5);
-
- // Acking 1 such that it was detected lost spuriously.
- unacked_packets_.RemoveFromInFlight(QuicPacketNumber(1));
- packets_acked.push_back(AckedPacket(
- QuicPacketNumber(1), kMaxOutgoingPacketSize, QuicTime::Zero()));
- loss_algorithm_.SpuriousLossDetected(unacked_packets_, rtt_stats_,
- clock_.Now(), QuicPacketNumber(1),
- QuicPacketNumber(4));
- VerifyLosses(4, packets_acked, std::vector<uint64_t>{});
- packets_acked.clear();
-
- // Verify acking 5 does not cause 2 detected lost.
- unacked_packets_.RemoveFromInFlight(QuicPacketNumber(5));
- packets_acked.push_back(AckedPacket(
- QuicPacketNumber(5), kMaxOutgoingPacketSize, QuicTime::Zero()));
- VerifyLosses(5, packets_acked, std::vector<uint64_t>{});
- packets_acked.clear();
-
- SendDataPacket(6);
-
- // Acking 6 will causes 2 detected lost.
- unacked_packets_.RemoveFromInFlight(QuicPacketNumber(6));
- packets_acked.push_back(AckedPacket(
- QuicPacketNumber(6), kMaxOutgoingPacketSize, QuicTime::Zero()));
- VerifyLosses(6, packets_acked, std::vector<uint64_t>{2});
- packets_acked.clear();
-
- // Retransmit 2 as 7.
- SendDataPacket(7);
-
- // Acking 2 such that it was detected lost spuriously.
- unacked_packets_.RemoveFromInFlight(QuicPacketNumber(2));
- packets_acked.push_back(AckedPacket(
- QuicPacketNumber(2), kMaxOutgoingPacketSize, QuicTime::Zero()));
- loss_algorithm_.SpuriousLossDetected(unacked_packets_, rtt_stats_,
- clock_.Now(), QuicPacketNumber(2),
- QuicPacketNumber(6));
- VerifyLosses(6, packets_acked, std::vector<uint64_t>{});
- packets_acked.clear();
-
- // Acking 7 will not cause 3 as detected lost.
- unacked_packets_.RemoveFromInFlight(QuicPacketNumber(7));
- packets_acked.push_back(AckedPacket(
- QuicPacketNumber(7), kMaxOutgoingPacketSize, QuicTime::Zero()));
- VerifyLosses(7, packets_acked, std::vector<uint64_t>{});
- packets_acked.clear();
-}
-
-TEST_F(GeneralLossAlgorithmTest, DefaultIetfLossDetection) {
- loss_algorithm_.set_reordering_shift(kDefaultIetfLossDelayShift);
- for (size_t i = 1; i <= 6; ++i) {
- SendDataPacket(i);
- }
- // Packet threshold loss detection.
- AckedPacketVector packets_acked;
- // No loss on one ack.
- unacked_packets_.RemoveFromInFlight(QuicPacketNumber(2));
- packets_acked.push_back(AckedPacket(
- QuicPacketNumber(2), kMaxOutgoingPacketSize, QuicTime::Zero()));
- VerifyLosses(2, packets_acked, std::vector<uint64_t>{});
- packets_acked.clear();
- // No loss on two acks.
- unacked_packets_.RemoveFromInFlight(QuicPacketNumber(3));
- packets_acked.push_back(AckedPacket(
- QuicPacketNumber(3), kMaxOutgoingPacketSize, QuicTime::Zero()));
- VerifyLosses(3, packets_acked, std::vector<uint64_t>{});
- packets_acked.clear();
- // Loss on three acks.
- unacked_packets_.RemoveFromInFlight(QuicPacketNumber(4));
- packets_acked.push_back(AckedPacket(
- QuicPacketNumber(4), kMaxOutgoingPacketSize, QuicTime::Zero()));
- VerifyLosses(4, packets_acked, {1});
- EXPECT_EQ(QuicTime::Zero(), loss_algorithm_.GetLossTimeout());
- packets_acked.clear();
-
- SendDataPacket(7);
-
- // Time threshold loss detection.
- unacked_packets_.RemoveFromInFlight(QuicPacketNumber(6));
- packets_acked.push_back(AckedPacket(
- QuicPacketNumber(6), kMaxOutgoingPacketSize, QuicTime::Zero()));
- VerifyLosses(6, packets_acked, std::vector<uint64_t>{});
- packets_acked.clear();
- EXPECT_EQ(clock_.Now() + rtt_stats_.smoothed_rtt() +
- (rtt_stats_.smoothed_rtt() >> 3),
- loss_algorithm_.GetLossTimeout());
- clock_.AdvanceTime(rtt_stats_.smoothed_rtt() +
- (rtt_stats_.smoothed_rtt() >> 3));
- VerifyLosses(6, packets_acked, {5});
- EXPECT_EQ(QuicTime::Zero(), loss_algorithm_.GetLossTimeout());
-}
-
-TEST_F(GeneralLossAlgorithmTest, IetfLossDetectionWithOneFourthRttDelay) {
- loss_algorithm_.set_reordering_shift(2);
- SendDataPacket(1);
- SendDataPacket(2);
-
- AckedPacketVector packets_acked;
- unacked_packets_.RemoveFromInFlight(QuicPacketNumber(2));
- packets_acked.push_back(AckedPacket(
- QuicPacketNumber(2), kMaxOutgoingPacketSize, QuicTime::Zero()));
- VerifyLosses(2, packets_acked, std::vector<uint64_t>{});
- packets_acked.clear();
- EXPECT_EQ(clock_.Now() + rtt_stats_.smoothed_rtt() +
- (rtt_stats_.smoothed_rtt() >> 2),
- loss_algorithm_.GetLossTimeout());
- clock_.AdvanceTime(rtt_stats_.smoothed_rtt() +
- (rtt_stats_.smoothed_rtt() >> 2));
- VerifyLosses(2, packets_acked, {1});
- EXPECT_EQ(QuicTime::Zero(), loss_algorithm_.GetLossTimeout());
-}
-
-TEST_F(GeneralLossAlgorithmTest, NoPacketThresholdForRuntPackets) {
- loss_algorithm_.disable_packet_threshold_for_runt_packets();
- for (size_t i = 1; i <= 6; ++i) {
- SendDataPacket(i);
- }
- // Send a small packet.
- SendDataPacket(7, /*encrypted_length=*/kDefaultLength / 2);
- // No packet threshold for runt packet.
- AckedPacketVector packets_acked;
- unacked_packets_.RemoveFromInFlight(QuicPacketNumber(7));
- packets_acked.push_back(AckedPacket(
- QuicPacketNumber(7), kMaxOutgoingPacketSize, QuicTime::Zero()));
- // Verify no packet is detected lost because packet 7 is a runt.
- VerifyLosses(7, packets_acked, std::vector<uint64_t>{});
- EXPECT_EQ(clock_.Now() + rtt_stats_.smoothed_rtt() +
- (rtt_stats_.smoothed_rtt() >> 2),
- loss_algorithm_.GetLossTimeout());
- clock_.AdvanceTime(rtt_stats_.smoothed_rtt() +
- (rtt_stats_.smoothed_rtt() >> 2));
- // Verify packets are declared lost because time threshold has passed.
- VerifyLosses(7, packets_acked, {1, 2, 3, 4, 5, 6});
- EXPECT_EQ(QuicTime::Zero(), loss_algorithm_.GetLossTimeout());
-}
-
-} // namespace
-} // namespace test
-} // namespace quic