Add an extra endpoint to the QuicTransport simple server called
/receive-bidirectional. This creates a server-initiated bidirectional stream
every time an incoming stream is received from the client.

This will be used to test receiving bidirectional streams in Chrome.

PiperOrigin-RevId: 332362367
Change-Id: I5b88c266b51b079126691bd6ae52e46795d7297a
diff --git a/quic/tools/quic_transport_simple_server_session.cc b/quic/tools/quic_transport_simple_server_session.cc
index 49c86e5..d07da11 100644
--- a/quic/tools/quic_transport_simple_server_session.cc
+++ b/quic/tools/quic_transport_simple_server_session.cc
@@ -176,6 +176,12 @@
           break;
       }
       break;
+
+    case OUTGOING_BIDIRECTIONAL:
+      stream->set_visitor(std::make_unique<DiscardVisitor>(stream));
+      ++pending_outgoing_bidirectional_streams_;
+      MaybeCreateOutgoingBidirectionalStream();
+      break;
   }
 }
 
@@ -183,6 +189,8 @@
     bool unidirectional) {
   if (mode_ == ECHO && unidirectional) {
     MaybeEchoStreamsBack();
+  } else if (mode_ == OUTGOING_BIDIRECTIONAL && !unidirectional) {
+    MaybeCreateOutgoingBidirectionalStream();
   }
 }
 
@@ -208,6 +216,10 @@
     mode_ = ECHO;
     return true;
   }
+  if (url.path() == "/receive-bidirectional") {
+    mode_ = OUTGOING_BIDIRECTIONAL;
+    return true;
+  }
 
   QUIC_DLOG(WARNING) << "Unknown path requested: " << url.path();
   return false;
@@ -246,4 +258,21 @@
   }
 }
 
+void QuicTransportSimpleServerSession::
+    MaybeCreateOutgoingBidirectionalStream() {
+  while (pending_outgoing_bidirectional_streams_ > 0 &&
+         CanOpenNextOutgoingBidirectionalStream()) {
+    auto stream_owned = std::make_unique<QuicTransportStream>(
+        GetNextOutgoingBidirectionalStreamId(), this, this);
+    QuicTransportStream* stream = stream_owned.get();
+    ActivateStream(std::move(stream_owned));
+    QUIC_DVLOG(1) << "Opened outgoing bidirectional stream " << stream->id();
+    stream->set_visitor(std::make_unique<BidirectionalEchoVisitor>(stream));
+    if (!stream->Write("hello")) {
+      QUIC_DVLOG(1) << "Write failed.";
+    }
+    --pending_outgoing_bidirectional_streams_;
+  }
+}
+
 }  // namespace quic