Delay the first Initial ACK sent by the server so it can be bundled with the server's first Initial packet.

Protected by FLAGS_quic_reloadable_flag_quic_delay_initial_ack.

PiperOrigin-RevId: 338518843
Change-Id: Ib8cb7375f212ac5f028bd2c7f6a191278ac01540
diff --git a/quic/core/uber_received_packet_manager_test.cc b/quic/core/uber_received_packet_manager_test.cc
index b7063d2..3a1531b 100644
--- a/quic/core/uber_received_packet_manager_test.cc
+++ b/quic/core/uber_received_packet_manager_test.cc
@@ -439,7 +439,7 @@
 
 TEST_F(UberReceivedPacketManagerTest,
        DontWaitForPacketsBeforeMultiplePacketNumberSpaces) {
-  manager_->EnableMultiplePacketNumberSpacesSupport();
+  manager_->EnableMultiplePacketNumberSpacesSupport(Perspective::IS_CLIENT);
   EXPECT_FALSE(
       manager_->GetLargestObserved(ENCRYPTION_HANDSHAKE).IsInitialized());
   EXPECT_FALSE(
@@ -469,10 +469,42 @@
 }
 
 TEST_F(UberReceivedPacketManagerTest, AckSendingDifferentPacketNumberSpaces) {
-  manager_->EnableMultiplePacketNumberSpacesSupport();
+  manager_->EnableMultiplePacketNumberSpacesSupport(Perspective::IS_SERVER);
   EXPECT_FALSE(HasPendingAck());
   EXPECT_FALSE(manager_->IsAckFrameUpdated());
 
+  RecordPacketReceipt(ENCRYPTION_INITIAL, 3);
+  EXPECT_TRUE(manager_->IsAckFrameUpdated());
+  MaybeUpdateAckTimeout(kInstigateAck, ENCRYPTION_INITIAL, 3);
+  EXPECT_TRUE(HasPendingAck());
+  // Delayed ack is scheduled.
+  if (GetQuicReloadableFlag(quic_delay_initial_ack)) {
+    CheckAckTimeout(clock_.ApproximateNow() +
+                    QuicTime::Delta::FromMilliseconds(25));
+    // Send delayed handshake data ACK.
+    clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(25));
+  } else {
+    CheckAckTimeout(clock_.ApproximateNow() +
+                    QuicTime::Delta::FromMilliseconds(1));
+    // Send delayed handshake data ACK.
+    clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1));
+  }
+  CheckAckTimeout(clock_.ApproximateNow());
+  EXPECT_FALSE(HasPendingAck());
+
+  // Second delayed ack should have a shorter delay.
+  RecordPacketReceipt(ENCRYPTION_INITIAL, 4);
+  EXPECT_TRUE(manager_->IsAckFrameUpdated());
+  MaybeUpdateAckTimeout(kInstigateAck, ENCRYPTION_INITIAL, 4);
+  EXPECT_TRUE(HasPendingAck());
+  // Delayed ack is scheduled.
+  CheckAckTimeout(clock_.ApproximateNow() +
+                  QuicTime::Delta::FromMilliseconds(1));
+  // Send delayed handshake data ACK.
+  clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1));
+  CheckAckTimeout(clock_.ApproximateNow());
+  EXPECT_FALSE(HasPendingAck());
+
   RecordPacketReceipt(ENCRYPTION_HANDSHAKE, 3);
   EXPECT_TRUE(manager_->IsAckFrameUpdated());
   MaybeUpdateAckTimeout(kInstigateAck, ENCRYPTION_HANDSHAKE, 3);