Add QUIC_BUG_IF to QuicUtils::GetCryptoStreamId

In QUIC versions that use CRYPTO frames (instead of stream 1 frames) for
the crypto handshake, the concept of a "crypto stream ID" makes no
sense, so QuicUtils::GetCryptoStreamId should hit a QUIC_BUG_IF to
prevent its misuse.

gfe-relnote: Add QUIC_BUG_IF protected behind QuicVersionUsesCryptoFrames
PiperOrigin-RevId: 248463613
Change-Id: If6768658e9ffc058778b53a91f95839826602fbf
diff --git a/quic/core/quic_session_test.cc b/quic/core/quic_session_test.cc
index 95bb6d4..deb6643 100644
--- a/quic/core/quic_session_test.cc
+++ b/quic/core/quic_session_test.cc
@@ -94,7 +94,7 @@
   }
 
   MOCK_METHOD0(OnCanWrite, void());
-  bool HasPendingCryptoRetransmission() override { return false; }
+  bool HasPendingCryptoRetransmission() const override { return false; }
 
   MOCK_CONST_METHOD0(HasPendingRetransmission, bool());
 
@@ -109,7 +109,13 @@
 class TestStream : public QuicStream {
  public:
   TestStream(QuicStreamId id, QuicSession* session, StreamType type)
-      : QuicStream(id, session, /*is_static=*/false, type) {}
+      : TestStream(id, session, /*is_static=*/false, type) {}
+
+  TestStream(QuicStreamId id,
+             QuicSession* session,
+             bool is_static,
+             StreamType type)
+      : QuicStream(id, session, is_static, type) {}
 
   TestStream(PendingStream pending, StreamType type)
       : QuicStream(std::move(pending), type, /*is_static=*/false) {}
@@ -260,8 +266,8 @@
 
   QuicConsumedData SendStreamData(QuicStream* stream) {
     struct iovec iov;
-    if (stream->id() !=
-            QuicUtils::GetCryptoStreamId(connection()->transport_version()) &&
+    if (!QuicUtils::IsCryptoStreamId(connection()->transport_version(),
+                                     stream->id()) &&
         this->connection()->encryption_level() != ENCRYPTION_FORWARD_SECURE) {
       this->connection()->SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
     }
@@ -417,6 +423,10 @@
     if (perspective == Perspective::IS_SERVER) {
       id |= 0x1;
     }
+    if (QuicVersionUsesCryptoFrames(connection_->transport_version()) &&
+        bidirectional && perspective == Perspective::IS_CLIENT) {
+      id += 4;
+    }
     return id;
   }
 
@@ -780,7 +790,7 @@
     EXPECT_CALL(
         *connection_,
         CloseConnection(QUIC_INVALID_STREAM_ID,
-                        "Stream id 800 would exceed stream count limit 51",
+                        "Stream id 800 would exceed stream count limit 50",
                         ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET
 
                         ))
@@ -1255,10 +1265,19 @@
 }
 
 TEST_P(QuicSessionTestServer, OnStreamFrameFinStaticStreamId) {
+  QuicStreamId headers_stream_id =
+      QuicUtils::GetHeadersStreamId(connection_->transport_version());
+  std::unique_ptr<TestStream> fake_headers_stream = QuicMakeUnique<TestStream>(
+      headers_stream_id, &session_, /*is_static*/ true, BIDIRECTIONAL);
+  if (GetQuicReloadableFlag(quic_eliminate_static_stream_map_2)) {
+    QuicSessionPeer::RegisterStaticStreamNew(&session_,
+                                             std::move(fake_headers_stream));
+  } else {
+    QuicSessionPeer::RegisterStaticStream(&session_, headers_stream_id,
+                                          fake_headers_stream.get());
+  }
   // Send two bytes of payload.
-  QuicStreamFrame data1(
-      QuicUtils::GetCryptoStreamId(connection_->transport_version()), true, 0,
-      QuicStringPiece("HT"));
+  QuicStreamFrame data1(headers_stream_id, true, 0, QuicStringPiece("HT"));
   EXPECT_CALL(*connection_,
               CloseConnection(
                   QUIC_INVALID_STREAM_ID, "Attempt to close a static stream",
@@ -1267,11 +1286,20 @@
 }
 
 TEST_P(QuicSessionTestServer, OnRstStreamStaticStreamId) {
+  QuicStreamId headers_stream_id =
+      QuicUtils::GetHeadersStreamId(connection_->transport_version());
+  std::unique_ptr<TestStream> fake_headers_stream = QuicMakeUnique<TestStream>(
+      headers_stream_id, &session_, /*is_static*/ true, BIDIRECTIONAL);
+  if (GetQuicReloadableFlag(quic_eliminate_static_stream_map_2)) {
+    QuicSessionPeer::RegisterStaticStreamNew(&session_,
+                                             std::move(fake_headers_stream));
+  } else {
+    QuicSessionPeer::RegisterStaticStream(&session_, headers_stream_id,
+                                          fake_headers_stream.get());
+  }
   // Send two bytes of payload.
-  QuicRstStreamFrame rst1(
-      kInvalidControlFrameId,
-      QuicUtils::GetCryptoStreamId(connection_->transport_version()),
-      QUIC_ERROR_PROCESSING_STREAM, 0);
+  QuicRstStreamFrame rst1(kInvalidControlFrameId, headers_stream_id,
+                          QUIC_ERROR_PROCESSING_STREAM, 0);
   EXPECT_CALL(*connection_,
               CloseConnection(
                   QUIC_INVALID_STREAM_ID, "Attempt to reset a static stream",
@@ -1620,7 +1648,7 @@
     EXPECT_CALL(
         *connection_,
         CloseConnection(QUIC_INVALID_STREAM_ID,
-                        "Stream id 24 would exceed stream count limit 6", _));
+                        "Stream id 24 would exceed stream count limit 5", _));
   } else {
     EXPECT_CALL(*connection_, SendControlFrame(_)).Times(1);
     EXPECT_CALL(*connection_,
@@ -1916,9 +1944,12 @@
   TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
   TestStream* stream4 = session_.CreateOutgoingBidirectionalStream();
 
-  QuicStreamFrame frame1(
-      QuicUtils::GetCryptoStreamId(connection_->transport_version()), false, 0,
-      1300);
+  QuicStreamFrame frame1;
+  if (!QuicVersionUsesCryptoFrames(connection_->transport_version())) {
+    frame1 = QuicStreamFrame(
+        QuicUtils::GetCryptoStreamId(connection_->transport_version()), false,
+        0, 1300);
+  }
   QuicStreamFrame frame2(stream2->id(), false, 0, 9);
   QuicStreamFrame frame3(stream4->id(), false, 0, 9);
 
@@ -2354,7 +2385,7 @@
   EXPECT_CALL(
       *connection_,
       CloseConnection(QUIC_INVALID_STREAM_ID,
-                      "Stream id 404 would exceed stream count limit 101", _));
+                      "Stream id 404 would exceed stream count limit 100", _));
   session_.OnStreamFrame(bidirectional_stream_frame);
 
   QuicStreamId unidirectional_stream_id = StreamCountToId(
@@ -2395,9 +2426,19 @@
     // Applicable only to V99
     return;
   }
+  QuicStreamId stream_id = 0;
+  std::unique_ptr<TestStream> fake_static_stream = QuicMakeUnique<TestStream>(
+      stream_id, &session_, /*is_static*/ true, BIDIRECTIONAL);
+  if (GetQuicReloadableFlag(quic_eliminate_static_stream_map_2)) {
+    QuicSessionPeer::RegisterStaticStreamNew(&session_,
+                                             std::move(fake_static_stream));
+  } else {
+    QuicSessionPeer::RegisterStaticStream(&session_, stream_id,
+                                          fake_static_stream.get());
+  }
   // Check that a stream id in the static stream map is ignored.
   // Note that the notion of a static stream is Google-specific.
-  QuicStopSendingFrame frame(1, 0, 123);
+  QuicStopSendingFrame frame(1, stream_id, 123);
   EXPECT_CALL(*connection_,
               CloseConnection(QUIC_INVALID_STREAM_ID,
                               "Received STOP_SENDING for a static stream", _));