gfe-relnote: Add a FifoWriteScheduler where the stream with the smallest stream ID will have the highest priority. Not used in prod, not protected.

PiperOrigin-RevId: 260922889
Change-Id: Id7af765ee6e69821b560b0f4c028ac9e8f2840db
diff --git a/spdy/core/fifo_write_scheduler_test.cc b/spdy/core/fifo_write_scheduler_test.cc
new file mode 100644
index 0000000..1a6e231
--- /dev/null
+++ b/spdy/core/fifo_write_scheduler_test.cc
@@ -0,0 +1,85 @@
+// Copyright (c) 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "net/third_party/quiche/src/spdy/core/fifo_write_scheduler.h"
+
+#include "net/third_party/quiche/src/spdy/platform/api/spdy_test.h"
+#include "net/third_party/quiche/src/spdy/platform/api/spdy_test_helpers.h"
+
+namespace spdy {
+
+namespace test {
+
+TEST(FifoWriteSchedulerTest, BasicTest) {
+  FifoWriteScheduler<SpdyStreamId> fifo;
+  EXPECT_FALSE(fifo.HasReadyStreams());
+  EXPECT_SPDY_BUG(
+      EXPECT_EQ(0, std::get<0>(fifo.PopNextReadyStreamAndPrecedence())),
+      "No ready streams available");
+  EXPECT_SPDY_BUG(fifo.MarkStreamReady(9, true), "Stream 9 is not registered");
+  EXPECT_SPDY_BUG(fifo.IsStreamReady(9), "Stream 9 is not registered");
+
+  SpdyStreamPrecedence precedence(1);
+  fifo.RegisterStream(3, precedence);
+  EXPECT_FALSE(fifo.IsStreamReady(3));
+  fifo.RegisterStream(9, precedence);
+  fifo.RegisterStream(7, precedence);
+  fifo.RegisterStream(11, precedence);
+  fifo.RegisterStream(13, precedence);
+  fifo.RegisterStream(15, precedence);
+  fifo.RegisterStream(17, precedence);
+  EXPECT_EQ(7u, fifo.NumRegisteredStreams());
+  EXPECT_FALSE(fifo.HasReadyStreams());
+
+  fifo.MarkStreamReady(9, true);
+  EXPECT_TRUE(fifo.IsStreamReady(9));
+  EXPECT_TRUE(fifo.HasReadyStreams());
+  fifo.MarkStreamReady(15, true);
+  fifo.MarkStreamReady(7, true);
+  fifo.MarkStreamReady(13, true);
+  fifo.MarkStreamReady(11, true);
+  fifo.MarkStreamReady(3, true);
+  fifo.MarkStreamReady(17, true);
+  EXPECT_EQ(7u, fifo.NumReadyStreams());
+
+  EXPECT_EQ(3, fifo.PopNextReadyStream());
+  EXPECT_EQ(7, std::get<0>(fifo.PopNextReadyStreamAndPrecedence()));
+  EXPECT_EQ(5u, fifo.NumReadyStreams());
+
+  EXPECT_FALSE(fifo.ShouldYield(3));
+  EXPECT_FALSE(fifo.ShouldYield(9));
+  EXPECT_TRUE(fifo.ShouldYield(13));
+  EXPECT_TRUE(fifo.ShouldYield(10));
+
+  fifo.MarkStreamNotReady(9);
+  EXPECT_EQ(4u, fifo.NumReadyStreams());
+  EXPECT_FALSE(fifo.ShouldYield(10));
+  EXPECT_TRUE(fifo.ShouldYield(12));
+}
+
+TEST(FifoWriteSchedulerTest, GetLatestEventTest) {
+  FifoWriteScheduler<SpdyStreamId> fifo;
+
+  SpdyStreamPrecedence precedence(1);
+  fifo.RegisterStream(1, precedence);
+  fifo.RegisterStream(3, precedence);
+  fifo.RegisterStream(5, precedence);
+  fifo.RegisterStream(7, precedence);
+  fifo.RegisterStream(9, precedence);
+  fifo.RecordStreamEventTime(1, 3);
+  fifo.RecordStreamEventTime(3, 2);
+  fifo.RecordStreamEventTime(5, 4);
+  fifo.RecordStreamEventTime(7, 8);
+  fifo.RecordStreamEventTime(9, 1);
+
+  EXPECT_EQ(8, fifo.GetLatestEventWithPrecedence(9));
+  EXPECT_EQ(4, fifo.GetLatestEventWithPrecedence(7));
+  EXPECT_EQ(3, fifo.GetLatestEventWithPrecedence(5));
+  EXPECT_EQ(3, fifo.GetLatestEventWithPrecedence(3));
+  EXPECT_EQ(0, fifo.GetLatestEventWithPrecedence(1));
+}
+
+}  // namespace test
+
+}  // namespace spdy