Renumber QUIC streams when there is no crypto stream

This also modifies spdy::PriorityWriteScheduler to allow using a different
value than kHttp2RootStreamId as the root stream ID.

gfe-relnote: Renumber QUIC streams, protected by QUIC_VERSION_99
PiperOrigin-RevId: 248609263
Change-Id: I5e83b5950253068996df830694ac55e424d7aa54
diff --git a/quic/core/http/quic_spdy_session_test.cc b/quic/core/http/quic_spdy_session_test.cc
index e0e417a..8217cd7 100644
--- a/quic/core/http/quic_spdy_session_test.cc
+++ b/quic/core/http/quic_spdy_session_test.cc
@@ -395,12 +395,6 @@
     if (perspective == Perspective::IS_SERVER) {
       id |= 0x1;
     }
-    if (bidirectional && perspective == Perspective::IS_CLIENT &&
-        QuicVersionUsesCryptoFrames(transport_version())) {
-      // Once stream ID 0 is used as a normal client initiated bidirectional
-      // stream, this shouldn't be needed any more.
-      id += 4;
-    }
     return id;
   }
 
@@ -1564,7 +1558,7 @@
     EXPECT_CALL(
         *connection_,
         CloseConnection(QUIC_INVALID_STREAM_ID,
-                        "Stream id 28 would exceed stream count limit 6", _));
+                        "Stream id 24 would exceed stream count limit 6", _));
   }
   // Create one more data streams to exceed limit of open stream.
   QuicStreamFrame data1(kFinalStreamId, false, 0, QuicStringPiece("HT"));
diff --git a/quic/core/quic_session.cc b/quic/core/quic_session.cc
index 96f98ad..abc6331 100644
--- a/quic/core/quic_session.cc
+++ b/quic/core/quic_session.cc
@@ -51,7 +51,7 @@
                          const ParsedQuicVersionVector& supported_versions)
     : connection_(connection),
       visitor_(owner),
-      write_blocked_streams_(),
+      write_blocked_streams_(connection->transport_version()),
       config_(config),
       stream_id_manager_(this,
                          kDefaultMaxStreamsPerConnection,
diff --git a/quic/core/quic_session_test.cc b/quic/core/quic_session_test.cc
index deb6643..5af49fa 100644
--- a/quic/core/quic_session_test.cc
+++ b/quic/core/quic_session_test.cc
@@ -423,10 +423,6 @@
     if (perspective == Perspective::IS_SERVER) {
       id |= 0x1;
     }
-    if (QuicVersionUsesCryptoFrames(connection_->transport_version()) &&
-        bidirectional && perspective == Perspective::IS_CLIENT) {
-      id += 4;
-    }
     return id;
   }
 
@@ -787,13 +783,16 @@
                            GetNthClientInitiatedBidirectionalId(49)));
     // and this should fail because it exceeds the bnidirectional limit
     // (but not the uni-)
+    std::string error_detail;
+    if (QuicVersionUsesCryptoFrames(transport_version())) {
+      error_detail = "Stream id 796 would exceed stream count limit 50";
+    } else {
+      error_detail = "Stream id 800 would exceed stream count limit 50";
+    }
     EXPECT_CALL(
         *connection_,
-        CloseConnection(QUIC_INVALID_STREAM_ID,
-                        "Stream id 800 would exceed stream count limit 50",
-                        ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET
-
-                        ))
+        CloseConnection(QUIC_INVALID_STREAM_ID, error_detail,
+                        ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET))
         .Times(1);
     EXPECT_EQ(nullptr, session_.GetOrCreateDynamicStream(
                            GetNthClientInitiatedBidirectionalId(199)));
