In quic, check quicconnection::shouldgeneratepacket for every crypto packet. protected by gfe2_reloadable_flag_quic_fix_checking_should_generate_packet.

PiperOrigin-RevId: 311781975
Change-Id: I419d5446adb83f19927915d65e779b3cdb692532
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc
index 4f089a4..5f20559 100644
--- a/quic/core/quic_connection.cc
+++ b/quic/core/quic_connection.cc
@@ -1700,7 +1700,8 @@
     QUIC_BUG << "Attempt to send empty crypto frame";
     return 0;
   }
-  if (!ShouldGeneratePacket(HAS_RETRANSMITTABLE_DATA, IS_HANDSHAKE)) {
+  if (!GetQuicReloadableFlag(quic_fix_checking_should_generate_packet) &&
+      !ShouldGeneratePacket(HAS_RETRANSMITTABLE_DATA, IS_HANDSHAKE)) {
     return 0;
   }
   ScopedPacketFlusher flusher(this);
diff --git a/quic/core/quic_packet_creator.cc b/quic/core/quic_packet_creator.cc
index d5555fc..4db87e2 100644
--- a/quic/core/quic_packet_creator.cc
+++ b/quic/core/quic_packet_creator.cc
@@ -1287,7 +1287,13 @@
 
   size_t total_bytes_consumed = 0;
 
-  while (total_bytes_consumed < write_length) {
+  while (total_bytes_consumed < write_length &&
+         (!GetQuicReloadableFlag(quic_fix_checking_should_generate_packet) ||
+          delegate_->ShouldGeneratePacket(HAS_RETRANSMITTABLE_DATA,
+                                          IS_HANDSHAKE))) {
+    if (GetQuicReloadableFlag(quic_fix_checking_should_generate_packet)) {
+      QUIC_RELOADABLE_FLAG_COUNT(quic_fix_checking_should_generate_packet);
+    }
     QuicFrame frame;
     if (!ConsumeCryptoDataToFillCurrentPacket(
             level, write_length - total_bytes_consumed,
diff --git a/quic/core/quic_packet_creator_test.cc b/quic/core/quic_packet_creator_test.cc
index d1beea7..19267c9 100644
--- a/quic/core/quic_packet_creator_test.cc
+++ b/quic/core/quic_packet_creator_test.cc
@@ -2679,6 +2679,37 @@
   CheckPacketContains(contents, 0);
 }
 
+TEST_F(QuicPacketCreatorMultiplePacketsTest,
+       ConsumeCryptoDataCheckShouldGeneratePacket) {
+  delegate_.SetCanNotWrite();
+
+  if (GetQuicReloadableFlag(quic_fix_checking_should_generate_packet)) {
+    EXPECT_CALL(delegate_, OnSerializedPacket(_)).Times(0);
+  } else {
+    EXPECT_CALL(delegate_, OnSerializedPacket(_))
+        .WillOnce(
+            Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
+  }
+  std::string data = "crypto data";
+  size_t consumed_bytes =
+      creator_.ConsumeCryptoData(ENCRYPTION_INITIAL, data, 0);
+  creator_.Flush();
+  if (GetQuicReloadableFlag(quic_fix_checking_should_generate_packet)) {
+    EXPECT_EQ(0u, consumed_bytes);
+  } else {
+    EXPECT_EQ(data.length(), consumed_bytes);
+  }
+  EXPECT_FALSE(creator_.HasPendingFrames());
+  EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
+  if (GetQuicReloadableFlag(quic_fix_checking_should_generate_packet)) {
+    return;
+  }
+  PacketContents contents;
+  contents.num_crypto_frames = 1;
+  contents.num_padding_frames = 1;
+  CheckPacketContains(contents, 0);
+}
+
 TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeData_NotWritable) {
   delegate_.SetCanNotWrite();