Replace gfe2_reloadable_flag_quic_split_up_send_rst with gfe2_reloadable_flag_quic_split_up_send_rst_2.

Under the new flag, it's guaranteed that STOP_SENDING and RESET_STREAM will be sent in the same packet.

Protected by quic_reloadable_flag_quic_split_up_send_rst_2.

PiperOrigin-RevId: 341508593
Change-Id: Ida6350ef5657680d959792ea758c7f849337109a
diff --git a/quic/core/http/end_to_end_test.cc b/quic/core/http/end_to_end_test.cc
index 91e3dd1..a648c69 100644
--- a/quic/core/http/end_to_end_test.cc
+++ b/quic/core/http/end_to_end_test.cc
@@ -2381,7 +2381,20 @@
   // Transmit the cancel, and ensure the connection is torn down properly.
   SetPacketLossPercentage(0);
   QuicStreamId stream_id = GetNthClientInitiatedBidirectionalId(0);
+  QuicConnection* client_connection = GetClientConnection();
+  ASSERT_TRUE(client_connection);
+  const QuicPacketCount packets_sent_before =
+      client_connection->GetStats().packets_sent;
   session->ResetStream(stream_id, QUIC_STREAM_CANCELLED);
+  const QuicPacketCount packets_sent_now =
+      client_connection->GetStats().packets_sent;
+
+  if (version_.UsesHttp3() &&
+      absl::GetFlag(FLAGS_gfe2_reloadable_flag_quic_split_up_send_rst_2)) {
+    // Make sure 2 packets were sent, one for QPACK instructions, another for
+    // RESET_STREAM and STOP_SENDING.
+    EXPECT_EQ(packets_sent_before + 2, packets_sent_now);
+  }
 
   // WaitForEvents waits 50ms and returns true if there are outstanding
   // requests.
diff --git a/quic/core/quic_flags_list.h b/quic/core/quic_flags_list.h
index 6c87293..7b02787 100644
--- a/quic/core/quic_flags_list.h
+++ b/quic/core/quic_flags_list.h
@@ -68,7 +68,7 @@
 QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_send_path_response, false)
 QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_send_timestamps, false)
 QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_send_version_negotiation_for_short_connection_ids, false)
-QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_split_up_send_rst, false)
+QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_split_up_send_rst_2, false)
 QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_start_peer_migration_earlier, false)
 QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_stop_sending_uses_ietf_error_code, true)
 QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_testonly_default_false, false)
diff --git a/quic/core/quic_session.h b/quic/core/quic_session.h
index 775c717..e454892 100644
--- a/quic/core/quic_session.h
+++ b/quic/core/quic_session.h
@@ -221,7 +221,7 @@
 
   // Called by stream to send RST_STREAM (and STOP_SENDING in IETF QUIC).
   // if |send_rst_only|, STOP_SENDING will not be sent for IETF QUIC.
-  // TODO(b/170233449): Delete this method when flag quic_split_up_send_rst is
+  // TODO(b/170233449): Delete this method when flag quic_split_up_send_rst_2 is
   // deprecated.
   virtual void SendRstStream(QuicStreamId id,
                              QuicRstStreamErrorCode error,
@@ -860,7 +860,8 @@
   // creation of new outgoing bidirectional streams.
   bool liveness_testing_in_progress_;
 
-  const bool split_up_send_rst_ = GetQuicReloadableFlag(quic_split_up_send_rst);
+  const bool split_up_send_rst_ =
+      GetQuicReloadableFlag(quic_split_up_send_rst_2);
 
   const bool use_write_or_buffer_data_at_level_ =
       GetQuicReloadableFlag(quic_use_write_or_buffer_data_at_level);
diff --git a/quic/core/quic_stream.cc b/quic/core/quic_stream.cc
index 7a177d4..aaef261 100644
--- a/quic/core/quic_stream.cc
+++ b/quic/core/quic_stream.cc
@@ -499,7 +499,7 @@
   stream_error_ = code;
 
   if (session()->split_up_send_rst()) {
-    QUIC_RELOADABLE_FLAG_COUNT_N(quic_split_up_send_rst, 1, 3);
+    QUIC_RELOADABLE_FLAG_COUNT_N(quic_split_up_send_rst_2, 1, 3);
     MaybeSendRstStream(code);
   } else {
     session()->SendRstStream(id(), code, stream_bytes_written(),
@@ -593,7 +593,8 @@
 void QuicStream::Reset(QuicRstStreamErrorCode error) {
   stream_error_ = error;
   if (session()->split_up_send_rst()) {
-    QUIC_RELOADABLE_FLAG_COUNT_N(quic_split_up_send_rst, 2, 3);
+    QUIC_RELOADABLE_FLAG_COUNT_N(quic_split_up_send_rst_2, 2, 3);
+    QuicConnection::ScopedPacketFlusher flusher(session()->connection());
     MaybeSendStopSending(error);
     MaybeSendRstStream(error);
   } else {
@@ -925,7 +926,7 @@
       session_->MaybeCloseZombieStream(id_);
       rst_sent_ = true;
     } else {
-      QUIC_RELOADABLE_FLAG_COUNT_N(quic_split_up_send_rst, 3, 3);
+      QUIC_RELOADABLE_FLAG_COUNT_N(quic_split_up_send_rst_2, 3, 3);
       QUIC_BUG_IF(session()->connection()->connected() &&
                   session()->version().UsesHttp3())
           << "The stream should've already sent RST in response to "
diff --git a/quic/qbone/qbone_stream_test.cc b/quic/qbone/qbone_stream_test.cc
index 17cd2e1..18f48f7 100644
--- a/quic/qbone/qbone_stream_test.cc
+++ b/quic/qbone/qbone_stream_test.cc
@@ -57,9 +57,6 @@
     return nullptr;
   }
 
-  const QuicCryptoStream* GetCryptoStream() const override { return nullptr; }
-  QuicCryptoStream* GetMutableCryptoStream() override { return nullptr; }
-
   // Called by QuicStream when they want to close stream.
   MOCK_METHOD(void,
               SendRstStream,
@@ -95,7 +92,7 @@
   }
 
   std::unique_ptr<QuicCryptoStream> CreateCryptoStream() override {
-    return nullptr;
+    return std::make_unique<test::MockQuicCryptoStream>(this);
   }
 
   MOCK_METHOD(void, ProcessPacketFromPeer, (absl::string_view), (override));
@@ -162,6 +159,7 @@
     clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1));
     session_ = std::make_unique<StrictMock<MockQuicSession>>(connection_.get(),
                                                              QuicConfig());
+    session_->Initialize();
     stream_ = new QboneReadOnlyStream(kStreamId, session_.get());
     session_->ActivateReliableStream(
         std::unique_ptr<QboneReadOnlyStream>(stream_));