@@ -1648,7 +1647,7 @@
     EXPECT_CALL(
         *connection_,
         CloseConnection(QUIC_INVALID_STREAM_ID,
-                        "Stream id 24 would exceed stream count limit 5", _));
+                        "Stream id 20 would exceed stream count limit 5", _));
   } else {
     EXPECT_CALL(*connection_, SendControlFrame(_)).Times(1);
     EXPECT_CALL(*connection_,
@@ -2385,7 +2384,7 @@
   EXPECT_CALL(
       *connection_,
       CloseConnection(QUIC_INVALID_STREAM_ID,
-                      "Stream id 404 would exceed stream count limit 100", _));
+                      "Stream id 400 would exceed stream count limit 100", _));
   session_.OnStreamFrame(bidirectional_stream_frame);
 
   QuicStreamId unidirectional_stream_id = StreamCountToId(
diff --git a/quic/core/quic_utils.cc b/quic/core/quic_utils.cc
index dc40122..a7fe40f 100644
--- a/quic/core/quic_utils.cc
+++ b/quic/core/quic_utils.cc
@@ -399,7 +399,7 @@
 
 // static
 QuicStreamId QuicUtils::GetHeadersStreamId(QuicTransportVersion version) {
-  return version == QUIC_VERSION_99 ? 4 : 3;
+  return GetFirstBidirectionalStreamId(version, Perspective::IS_CLIENT);
 }
 
 // static
@@ -461,19 +461,26 @@
 QuicStreamId QuicUtils::GetFirstBidirectionalStreamId(
     QuicTransportVersion version,
     Perspective perspective) {
-  if (perspective == Perspective::IS_CLIENT) {
-    // TODO(nharper): Return 0 instead of 4 when CRYPTO frames are used.
-    return version == QUIC_VERSION_99 ? 4 : 3;
+  if (version == QUIC_VERSION_99) {
+    return perspective == Perspective::IS_CLIENT ? 0 : 1;
+  } else if (QuicVersionUsesCryptoFrames(version)) {
+    return perspective == Perspective::IS_CLIENT ? 1 : 2;
   }
-  return version == QUIC_VERSION_99 ? 1 : 2;
+  return perspective == Perspective::IS_CLIENT ? 3 : 2;
 }
 
 // static
 QuicStreamId QuicUtils::GetFirstUnidirectionalStreamId(
     QuicTransportVersion version,
     Perspective perspective) {
+  if (version == QUIC_VERSION_99) {
+    return perspective == Perspective::IS_CLIENT ? 2 : 3;
+  } else if (QuicVersionUsesCryptoFrames(version)) {
+    return perspective == Perspective::IS_CLIENT ? 1 : 2;
+  }
+  return perspective == Perspective::IS_CLIENT ? 3 : 2;
   if (perspective == Perspective::IS_CLIENT) {
-    return version == QUIC_VERSION_99 ? 2 : 3;
+    return version == QUIC_VERSION_99 ? 2 : 1;
   }
   return version == QUIC_VERSION_99 ? 3 : 2;
 }
diff --git a/quic/core/quic_write_blocked_list.cc b/quic/core/quic_write_blocked_list.cc
index e392955..d7fe3c0 100644
--- a/quic/core/quic_write_blocked_list.cc
+++ b/quic/core/quic_write_blocked_list.cc
@@ -9,7 +9,11 @@
 
 namespace quic {
 
-QuicWriteBlockedList::QuicWriteBlockedList() : last_priority_popped_(0) {
+QuicWriteBlockedList::QuicWriteBlockedList(QuicTransportVersion version)
+    : priority_write_scheduler_(QuicVersionUsesCryptoFrames(version)
+                                    ? std::numeric_limits<QuicStreamId>::max()
+                                    : 0),
+      last_priority_popped_(0) {
   memset(batch_write_stream_id_, 0, sizeof(batch_write_stream_id_));
   memset(bytes_left_for_batch_write_, 0, sizeof(bytes_left_for_batch_write_));
 }
diff --git a/quic/core/quic_write_blocked_list.h b/quic/core/quic_write_blocked_list.h
index 83c2e20..eca7c1a 100644
--- a/quic/core/quic_write_blocked_list.h
+++ b/quic/core/quic_write_blocked_list.h
@@ -24,7 +24,7 @@
   typedef spdy::PriorityWriteScheduler<QuicStreamId> QuicPriorityWriteScheduler;
 
  public:
-  explicit QuicWriteBlockedList();
+  explicit QuicWriteBlockedList(QuicTransportVersion version);
   QuicWriteBlockedList(const QuicWriteBlockedList&) = delete;
   QuicWriteBlockedList& operator=(const QuicWriteBlockedList&) = delete;
   ~QuicWriteBlockedList();
diff --git a/quic/core/quic_write_blocked_list_test.cc b/quic/core/quic_write_blocked_list_test.cc
index a9319e3..30bb08e 100644
--- a/quic/core/quic_write_blocked_list_test.cc
+++ b/quic/core/quic_write_blocked_list_test.cc
@@ -14,218 +14,214 @@
 namespace test {
 namespace {
 
-class QuicWriteBlockedListTest : public QuicTest {};
+class QuicWriteBlockedListTest : public QuicTest {
+ public:
+  QuicWriteBlockedListTest()
+      : write_blocked_list_(AllSupportedVersions()[0].transport_version) {}
+
+ protected:
+  QuicWriteBlockedList write_blocked_list_;
+};
 
 TEST_F(QuicWriteBlockedListTest, PriorityOrder) {
-  QuicWriteBlockedList write_blocked_list;
-
   // Mark streams blocked in roughly reverse priority order, and
   // verify that streams are sorted.
-  write_blocked_list.RegisterStream(40, false, kV3LowestPriority);
-  write_blocked_list.RegisterStream(23, false, kV3HighestPriority);
-  write_blocked_list.RegisterStream(17, false, kV3HighestPriority);
-  write_blocked_list.RegisterStream(1, true, kV3HighestPriority);
-  write_blocked_list.RegisterStream(3, true, kV3HighestPriority);
+  write_blocked_list_.RegisterStream(40, false, kV3LowestPriority);
+  write_blocked_list_.RegisterStream(23, false, kV3HighestPriority);
+  write_blocked_list_.RegisterStream(17, false, kV3HighestPriority);
+  write_blocked_list_.RegisterStream(1, true, kV3HighestPriority);
+  write_blocked_list_.RegisterStream(3, true, kV3HighestPriority);
 
-  write_blocked_list.AddStream(40);
-  EXPECT_TRUE(write_blocked_list.IsStreamBlocked(40));
-  write_blocked_list.AddStream(23);
-  EXPECT_TRUE(write_blocked_list.IsStreamBlocked(23));
-  write_blocked_list.AddStream(17);
-  EXPECT_TRUE(write_blocked_list.IsStreamBlocked(17));
-  write_blocked_list.AddStream(3);
-  EXPECT_TRUE(write_blocked_list.IsStreamBlocked(3));
-  write_blocked_list.AddStream(1);
-  EXPECT_TRUE(write_blocked_list.IsStreamBlocked(1));
+  write_blocked_list_.AddStream(40);
+  EXPECT_TRUE(write_blocked_list_.IsStreamBlocked(40));
+  write_blocked_list_.AddStream(23);
+  EXPECT_TRUE(write_blocked_list_.IsStreamBlocked(23));
+  write_blocked_list_.AddStream(17);
+  EXPECT_TRUE(write_blocked_list_.IsStreamBlocked(17));
+  write_blocked_list_.AddStream(3);
+  EXPECT_TRUE(write_blocked_list_.IsStreamBlocked(3));
+  write_blocked_list_.AddStream(1);
+  EXPECT_TRUE(write_blocked_list_.IsStreamBlocked(1));
 
-  EXPECT_EQ(5u, write_blocked_list.NumBlockedStreams());
-  EXPECT_TRUE(write_blocked_list.HasWriteBlockedSpecialStream());
-  EXPECT_EQ(2u, write_blocked_list.NumBlockedSpecialStreams());
-  EXPECT_TRUE(write_blocked_list.HasWriteBlockedDataStreams());
+  EXPECT_EQ(5u, write_blocked_list_.NumBlockedStreams());
+  EXPECT_TRUE(write_blocked_list_.HasWriteBlockedSpecialStream());
+  EXPECT_EQ(2u, write_blocked_list_.NumBlockedSpecialStreams());
+  EXPECT_TRUE(write_blocked_list_.HasWriteBlockedDataStreams());
   // The Crypto stream is highest priority.
-  EXPECT_EQ(1u, write_blocked_list.PopFront());
-  EXPECT_EQ(1u, write_blocked_list.NumBlockedSpecialStreams());
-  EXPECT_FALSE(write_blocked_list.IsStreamBlocked(1));
+  EXPECT_EQ(1u, write_blocked_list_.PopFront());
+  EXPECT_EQ(1u, write_blocked_list_.NumBlockedSpecialStreams());
+  EXPECT_FALSE(write_blocked_list_.IsStreamBlocked(1));
   // Followed by the Headers stream.
-  EXPECT_EQ(3u, write_blocked_list.PopFront());
-  EXPECT_EQ(0u, write_blocked_list.NumBlockedSpecialStreams());
-  EXPECT_FALSE(write_blocked_list.IsStreamBlocked(3));
+  EXPECT_EQ(3u, write_blocked_list_.PopFront());
+  EXPECT_EQ(0u, write_blocked_list_.NumBlockedSpecialStreams());
+  EXPECT_FALSE(write_blocked_list_.IsStreamBlocked(3));
   // Streams with same priority are popped in the order they were inserted.
-  EXPECT_EQ(23u, write_blocked_list.PopFront());
-  EXPECT_FALSE(write_blocked_list.IsStreamBlocked(23));
-  EXPECT_EQ(17u, write_blocked_list.PopFront());
-  EXPECT_FALSE(write_blocked_list.IsStreamBlocked(17));
+  EXPECT_EQ(23u, write_blocked_list_.PopFront());
+  EXPECT_FALSE(write_blocked_list_.IsStreamBlocked(23));
+  EXPECT_EQ(17u, write_blocked_list_.PopFront());
+  EXPECT_FALSE(write_blocked_list_.IsStreamBlocked(17));
   // Low priority stream appears last.
-  EXPECT_EQ(40u, write_blocked_list.PopFront());
-  EXPECT_FALSE(write_blocked_list.IsStreamBlocked(40));
+  EXPECT_EQ(40u, write_blocked_list_.PopFront());
+  EXPECT_FALSE(write_blocked_list_.IsStreamBlocked(40));
 
-  EXPECT_EQ(0u, write_blocked_list.NumBlockedStreams());
-  EXPECT_FALSE(write_blocked_list.HasWriteBlockedSpecialStream());
-  EXPECT_FALSE(write_blocked_list.HasWriteBlockedDataStreams());
+  EXPECT_EQ(0u, write_blocked_list_.NumBlockedStreams());
+  EXPECT_FALSE(write_blocked_list_.HasWriteBlockedSpecialStream());
+  EXPECT_FALSE(write_blocked_list_.HasWriteBlockedDataStreams());
 }
 
 TEST_F(QuicWriteBlockedListTest, CryptoStream) {
-  QuicWriteBlockedList write_blocked_list;
-  write_blocked_list.RegisterStream(1, true, kV3HighestPriority);
-  write_blocked_list.AddStream(1);
+  write_blocked_list_.RegisterStream(1, true, kV3HighestPriority);
+  write_blocked_list_.AddStream(1);
 
-  EXPECT_EQ(1u, write_blocked_list.NumBlockedStreams());
-  EXPECT_TRUE(write_blocked_list.HasWriteBlockedSpecialStream());
-  EXPECT_EQ(1u, write_blocked_list.PopFront());
-  EXPECT_EQ(0u, write_blocked_list.NumBlockedStreams());
-  EXPECT_FALSE(write_blocked_list.HasWriteBlockedSpecialStream());
+  EXPECT_EQ(1u, write_blocked_list_.NumBlockedStreams());
+  EXPECT_TRUE(write_blocked_list_.HasWriteBlockedSpecialStream());
+  EXPECT_EQ(1u, write_blocked_list_.PopFront());
+  EXPECT_EQ(0u, write_blocked_list_.NumBlockedStreams());
+  EXPECT_FALSE(write_blocked_list_.HasWriteBlockedSpecialStream());
 }
 
 TEST_F(QuicWriteBlockedListTest, HeadersStream) {
-  QuicWriteBlockedList write_blocked_list;
-  write_blocked_list.RegisterStream(3, true, kV3HighestPriority);
-  write_blocked_list.AddStream(3);
+  write_blocked_list_.RegisterStream(3, true, kV3HighestPriority);
+  write_blocked_list_.AddStream(3);
 
-  EXPECT_EQ(1u, write_blocked_list.NumBlockedStreams());
-  EXPECT_TRUE(write_blocked_list.HasWriteBlockedSpecialStream());
-  EXPECT_EQ(3u, write_blocked_list.PopFront());
-  EXPECT_EQ(0u, write_blocked_list.NumBlockedStreams());
-  EXPECT_FALSE(write_blocked_list.HasWriteBlockedSpecialStream());
+  EXPECT_EQ(1u, write_blocked_list_.NumBlockedStreams());
+  EXPECT_TRUE(write_blocked_list_.HasWriteBlockedSpecialStream());
+  EXPECT_EQ(3u, write_blocked_list_.PopFront());
+  EXPECT_EQ(0u, write_blocked_list_.NumBlockedStreams());
+  EXPECT_FALSE(write_blocked_list_.HasWriteBlockedSpecialStream());
 }
 
 TEST_F(QuicWriteBlockedListTest, VerifyHeadersStream) {
-  QuicWriteBlockedList write_blocked_list;
-  write_blocked_list.RegisterStream(5, false, kV3HighestPriority);
-  write_blocked_list.RegisterStream(3, true, kV3HighestPriority);
-  write_blocked_list.AddStream(5);
-  write_blocked_list.AddStream(3);
+  write_blocked_list_.RegisterStream(5, false, kV3HighestPriority);
+  write_blocked_list_.RegisterStream(3, true, kV3HighestPriority);
+  write_blocked_list_.AddStream(5);
+  write_blocked_list_.AddStream(3);
 
-  EXPECT_EQ(2u, write_blocked_list.NumBlockedStreams());
-  EXPECT_TRUE(write_blocked_list.HasWriteBlockedSpecialStream());
-  EXPECT_TRUE(write_blocked_list.HasWriteBlockedDataStreams());
+  EXPECT_EQ(2u, write_blocked_list_.NumBlockedStreams());
+  EXPECT_TRUE(write_blocked_list_.HasWriteBlockedSpecialStream());
+  EXPECT_TRUE(write_blocked_list_.HasWriteBlockedDataStreams());
   // In newer QUIC versions, there is a headers stream which is
   // higher priority than data streams.
-  EXPECT_EQ(3u, write_blocked_list.PopFront());
-  EXPECT_EQ(5u, write_blocked_list.PopFront());
-  EXPECT_EQ(0u, write_blocked_list.NumBlockedStreams());
-  EXPECT_FALSE(write_blocked_list.HasWriteBlockedSpecialStream());
-  EXPECT_FALSE(write_blocked_list.HasWriteBlockedDataStreams());
+  EXPECT_EQ(3u, write_blocked_list_.PopFront());
+  EXPECT_EQ(5u, write_blocked_list_.PopFront());
+  EXPECT_EQ(0u, write_blocked_list_.NumBlockedStreams());
+  EXPECT_FALSE(write_blocked_list_.HasWriteBlockedSpecialStream());
+  EXPECT_FALSE(write_blocked_list_.HasWriteBlockedDataStreams());
 }
 
 TEST_F(QuicWriteBlockedListTest, NoDuplicateEntries) {
   // Test that QuicWriteBlockedList doesn't allow duplicate entries.
-  QuicWriteBlockedList write_blocked_list;
-
   // Try to add a stream to the write blocked list multiple times at the same
   // priority.
   const QuicStreamId kBlockedId = 3 + 2;
-  write_blocked_list.RegisterStream(kBlockedId, false, kV3HighestPriority);
-  write_blocked_list.AddStream(kBlockedId);
-  write_blocked_list.AddStream(kBlockedId);
-  write_blocked_list.AddStream(kBlockedId);
+  write_blocked_list_.RegisterStream(kBlockedId, false, kV3HighestPriority);
+  write_blocked_list_.AddStream(kBlockedId);
+  write_blocked_list_.AddStream(kBlockedId);
+  write_blocked_list_.AddStream(kBlockedId);
 
   // This should only result in one blocked stream being added.
-  EXPECT_EQ(1u, write_blocked_list.NumBlockedStreams());
-  EXPECT_TRUE(write_blocked_list.HasWriteBlockedDataStreams());
+  EXPECT_EQ(1u, write_blocked_list_.NumBlockedStreams());
+  EXPECT_TRUE(write_blocked_list_.HasWriteBlockedDataStreams());
 
   // There should only be one stream to pop off the front.
-  EXPECT_EQ(kBlockedId, write_blocked_list.PopFront());
-  EXPECT_EQ(0u, write_blocked_list.NumBlockedStreams());
-  EXPECT_FALSE(write_blocked_list.HasWriteBlockedDataStreams());
+  EXPECT_EQ(kBlockedId, write_blocked_list_.PopFront());
+  EXPECT_EQ(0u, write_blocked_list_.NumBlockedStreams());
+  EXPECT_FALSE(write_blocked_list_.HasWriteBlockedDataStreams());
 }
 
 TEST_F(QuicWriteBlockedListTest, BatchingWrites) {
-  QuicWriteBlockedList write_blocked_list;
-
   const QuicStreamId id1 = 3 + 2;
   const QuicStreamId id2 = id1 + 2;
   const QuicStreamId id3 = id2 + 2;
-  write_blocked_list.RegisterStream(id1, false, kV3LowestPriority);
-  write_blocked_list.RegisterStream(id2, false, kV3LowestPriority);
-  write_blocked_list.RegisterStream(id3, false, kV3HighestPriority);
+  write_blocked_list_.RegisterStream(id1, false, kV3LowestPriority);
+  write_blocked_list_.RegisterStream(id2, false, kV3LowestPriority);
+  write_blocked_list_.RegisterStream(id3, false, kV3HighestPriority);
 
-  write_blocked_list.AddStream(id1);
-  write_blocked_list.AddStream(id2);
-  EXPECT_EQ(2u, write_blocked_list.NumBlockedStreams());
+  write_blocked_list_.AddStream(id1);
+  write_blocked_list_.AddStream(id2);
+  EXPECT_EQ(2u, write_blocked_list_.NumBlockedStreams());
 
   // The first stream we push back should stay at the front until 16k is
   // written.
-  EXPECT_EQ(id1, write_blocked_list.PopFront());
-  write_blocked_list.UpdateBytesForStream(id1, 15999);
-  write_blocked_list.AddStream(id1);
-  EXPECT_EQ(2u, write_blocked_list.NumBlockedStreams());
-  EXPECT_EQ(id1, write_blocked_list.PopFront());
+  EXPECT_EQ(id1, write_blocked_list_.PopFront());
+  write_blocked_list_.UpdateBytesForStream(id1, 15999);
+  write_blocked_list_.AddStream(id1);
+  EXPECT_EQ(2u, write_blocked_list_.NumBlockedStreams());
+  EXPECT_EQ(id1, write_blocked_list_.PopFront());
 
   // Once 16k is written the first stream will yield to the next.
-  write_blocked_list.UpdateBytesForStream(id1, 1);
-  write_blocked_list.AddStream(id1);
-  EXPECT_EQ(2u, write_blocked_list.NumBlockedStreams());
-  EXPECT_EQ(id2, write_blocked_list.PopFront());
+  write_blocked_list_.UpdateBytesForStream(id1, 1);
+  write_blocked_list_.AddStream(id1);
+  EXPECT_EQ(2u, write_blocked_list_.NumBlockedStreams());
+  EXPECT_EQ(id2, write_blocked_list_.PopFront());
 
   // Set the new stream to have written all but one byte.
-  write_blocked_list.UpdateBytesForStream(id2, 15999);
-  write_blocked_list.AddStream(id2);
-  EXPECT_EQ(2u, write_blocked_list.NumBlockedStreams());
+  write_blocked_list_.UpdateBytesForStream(id2, 15999);
+  write_blocked_list_.AddStream(id2);
+  EXPECT_EQ(2u, write_blocked_list_.NumBlockedStreams());
 
   // Ensure higher priority streams are popped first.
-  write_blocked_list.AddStream(id3);
-  EXPECT_EQ(id3, write_blocked_list.PopFront());
+  write_blocked_list_.AddStream(id3);
+  EXPECT_EQ(id3, write_blocked_list_.PopFront());
 
   // Higher priority streams will always be popped first, even if using their
   // byte quota
-  write_blocked_list.UpdateBytesForStream(id3, 20000);
-  write_blocked_list.AddStream(id3);
-  EXPECT_EQ(id3, write_blocked_list.PopFront());
+  write_blocked_list_.UpdateBytesForStream(id3, 20000);
+  write_blocked_list_.AddStream(id3);
+  EXPECT_EQ(id3, write_blocked_list_.PopFront());
 
   // Once the higher priority stream is out of the way, id2 will resume its 16k
   // write, with only 1 byte remaining of its guaranteed write allocation.
-  EXPECT_EQ(id2, write_blocked_list.PopFront());
-  write_blocked_list.UpdateBytesForStream(id2, 1);
-  write_blocked_list.AddStream(id2);
-  EXPECT_EQ(2u, write_blocked_list.NumBlockedStreams());
-  EXPECT_EQ(id1, write_blocked_list.PopFront());
+  EXPECT_EQ(id2, write_blocked_list_.PopFront());
+  write_blocked_list_.UpdateBytesForStream(id2, 1);
+  write_blocked_list_.AddStream(id2);
+  EXPECT_EQ(2u, write_blocked_list_.NumBlockedStreams());
+  EXPECT_EQ(id1, write_blocked_list_.PopFront());
 }
 
 TEST_F(QuicWriteBlockedListTest, Ceding) {
-  QuicWriteBlockedList write_blocked_list;
-
-  write_blocked_list.RegisterStream(15, false, kV3HighestPriority);
-  write_blocked_list.RegisterStream(16, false, kV3HighestPriority);
-  write_blocked_list.RegisterStream(5, false, 5);
-  write_blocked_list.RegisterStream(4, false, 5);
-  write_blocked_list.RegisterStream(7, false, 7);
-  write_blocked_list.RegisterStream(1, true, kV3HighestPriority);
-  write_blocked_list.RegisterStream(3, true, kV3HighestPriority);
+  write_blocked_list_.RegisterStream(15, false, kV3HighestPriority);
+  write_blocked_list_.RegisterStream(16, false, kV3HighestPriority);
+  write_blocked_list_.RegisterStream(5, false, 5);
+  write_blocked_list_.RegisterStream(4, false, 5);
+  write_blocked_list_.RegisterStream(7, false, 7);
+  write_blocked_list_.RegisterStream(1, true, kV3HighestPriority);
+  write_blocked_list_.RegisterStream(3, true, kV3HighestPriority);
 
   // When nothing is on the list, nothing yields.
-  EXPECT_FALSE(write_blocked_list.ShouldYield(5));
+  EXPECT_FALSE(write_blocked_list_.ShouldYield(5));
 
-  write_blocked_list.AddStream(5);
+  write_blocked_list_.AddStream(5);
   // 5 should not yield to itself.
-  EXPECT_FALSE(write_blocked_list.ShouldYield(5));
+  EXPECT_FALSE(write_blocked_list_.ShouldYield(5));
   // 4 and 7 are equal or lower priority and should yield to 5.
-  EXPECT_TRUE(write_blocked_list.ShouldYield(4));
-  EXPECT_TRUE(write_blocked_list.ShouldYield(7));
+  EXPECT_TRUE(write_blocked_list_.ShouldYield(4));
+  EXPECT_TRUE(write_blocked_list_.ShouldYield(7));
   // 15, headers and crypto should preempt 5.
-  EXPECT_FALSE(write_blocked_list.ShouldYield(15));
-  EXPECT_FALSE(write_blocked_list.ShouldYield(3));
-  EXPECT_FALSE(write_blocked_list.ShouldYield(1));
+  EXPECT_FALSE(write_blocked_list_.ShouldYield(15));
+  EXPECT_FALSE(write_blocked_list_.ShouldYield(3));
+  EXPECT_FALSE(write_blocked_list_.ShouldYield(1));
 
   // Block a high priority stream.
-  write_blocked_list.AddStream(15);
+  write_blocked_list_.AddStream(15);
   // 16 should yield (same priority) but headers and crypto will still not.
-  EXPECT_TRUE(write_blocked_list.ShouldYield(16));
-  EXPECT_FALSE(write_blocked_list.ShouldYield(3));
-  EXPECT_FALSE(write_blocked_list.ShouldYield(1));
+  EXPECT_TRUE(write_blocked_list_.ShouldYield(16));
+  EXPECT_FALSE(write_blocked_list_.ShouldYield(3));
+  EXPECT_FALSE(write_blocked_list_.ShouldYield(1));
 
   // Block the headers stream.  All streams but crypto and headers should yield.
-  write_blocked_list.AddStream(3);
-  EXPECT_TRUE(write_blocked_list.ShouldYield(16));
-  EXPECT_TRUE(write_blocked_list.ShouldYield(15));
-  EXPECT_FALSE(write_blocked_list.ShouldYield(3));
-  EXPECT_FALSE(write_blocked_list.ShouldYield(1));
+  write_blocked_list_.AddStream(3);
+  EXPECT_TRUE(write_blocked_list_.ShouldYield(16));
+  EXPECT_TRUE(write_blocked_list_.ShouldYield(15));
+  EXPECT_FALSE(write_blocked_list_.ShouldYield(3));
+  EXPECT_FALSE(write_blocked_list_.ShouldYield(1));
 
   // Block the crypto stream.  All streams but crypto should yield.
-  write_blocked_list.AddStream(1);
-  EXPECT_TRUE(write_blocked_list.ShouldYield(16));
-  EXPECT_TRUE(write_blocked_list.ShouldYield(15));
-  EXPECT_TRUE(write_blocked_list.ShouldYield(3));
-  EXPECT_FALSE(write_blocked_list.ShouldYield(1));
+  write_blocked_list_.AddStream(1);
+  EXPECT_TRUE(write_blocked_list_.ShouldYield(16));
+  EXPECT_TRUE(write_blocked_list_.ShouldYield(15));
+  EXPECT_TRUE(write_blocked_list_.ShouldYield(3));
+  EXPECT_FALSE(write_blocked_list_.ShouldYield(1));
 }
 
 }  // namespace
diff --git a/quic/core/uber_quic_stream_id_manager_test.cc b/quic/core/uber_quic_stream_id_manager_test.cc
index b9420bf..8b1bace 100644
--- a/quic/core/uber_quic_stream_id_manager_test.cc
+++ b/quic/core/uber_quic_stream_id_manager_test.cc
@@ -282,7 +282,7 @@
 
   std::string error_details =
       GetParam() == Perspective::IS_SERVER
-          ? "Stream id 404 would exceed stream count limit 100"
+          ? "Stream id 400 would exceed stream count limit 100"
           : "Stream id 401 would exceed stream count limit 100";
 
   EXPECT_CALL(*connection_,
diff --git a/quic/test_tools/quic_session_peer.cc b/quic/test_tools/quic_session_peer.cc
index ed7043d..9eee494 100644
--- a/quic/test_tools/quic_session_peer.cc
+++ b/quic/test_tools/quic_session_peer.cc
@@ -181,19 +181,16 @@
 
 // static
 bool QuicSessionPeer::IsStreamClosed(QuicSession* session, QuicStreamId id) {
-  DCHECK_NE(0u, id);
   return session->IsClosedStream(id);
 }
 
 // static
 bool QuicSessionPeer::IsStreamCreated(QuicSession* session, QuicStreamId id) {
-  DCHECK_NE(0u, id);
   return QuicContainsKey(session->dynamic_streams(), id);
 }
 
 // static
 bool QuicSessionPeer::IsStreamAvailable(QuicSession* session, QuicStreamId id) {
-  DCHECK_NE(0u, id);
   if (session->connection()->transport_version() == QUIC_VERSION_99) {
     if (id % QuicUtils::StreamIdDelta(QUIC_VERSION_99) < 2) {
       return QuicContainsKey(