Add a kAFFE client option to enable the usage of AckFrequencyFrame, including
(1) Send min_ack_delay from client.
(2) Update client upon receiving AckFrequencyFrame.

Separate options will enable actual sending of AckFrequencyFrame and is in follow-up CLs.

PiperOrigin-RevId: 332049097
Change-Id: Ibc267ab580ce7ed5638fd2ad62226f67c1604a85
diff --git a/quic/core/quic_connection_test.cc b/quic/core/quic_connection_test.cc
index fdc4d7a..940a988 100644
--- a/quic/core/quic_connection_test.cc
+++ b/quic/core/quic_connection_test.cc
@@ -2976,12 +2976,20 @@
   ProcessAckPacket(&frame2);
 }
 
-TEST_P(QuicConnectionTest, AckSentEveryNthPacket) {
-  connection_.set_ack_frequency(3);
+TEST_P(QuicConnectionTest, AckFrequencyUpdatedFromAckFrequencyFrame) {
+  if (!GetParam().version.HasIetfQuicFrames()) {
+    return;
+  }
+
+  QuicAckFrequencyFrame frame;
+  frame.packet_tolerance = 3;
+
+  connection_.set_can_receive_ack_frequency_frame();
+  connection_.OnDecryptedPacket(ENCRYPTION_FORWARD_SECURE);
+  connection_.OnAckFrequencyFrame(frame);
 
   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
   EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(39);
-
   // Expect 13 acks, every 3rd packet.
   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(13);
   // Receives packets 1 - 39.
@@ -2990,6 +2998,29 @@
   }
 }
 
+TEST_P(QuicConnectionTest,
+       AckFrequencyFrameOutsideApplicationDataNumberSpaceIsIgnored) {
+  if (!GetParam().version.HasIetfQuicFrames()) {
+    return;
+  }
+
+  QuicAckFrequencyFrame frame;
+  frame.packet_tolerance = 3;
+  connection_.set_can_receive_ack_frequency_frame();
+  connection_.OnDecryptedPacket(ENCRYPTION_HANDSHAKE);
+  connection_.OnAckFrequencyFrame(frame);
+  connection_.OnDecryptedPacket(ENCRYPTION_FORWARD_SECURE);
+
+  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
+  EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(60);
+  // Expect 30 acks, every 2nd (instead of 3rd) packet.
+  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(30);
+  // Receives packets 1 - 60.
+  for (size_t i = 1; i <= 60; ++i) {
+    ProcessDataPacket(i);
+  }
+}
+
 TEST_P(QuicConnectionTest, AckDecimationReducesAcks) {
   const size_t kMinRttMs = 40;
   RttStats* rtt_stats = const_cast<RttStats*>(manager_->GetRttStats());