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