gfe-relnote: Add a connection option(1ACK) to send only one immediate ACK in QUIC after reordering, instead of 4. Protected by gfe2_reloadable_flag_quic_one_immediate_ack
PiperOrigin-RevId: 290743392
Change-Id: I0c1a557d48f3b0b0c3e58c235d6c97dd79973c68
diff --git a/quic/core/quic_received_packet_manager_test.cc b/quic/core/quic_received_packet_manager_test.cc
index 7355847..bfdf338 100644
--- a/quic/core/quic_received_packet_manager_test.cc
+++ b/quic/core/quic_received_packet_manager_test.cc
@@ -31,6 +31,11 @@
manager->fast_ack_after_quiescence_ = fast_ack_after_quiescence;
}
+ static void SetOneImmediateAck(QuicReceivedPacketManager* manager,
+ bool one_immediate_ack) {
+ manager->one_immediate_ack_ = one_immediate_ack;
+ }
+
static void SetAckDecimationDelay(QuicReceivedPacketManager* manager,
float ack_decimation_delay) {
manager->ack_decimation_delay_ = ack_decimation_delay;
@@ -247,6 +252,16 @@
// Delayed ack is scheduled.
CheckAckTimeout(clock_.ApproximateNow() + kDelayedAckTime);
+ RecordPacketReceipt(5, clock_.ApproximateNow());
+ MaybeUpdateAckTimeout(kInstigateAck, 5);
+ // Immediate ack is sent.
+ CheckAckTimeout(clock_.ApproximateNow());
+
+ RecordPacketReceipt(6, clock_.ApproximateNow());
+ MaybeUpdateAckTimeout(kInstigateAck, 6);
+ // Immediate ack is scheduled, because 4 is still missing.
+ CheckAckTimeout(clock_.ApproximateNow());
+
RecordPacketReceipt(2, clock_.ApproximateNow());
MaybeUpdateAckTimeout(kInstigateAck, 2);
CheckAckTimeout(clock_.ApproximateNow());
@@ -256,10 +271,44 @@
// Should ack immediately, since this fills the last hole.
CheckAckTimeout(clock_.ApproximateNow());
- RecordPacketReceipt(4, clock_.ApproximateNow());
- MaybeUpdateAckTimeout(kInstigateAck, 4);
+ RecordPacketReceipt(7, clock_.ApproximateNow());
+ MaybeUpdateAckTimeout(kInstigateAck, 7);
+ // Immediate ack is scheduled, because 4 is still missing.
+ CheckAckTimeout(clock_.ApproximateNow());
+}
+
+TEST_P(QuicReceivedPacketManagerTest, OutOfOrderReceiptCausesAckSent1Ack) {
+ QuicReceivedPacketManagerPeer::SetOneImmediateAck(&received_manager_, true);
+ EXPECT_FALSE(HasPendingAck());
+
+ RecordPacketReceipt(3, clock_.ApproximateNow());
+ MaybeUpdateAckTimeout(kInstigateAck, 3);
// Delayed ack is scheduled.
CheckAckTimeout(clock_.ApproximateNow() + kDelayedAckTime);
+
+ RecordPacketReceipt(5, clock_.ApproximateNow());
+ MaybeUpdateAckTimeout(kInstigateAck, 5);
+ // Immediate ack is sent.
+ CheckAckTimeout(clock_.ApproximateNow());
+
+ RecordPacketReceipt(6, clock_.ApproximateNow());
+ MaybeUpdateAckTimeout(kInstigateAck, 6);
+ // Delayed ack is scheduled.
+ CheckAckTimeout(clock_.ApproximateNow() + kDelayedAckTime);
+
+ RecordPacketReceipt(2, clock_.ApproximateNow());
+ MaybeUpdateAckTimeout(kInstigateAck, 2);
+ CheckAckTimeout(clock_.ApproximateNow());
+
+ RecordPacketReceipt(1, clock_.ApproximateNow());
+ MaybeUpdateAckTimeout(kInstigateAck, 1);
+ // Should ack immediately, since this fills the last hole.
+ CheckAckTimeout(clock_.ApproximateNow());
+
+ RecordPacketReceipt(7, clock_.ApproximateNow());
+ MaybeUpdateAckTimeout(kInstigateAck, 7);
+ // Delayed ack is scheduled, even though 4 is still missing.
+ CheckAckTimeout(clock_.ApproximateNow() + kDelayedAckTime);
}
TEST_P(QuicReceivedPacketManagerTest, OutOfOrderAckReceiptCausesNoAck) {