In quic, update ack timeout upon receiving a retransmittable frame, rather than waiting for the packet to be fully processed. protected by gfe2_reloadable_flag_quic_advance_ack_timeout_update.
PiperOrigin-RevId: 310554284
Change-Id: Ic4301712cfa1f935d512029921f68f04482fb8ff
diff --git a/quic/core/quic_connection_test.cc b/quic/core/quic_connection_test.cc
index f3bb4e1..5eb9e62 100644
--- a/quic/core/quic_connection_test.cc
+++ b/quic/core/quic_connection_test.cc
@@ -10775,6 +10775,27 @@
}
}
+TEST_P(QuicConnectionTest, BundleAckWithImmediateResponse) {
+ EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
+ connection_.SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
+
+ EXPECT_CALL(visitor_, OnStreamFrame(_)).WillOnce(Invoke([this]() {
+ connection_.SendControlFrame(QuicFrame(new QuicWindowUpdateFrame(1, 0, 0)));
+ }));
+ EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
+ ProcessDataPacket(1);
+ QuicAlarm* ack_alarm = QuicConnectionPeer::GetAckAlarm(&connection_);
+ if (GetQuicReloadableFlag(quic_advance_ack_timeout_update)) {
+ // Verify ACK is bundled with WINDOW_UPDATE.
+ EXPECT_FALSE(writer_->ack_frames().empty());
+ EXPECT_FALSE(ack_alarm->IsSet());
+ } else {
+ // ACK is pending.
+ EXPECT_TRUE(writer_->ack_frames().empty());
+ EXPECT_TRUE(ack_alarm->IsSet());
+ }
+}
+
} // namespace
} // namespace test
} // namespace quic