gfe-relnote: Stop removing handshake packets from flight when the handshake timer causes them to be retransmitted.  Protected by gfe2_reloadable_flag_quic_loss_removes_from_inflight.

PiperOrigin-RevId: 244887395
Change-Id: I355da0f1a78e596e4d4bd2a2721c37d1cedc5806
diff --git a/quic/core/quic_sent_packet_manager_test.cc b/quic/core/quic_sent_packet_manager_test.cc
index 6448419..ec8de8b 100644
--- a/quic/core/quic_sent_packet_manager_test.cc
+++ b/quic/core/quic_sent_packet_manager_test.cc
@@ -1036,6 +1036,7 @@
     SendDataPacket(kNumSentCryptoPackets + i);
   }
   EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
+  EXPECT_EQ(5 * kDefaultLength, manager_.GetBytesInFlight());
 
   // The first retransmits 2 packets.
   if (manager_.session_decides_what_to_write()) {
@@ -1051,6 +1052,10 @@
     RetransmitNextPacket(7);
     EXPECT_FALSE(manager_.HasPendingRetransmissions());
   }
+  // Expect all 4 handshake packets to be in flight and 3 data packets.
+  if (GetQuicReloadableFlag(quic_loss_removes_from_inflight)) {
+    EXPECT_EQ(7 * kDefaultLength, manager_.GetBytesInFlight());
+  }
   EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
 
   // The second retransmits 2 packets.
@@ -1067,12 +1072,26 @@
     RetransmitNextPacket(9);
     EXPECT_FALSE(manager_.HasPendingRetransmissions());
   }
+  if (GetQuicReloadableFlag(quic_loss_removes_from_inflight)) {
+    EXPECT_EQ(9 * kDefaultLength, manager_.GetBytesInFlight());
+  }
   EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
 
   // Now ack the two crypto packets and the speculatively encrypted request,
   // and ensure the first four crypto packets get abandoned, but not lost.
-  uint64_t acked[] = {3, 4, 5, 8, 9};
-  ExpectAcksAndLosses(true, acked, QUIC_ARRAYSIZE(acked), nullptr, 0);
+  if (GetQuicReloadableFlag(quic_loss_removes_from_inflight)) {
+    // Crypto packets remain in flight, so any that aren't acked will be lost.
+    uint64_t acked[] = {3, 4, 5, 8, 9};
+    uint64_t lost[] = {1, 2, 6};
+    ExpectAcksAndLosses(true, acked, QUIC_ARRAYSIZE(acked), lost,
+                        QUIC_ARRAYSIZE(lost));
+    if (manager_.session_decides_what_to_write()) {
+      EXPECT_CALL(notifier_, OnFrameLost(_)).Times(3);
+    }
+  } else {
+    uint64_t acked[] = {3, 4, 5, 8, 9};
+    ExpectAcksAndLosses(true, acked, QUIC_ARRAYSIZE(acked), nullptr, 0);
+  }
   if (manager_.session_decides_what_to_write()) {
     EXPECT_CALL(notifier_, HasUnackedCryptoData())
         .WillRepeatedly(Return(false));
@@ -1203,8 +1222,13 @@
             manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
 
   EXPECT_FALSE(manager_.HasUnackedCryptoPackets());
-  uint64_t unacked[] = {3};
-  VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
+  if (GetQuicReloadableFlag(quic_loss_removes_from_inflight)) {
+    uint64_t unacked[] = {1, 3};
+    VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
+  } else {
+    uint64_t unacked[] = {3};
+    VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
+  }
 }
 
 TEST_P(QuicSentPacketManagerTest, CryptoHandshakeTimeoutUnsentDataPacket) {