gfe-relnote: Switch from closing the connection to QUIC_BUG in two ShouldCreateIncomingStream() overrides when called with locally initiated stream ID.  Protected by gfe2_reloadable_flag_quic_create_incoming_stream_bug.

ShouldCreateIncomingStream() is only called from CreateIncomingStream(), which
is only be called from QuicSession::GetOrCreateStream(), which already handles
this case by calling HandleFrameOnNonexistentOutgoingStream().

PiperOrigin-RevId: 301278886
Change-Id: I46711aaeb69fe184c328bb57b9a86ee618815616
diff --git a/quic/core/http/quic_server_session_base.cc b/quic/core/http/quic_server_session_base.cc
index 3a7dd98..759c5a5 100644
--- a/quic/core/http/quic_server_session_base.cc
+++ b/quic/core/http/quic_server_session_base.cc
@@ -201,6 +201,17 @@
     return false;
   }
 
+  if (GetQuicReloadableFlag(quic_create_incoming_stream_bug)) {
+    if (QuicUtils::IsServerInitiatedStreamId(transport_version(), id)) {
+      QUIC_RELOADABLE_FLAG_COUNT_N(quic_create_incoming_stream_bug, 1, 2);
+      QUIC_BUG << "ShouldCreateIncomingStream called with server initiated "
+                  "stream ID.";
+      return false;
+    } else {
+      QUIC_RELOADABLE_FLAG_COUNT_N(quic_create_incoming_stream_bug, 2, 2);
+    }
+  }
+
   if (QuicUtils::IsServerInitiatedStreamId(transport_version(), id)) {
     QUIC_DLOG(INFO) << "Invalid incoming even stream_id:" << id;
     connection()->CloseConnection(
diff --git a/quic/core/http/quic_spdy_client_session.cc b/quic/core/http/quic_spdy_client_session.cc
index b7130c3..07b9c7a 100644
--- a/quic/core/http/quic_spdy_client_session.cc
+++ b/quic/core/http/quic_spdy_client_session.cc
@@ -136,6 +136,17 @@
     return false;
   }
 
+  if (GetQuicReloadableFlag(quic_create_incoming_stream_bug)) {
+    if (QuicUtils::IsClientInitiatedStreamId(transport_version(), id)) {
+      QUIC_RELOADABLE_FLAG_COUNT_N(quic_create_incoming_stream_bug, 1, 2);
+      QUIC_BUG << "ShouldCreateIncomingStream called with client initiated "
+                  "stream ID.";
+      return false;
+    } else {
+      QUIC_RELOADABLE_FLAG_COUNT_N(quic_create_incoming_stream_bug, 2, 2);
+    }
+  }
+
   if (QuicUtils::IsClientInitiatedStreamId(transport_version(), id)) {
     QUIC_LOG(WARNING) << "Received invalid push stream id " << id;
     connection()->CloseConnection(
diff --git a/quic/tools/quic_simple_server_session_test.cc b/quic/tools/quic_simple_server_session_test.cc
index a19adec..363dfd9 100644
--- a/quic/tools/quic_simple_server_session_test.cc
+++ b/quic/tools/quic_simple_server_session_test.cc
@@ -443,17 +443,6 @@
   EXPECT_EQ(initial_num_open_stream, session_->GetNumOpenIncomingStreams());
 }
 
-TEST_P(QuicSimpleServerSessionTest, CreateEvenIncomingDynamicStream) {
-  // Tests that incoming stream creation fails when given stream id is even.
-  size_t initial_num_open_stream = session_->GetNumOpenIncomingStreams();
-  EXPECT_CALL(*connection_,
-              CloseConnection(QUIC_INVALID_STREAM_ID,
-                              "Client created even numbered stream", _));
-  QuicSimpleServerSessionPeer::CreateIncomingStream(
-      session_.get(), GetNthServerInitiatedUnidirectionalId(0));
-  EXPECT_EQ(initial_num_open_stream, session_->GetNumOpenIncomingStreams());
-}
-
 TEST_P(QuicSimpleServerSessionTest, CreateIncomingStream) {
   QuicSpdyStream* stream = QuicSimpleServerSessionPeer::CreateIncomingStream(
       session_.get(), GetNthClientInitiatedBidirectionalId(0));
@@ -561,9 +550,10 @@
   session_->OnStreamFrame(frame);
 }
 
+// Tests that calling GetOrCreateStream() on an outgoing stream not promised yet
+// should result close connection.
 TEST_P(QuicSimpleServerSessionTest, GetEvenIncomingError) {
-  // Tests that calling GetOrCreateStream() on an outgoing stream not
-  // promised yet should result close connection.
+  const size_t initial_num_open_stream = session_->GetNumOpenIncomingStreams();
   const QuicErrorCode expected_error = VersionUsesHttp3(transport_version())
                                            ? QUIC_HTTP_STREAM_WRONG_DIRECTION
                                            : QUIC_INVALID_STREAM_ID;
@@ -572,6 +562,7 @@
   EXPECT_EQ(nullptr,
             QuicSessionPeer::GetOrCreateStream(
                 session_.get(), GetNthServerInitiatedUnidirectionalId(3)));
+  EXPECT_EQ(initial_num_open_stream, session_->GetNumOpenIncomingStreams());
 }
 
 // In order to test the case where server push stream creation goes beyond