diff --git a/spdy/core/fifo_write_scheduler.h b/spdy/core/fifo_write_scheduler.h
deleted file mode 100644
index fd2c85e..0000000
--- a/spdy/core/fifo_write_scheduler.h
+++ /dev/null
@@ -1,242 +0,0 @@
-// 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.
-
-#ifndef QUICHE_SPDY_CORE_FIFO_WRITE_SCHEDULER_H_
-#define QUICHE_SPDY_CORE_FIFO_WRITE_SCHEDULER_H_
-
-#include <map>
-#include <set>
-#include <string>
-
-#include "absl/strings/str_cat.h"
-#include "spdy/core/write_scheduler.h"
-#include "spdy/platform/api/spdy_string_utils.h"
-
-namespace spdy {
-
-// A write scheduler where the stream with the smallest stream ID will have the
-// highest priority.
-template <typename StreamIdType>
-class FifoWriteScheduler : public WriteScheduler<StreamIdType> {
- public:
-  using typename WriteScheduler<StreamIdType>::StreamPrecedenceType;
-
-  FifoWriteScheduler() = default;
-
-  // WriteScheduler methods
-  void RegisterStream(StreamIdType stream_id,
-                      const StreamPrecedenceType& precedence) override;
-  void UnregisterStream(StreamIdType stream_id) override;
-  bool StreamRegistered(StreamIdType stream_id) const override;
-  // Stream precedence is available but note that it is not used for scheduling
-  // in this scheduler.
-  StreamPrecedenceType GetStreamPrecedence(
-      StreamIdType stream_id) const override;
-  void UpdateStreamPrecedence(StreamIdType stream_id,
-                              const StreamPrecedenceType& precedence) override;
-  std::vector<StreamIdType> GetStreamChildren(
-      StreamIdType stream_id) const override;
-  void RecordStreamEventTime(StreamIdType stream_id,
-                             int64_t now_in_usec) override;
-  int64_t GetLatestEventWithPrecedence(StreamIdType stream_id) const override;
-  bool ShouldYield(StreamIdType stream_id) const override;
-  void MarkStreamReady(StreamIdType stream_id, bool add_to_front) override;
-  void MarkStreamNotReady(StreamIdType stream_id) override;
-  bool HasReadyStreams() const override;
-  StreamIdType PopNextReadyStream() override;
-  std::tuple<StreamIdType, StreamPrecedenceType>
-  PopNextReadyStreamAndPrecedence() override;
-  size_t NumReadyStreams() const override;
-  bool IsStreamReady(StreamIdType stream_id) const override;
-  size_t NumRegisteredStreams() const override;
-  std::string DebugString() const override;
-
- private:
-  struct StreamInfo {
-    SpdyPriority priority;
-    int64_t event_time;  // read/write event time (us since Unix epoch).
-  };
-
-  std::set<StreamIdType> ready_streams_;
-  std::map<StreamIdType, StreamInfo> registered_streams_;
-};
-
-template <typename StreamIdType>
-void FifoWriteScheduler<StreamIdType>::RegisterStream(
-    StreamIdType stream_id,
-    const StreamPrecedenceType& precedence) {
-  if (StreamRegistered(stream_id)) {
-    SPDY_BUG(spdy_bug_36_1) << "Stream " << stream_id << " already registered";
-    return;
-  }
-  registered_streams_.emplace_hint(
-      registered_streams_.end(), stream_id,
-      StreamInfo{/*priority=*/precedence.spdy3_priority(), /*event_time=*/0});
-}
-
-template <typename StreamIdType>
-void FifoWriteScheduler<StreamIdType>::UnregisterStream(
-    StreamIdType stream_id) {
-  if (!StreamRegistered(stream_id)) {
-    SPDY_BUG(spdy_bug_36_2) << "Stream " << stream_id << " is not registered";
-    return;
-  }
-  registered_streams_.erase(stream_id);
-  ready_streams_.erase(stream_id);
-}
-
-template <typename StreamIdType>
-bool FifoWriteScheduler<StreamIdType>::StreamRegistered(
-    StreamIdType stream_id) const {
-  return registered_streams_.find(stream_id) != registered_streams_.end();
-}
-
-// Stream precedence is not supported by this scheduler.
-template <typename StreamIdType>
-typename FifoWriteScheduler<StreamIdType>::StreamPrecedenceType
-FifoWriteScheduler<StreamIdType>::GetStreamPrecedence(
-    StreamIdType stream_id) const {
-  auto it = registered_streams_.find(stream_id);
-  if (it == registered_streams_.end()) {
-    SPDY_DVLOG(1) << "Stream " << stream_id << " not registered";
-    return StreamPrecedenceType(kV3LowestPriority);
-  }
-  return StreamPrecedenceType(it->second.priority);
-}
-
-template <typename StreamIdType>
-void FifoWriteScheduler<StreamIdType>::UpdateStreamPrecedence(
-    StreamIdType stream_id,
-    const StreamPrecedenceType& precedence) {
-  auto it = registered_streams_.find(stream_id);
-  if (it == registered_streams_.end()) {
-    SPDY_DVLOG(1) << "Stream " << stream_id << " not registered";
-    return;
-  }
-  it->second.priority = precedence.spdy3_priority();
-}
-
-template <typename StreamIdType>
-std::vector<StreamIdType> FifoWriteScheduler<StreamIdType>::GetStreamChildren(
-    StreamIdType /*stream_id*/) const {
-  return std::vector<StreamIdType>();
-}
-
-template <typename StreamIdType>
-void FifoWriteScheduler<StreamIdType>::RecordStreamEventTime(
-    StreamIdType stream_id,
-    int64_t now_in_usec) {
-  auto it = registered_streams_.find(stream_id);
-  if (it != registered_streams_.end()) {
-    it->second.event_time = now_in_usec;
-  } else {
-    SPDY_BUG(spdy_bug_36_3) << "Stream " << stream_id << " is not registered";
-  }
-}
-
-template <typename StreamIdType>
-int64_t FifoWriteScheduler<StreamIdType>::GetLatestEventWithPrecedence(
-    StreamIdType stream_id) const {
-  if (!StreamRegistered(stream_id)) {
-    SPDY_BUG(spdy_bug_36_4) << "Stream " << stream_id << " is not registered";
-    return 0;
-  }
-  int64_t latest_event_time_us = 0;
-  for (auto it = registered_streams_.begin(); it != registered_streams_.end();
-       ++it) {
-    if (stream_id <= it->first) {
-      break;
-    }
-    latest_event_time_us =
-        std::max(latest_event_time_us, it->second.event_time);
-  }
-  return latest_event_time_us;
-}
-
-template <typename StreamIdType>
-bool FifoWriteScheduler<StreamIdType>::ShouldYield(
-    StreamIdType stream_id) const {
-  return !ready_streams_.empty() && stream_id > *ready_streams_.begin();
-}
-
-template <typename StreamIdType>
-void FifoWriteScheduler<StreamIdType>::MarkStreamReady(StreamIdType stream_id,
-                                                       bool /*add_to_front*/) {
-  if (!StreamRegistered(stream_id)) {
-    SPDY_BUG(spdy_bug_36_5) << "Stream " << stream_id << " is not registered";
-    return;
-  }
-  if (ready_streams_.find(stream_id) != ready_streams_.end()) {
-    SPDY_DVLOG(1) << "Stream already exists in the list";
-    return;
-  }
-  ready_streams_.insert(stream_id);
-}
-
-template <typename StreamIdType>
-void FifoWriteScheduler<StreamIdType>::MarkStreamNotReady(
-    StreamIdType stream_id) {
-  auto it = ready_streams_.find(stream_id);
-  if (it == ready_streams_.end()) {
-    SPDY_DVLOG(1) << "Try to remove a stream that is not on list";
-    return;
-  }
-  ready_streams_.erase(it);
-}
-
-template <typename StreamIdType>
-bool FifoWriteScheduler<StreamIdType>::HasReadyStreams() const {
-  return !ready_streams_.empty();
-}
-
-template <typename StreamIdType>
-StreamIdType FifoWriteScheduler<StreamIdType>::PopNextReadyStream() {
-  if (ready_streams_.empty()) {
-    SPDY_BUG(spdy_bug_36_6) << "No ready streams available";
-    return 0;
-  }
-  auto it = ready_streams_.begin();
-  StreamIdType id = *it;
-  ready_streams_.erase(it);
-  return id;
-}
-
-template <typename StreamIdType>
-std::tuple<StreamIdType,
-           typename FifoWriteScheduler<StreamIdType>::StreamPrecedenceType>
-FifoWriteScheduler<StreamIdType>::PopNextReadyStreamAndPrecedence() {
-  return std::make_tuple(PopNextReadyStream(),
-                         StreamPrecedenceType(kV3LowestPriority));
-}
-
-template <typename StreamIdType>
-size_t FifoWriteScheduler<StreamIdType>::NumReadyStreams() const {
-  return ready_streams_.size();
-}
-
-template <typename StreamIdType>
-bool FifoWriteScheduler<StreamIdType>::IsStreamReady(
-    StreamIdType stream_id) const {
-  if (!StreamRegistered(stream_id)) {
-    SPDY_BUG(spdy_bug_36_7) << "Stream " << stream_id << " is not registered";
-    return false;
-  }
-  return ready_streams_.find(stream_id) != ready_streams_.end();
-}
-
-template <typename StreamIdType>
-size_t FifoWriteScheduler<StreamIdType>::NumRegisteredStreams() const {
-  return registered_streams_.size();
-}
-
-template <typename StreamIdType>
-std::string FifoWriteScheduler<StreamIdType>::DebugString() const {
-  return absl::StrCat(
-      "FifoWriteScheduler {num_streams=", registered_streams_.size(),
-      " num_ready_streams=", NumReadyStreams(), "}");
-}
-
-}  // namespace spdy
-
-#endif  // QUICHE_SPDY_CORE_FIFO_WRITE_SCHEDULER_H_
diff --git a/spdy/core/fifo_write_scheduler_test.cc b/spdy/core/fifo_write_scheduler_test.cc
deleted file mode 100644
index c2b1d7e..0000000
--- a/spdy/core/fifo_write_scheduler_test.cc
+++ /dev/null
@@ -1,103 +0,0 @@
-// 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 "spdy/core/fifo_write_scheduler.h"
-
-#include "common/platform/api/quiche_test.h"
-#include "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(0u, 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(3u, fifo.PopNextReadyStream());
-  EXPECT_EQ(7u, 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));
-}
-
-TEST(FifoWriteSchedulerTest, GetStreamPrecedence) {
-  FifoWriteScheduler<SpdyStreamId> fifo;
-  // Return lowest priority for unknown stream.
-  EXPECT_EQ(kV3LowestPriority, fifo.GetStreamPrecedence(1).spdy3_priority());
-
-  fifo.RegisterStream(1, SpdyStreamPrecedence(3));
-  EXPECT_TRUE(fifo.GetStreamPrecedence(1).is_spdy3_priority());
-  EXPECT_EQ(3, fifo.GetStreamPrecedence(1).spdy3_priority());
-
-  // Redundant registration shouldn't change stream priority.
-  EXPECT_SPDY_BUG(fifo.RegisterStream(1, SpdyStreamPrecedence(4)),
-                  "Stream 1 already registered");
-  EXPECT_EQ(3, fifo.GetStreamPrecedence(1).spdy3_priority());
-
-  fifo.UpdateStreamPrecedence(1, SpdyStreamPrecedence(5));
-  EXPECT_EQ(5, fifo.GetStreamPrecedence(1).spdy3_priority());
-}
-
-}  // namespace test
-
-}  // namespace spdy
diff --git a/spdy/core/lifo_write_scheduler.h b/spdy/core/lifo_write_scheduler.h
deleted file mode 100644
index 6903bbf..0000000
--- a/spdy/core/lifo_write_scheduler.h
+++ /dev/null
@@ -1,237 +0,0 @@
-// 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.
-
-#ifndef QUICHE_SPDY_CORE_LIFO_WRITE_SCHEDULER_H_
-#define QUICHE_SPDY_CORE_LIFO_WRITE_SCHEDULER_H_
-
-#include <cstdint>
-#include <map>
-#include <set>
-#include <string>
-
-#include "absl/strings/str_cat.h"
-#include "spdy/core/write_scheduler.h"
-
-namespace spdy {
-
-namespace test {
-
-template <typename StreamIdType>
-class LifoWriteSchedulerPeer;
-
-}  // namespace test
-
-// Create a write scheduler where the stream added last will have the highest
-// priority.
-template <typename StreamIdType>
-class LifoWriteScheduler : public WriteScheduler<StreamIdType> {
- public:
-  using typename WriteScheduler<StreamIdType>::StreamPrecedenceType;
-
-  LifoWriteScheduler() = default;
-
-  void RegisterStream(StreamIdType stream_id,
-                      const StreamPrecedenceType& /*precedence*/) override;
-
-  void UnregisterStream(StreamIdType stream_id) override;
-
-  bool StreamRegistered(StreamIdType stream_id) const override {
-    return registered_streams_.find(stream_id) != registered_streams_.end();
-  }
-
-  // Stream precedence is available but note that it is not used for scheduling
-  // in this scheduler.
-  StreamPrecedenceType GetStreamPrecedence(
-      StreamIdType stream_id) const override;
-
-  void UpdateStreamPrecedence(StreamIdType stream_id,
-                              const StreamPrecedenceType& precedence) override;
-
-  std::vector<StreamIdType> GetStreamChildren(
-      StreamIdType /*stream_id*/) const override {
-    return std::vector<StreamIdType>();
-  }
-
-  void RecordStreamEventTime(StreamIdType stream_id,
-                             int64_t now_in_usec) override;
-
-  int64_t GetLatestEventWithPrecedence(StreamIdType stream_id) const override;
-
-  StreamIdType PopNextReadyStream() override;
-
-  std::tuple<StreamIdType, StreamPrecedenceType>
-  PopNextReadyStreamAndPrecedence() override {
-    return std::make_tuple(PopNextReadyStream(),
-                           StreamPrecedenceType(kV3LowestPriority));
-  }
-
-  bool ShouldYield(StreamIdType stream_id) const override {
-    return !ready_streams_.empty() && stream_id < *ready_streams_.rbegin();
-  }
-
-  void MarkStreamReady(StreamIdType stream_id, bool /*add_to_front*/) override;
-
-  void MarkStreamNotReady(StreamIdType stream_id) override;
-
-  bool HasReadyStreams() const override { return !ready_streams_.empty(); }
-  size_t NumReadyStreams() const override { return ready_streams_.size(); }
-  bool IsStreamReady(StreamIdType stream_id) const override;
-  size_t NumRegisteredStreams() const override;
-  std::string DebugString() const override;
-
- private:
-  friend class test::LifoWriteSchedulerPeer<StreamIdType>;
-
-  struct StreamInfo {
-    SpdyPriority priority;
-    int64_t event_time;  // read/write event time (us since Unix epoch).
-  };
-
-  std::set<StreamIdType> ready_streams_;
-  std::map<StreamIdType, StreamInfo> registered_streams_;
-};
-
-template <typename StreamIdType>
-void LifoWriteScheduler<StreamIdType>::RegisterStream(
-    StreamIdType stream_id,
-    const StreamPrecedenceType& precedence) {
-  if (StreamRegistered(stream_id)) {
-    SPDY_BUG(spdy_bug_13_1) << "Stream " << stream_id << " already registered";
-    return;
-  }
-  registered_streams_.emplace_hint(
-      registered_streams_.end(), stream_id,
-      StreamInfo{/*priority=*/precedence.spdy3_priority(), /*event_time=*/0});
-}
-
-template <typename StreamIdType>
-void LifoWriteScheduler<StreamIdType>::UnregisterStream(
-    StreamIdType stream_id) {
-  if (!StreamRegistered(stream_id)) {
-    SPDY_BUG(spdy_bug_13_2) << "Stream " << stream_id << " is not registered";
-    return;
-  }
-  registered_streams_.erase(stream_id);
-  ready_streams_.erase(stream_id);
-}
-
-template <typename StreamIdType>
-typename LifoWriteScheduler<StreamIdType>::StreamPrecedenceType
-LifoWriteScheduler<StreamIdType>::GetStreamPrecedence(
-    StreamIdType stream_id) const {
-  auto it = registered_streams_.find(stream_id);
-  if (it == registered_streams_.end()) {
-    SPDY_DVLOG(1) << "Stream " << stream_id << " not registered";
-    return StreamPrecedenceType(kV3LowestPriority);
-  }
-  return StreamPrecedenceType(it->second.priority);
-}
-
-template <typename StreamIdType>
-void LifoWriteScheduler<StreamIdType>::UpdateStreamPrecedence(
-    StreamIdType stream_id,
-    const StreamPrecedenceType& precedence) {
-  auto it = registered_streams_.find(stream_id);
-  if (it == registered_streams_.end()) {
-    SPDY_DVLOG(1) << "Stream " << stream_id << " not registered";
-    return;
-  }
-  it->second.priority = precedence.spdy3_priority();
-}
-
-template <typename StreamIdType>
-void LifoWriteScheduler<StreamIdType>::RecordStreamEventTime(
-    StreamIdType stream_id,
-    int64_t now_in_usec) {
-  auto it = registered_streams_.find(stream_id);
-  if (it != registered_streams_.end()) {
-    it->second.event_time = now_in_usec;
-  } else {
-    SPDY_BUG(spdy_bug_13_3) << "Stream " << stream_id << " is not registered";
-  }
-}
-
-template <typename StreamIdType>
-int64_t LifoWriteScheduler<StreamIdType>::GetLatestEventWithPrecedence(
-    StreamIdType stream_id) const {
-  if (!StreamRegistered(stream_id)) {
-    SPDY_BUG(spdy_bug_13_4) << "Stream " << stream_id << " is not registered";
-    return 0;
-  }
-  int64_t latest_event_time_us = 0;
-  for (auto it = registered_streams_.rbegin(); it != registered_streams_.rend();
-       ++it) {
-    if (stream_id < it->first) {
-      if (it->second.event_time > latest_event_time_us) {
-        latest_event_time_us = it->second.event_time;
-      }
-    } else {
-      break;
-    }
-  }
-  return latest_event_time_us;
-}
-
-template <typename StreamIdType>
-StreamIdType LifoWriteScheduler<StreamIdType>::PopNextReadyStream() {
-  if (ready_streams_.empty()) {
-    SPDY_BUG(spdy_bug_13_5) << "No ready streams available";
-    return 0;
-  }
-  auto it = --ready_streams_.end();
-  StreamIdType id = *it;
-  ready_streams_.erase(it);
-  return id;
-}
-
-template <typename StreamIdType>
-void LifoWriteScheduler<StreamIdType>::MarkStreamReady(StreamIdType stream_id,
-                                                       bool /*add_to_front*/) {
-  if (!StreamRegistered(stream_id)) {
-    SPDY_BUG(spdy_bug_13_6) << "Stream " << stream_id << " is not registered";
-    return;
-  }
-  if (ready_streams_.find(stream_id) != ready_streams_.end()) {
-    SPDY_VLOG(1) << "Stream already exists in the list";
-    return;
-  }
-  ready_streams_.insert(stream_id);
-}
-
-template <typename StreamIdType>
-void LifoWriteScheduler<StreamIdType>::MarkStreamNotReady(
-    StreamIdType stream_id) {
-  auto it = ready_streams_.find(stream_id);
-  if (it == ready_streams_.end()) {
-    SPDY_VLOG(1) << "Try to remove a stream that is not on list";
-    return;
-  }
-  ready_streams_.erase(it);
-}
-
-template <typename StreamIdType>
-bool LifoWriteScheduler<StreamIdType>::IsStreamReady(
-    StreamIdType stream_id) const {
-  if (!StreamRegistered(stream_id)) {
-    SPDY_BUG(spdy_bug_13_7) << "Stream " << stream_id << " is not registered";
-    return false;
-  }
-  return ready_streams_.find(stream_id) != ready_streams_.end();
-}
-
-template <typename StreamIdType>
-size_t LifoWriteScheduler<StreamIdType>::NumRegisteredStreams() const {
-  return registered_streams_.size();
-}
-
-template <typename StreamIdType>
-std::string LifoWriteScheduler<StreamIdType>::DebugString() const {
-  return absl::StrCat(
-      "LifoWriteScheduler {num_streams=", registered_streams_.size(),
-      " num_ready_streams=", NumReadyStreams(), "}");
-}
-
-}  // namespace spdy
-
-#endif  // QUICHE_SPDY_CORE_LIFO_WRITE_SCHEDULER_H_
diff --git a/spdy/core/lifo_write_scheduler_test.cc b/spdy/core/lifo_write_scheduler_test.cc
deleted file mode 100644
index c7305e7..0000000
--- a/spdy/core/lifo_write_scheduler_test.cc
+++ /dev/null
@@ -1,174 +0,0 @@
-// 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 "spdy/core/lifo_write_scheduler.h"
-
-#include "common/platform/api/quiche_test.h"
-#include "spdy/core/spdy_protocol.h"
-#include "spdy/core/spdy_test_utils.h"
-#include "spdy/platform/api/spdy_test_helpers.h"
-
-namespace spdy {
-
-namespace test {
-
-template <typename StreamIdType>
-class LifoWriteSchedulerPeer {
- public:
-  explicit LifoWriteSchedulerPeer(LifoWriteScheduler<StreamIdType>* scheduler)
-      : scheduler_(scheduler) {}
-
-  size_t NumRegisteredListStreams() const {
-    return scheduler_->registered_streams_.size();
-  }
-
-  std::set<StreamIdType>* GetReadyList() const {
-    return &scheduler_->ready_streams_;
-  }
-
- private:
-  LifoWriteScheduler<StreamIdType>* scheduler_;
-};
-
-// Test add and remove from ready list.
-TEST(LifoWriteSchedulerTest, ReadyListTest) {
-  LifoWriteScheduler<SpdyStreamId> lifo;
-  LifoWriteSchedulerPeer<SpdyStreamId> peer(&lifo);
-
-  EXPECT_SPDY_BUG(
-      EXPECT_EQ(0u, std::get<0>(lifo.PopNextReadyStreamAndPrecedence())),
-      "No ready streams available");
-  EXPECT_SPDY_BUG(EXPECT_EQ(0u, lifo.PopNextReadyStream()),
-                  "No ready streams available");
-  EXPECT_FALSE(lifo.HasReadyStreams());
-  EXPECT_SPDY_BUG(lifo.MarkStreamReady(9, true), "Stream 9 is not registered");
-  EXPECT_SPDY_BUG(lifo.IsStreamReady(9), "Stream 9 is not registered");
-  SpdyStreamPrecedence precedence(1);
-  lifo.RegisterStream(3, precedence);
-  EXPECT_FALSE(lifo.IsStreamReady(3));
-  lifo.RegisterStream(7, precedence);
-  lifo.RegisterStream(9, precedence);
-  lifo.RegisterStream(11, precedence);
-  lifo.RegisterStream(13, precedence);
-  lifo.RegisterStream(15, precedence);
-  lifo.RegisterStream(17, precedence);
-  lifo.MarkStreamReady(9, true);
-  lifo.MarkStreamReady(15, true);
-  lifo.MarkStreamReady(7, true);
-  lifo.MarkStreamReady(13, true);
-  lifo.MarkStreamReady(11, true);
-  lifo.MarkStreamReady(3, true);
-  EXPECT_TRUE(lifo.IsStreamReady(3));
-  lifo.MarkStreamReady(17, true);
-  EXPECT_TRUE(lifo.HasReadyStreams());
-  EXPECT_EQ(7u, lifo.NumReadyStreams());
-
-  // Verify MarkStream(Not)Ready() can be called multiple times for the same
-  // stream.
-  lifo.MarkStreamReady(11, true);
-  lifo.MarkStreamNotReady(5);
-  lifo.MarkStreamNotReady(21);
-
-  EXPECT_EQ(17u, lifo.PopNextReadyStream());
-  EXPECT_EQ(15u, std::get<0>(lifo.PopNextReadyStreamAndPrecedence()));
-  EXPECT_TRUE(lifo.ShouldYield(9));
-  EXPECT_FALSE(lifo.ShouldYield(13));
-  EXPECT_FALSE(lifo.ShouldYield(15));
-
-  lifo.MarkStreamNotReady(3);
-  EXPECT_TRUE(peer.GetReadyList()->find(3) == peer.GetReadyList()->end());
-  lifo.MarkStreamNotReady(13);
-  EXPECT_TRUE(peer.GetReadyList()->find(13) == peer.GetReadyList()->end());
-  lifo.MarkStreamNotReady(7);
-  EXPECT_TRUE(peer.GetReadyList()->find(7) == peer.GetReadyList()->end());
-  EXPECT_EQ(2u, lifo.NumReadyStreams());
-
-  lifo.MarkStreamNotReady(9);
-  lifo.MarkStreamNotReady(11);
-  EXPECT_FALSE(lifo.ShouldYield(1));
-}
-
-// Test add and remove from registered list.
-TEST(LifoWriteSchedulerTest, RegisterListTest) {
-  LifoWriteScheduler<SpdyStreamId> lifo;
-  LifoWriteSchedulerPeer<SpdyStreamId> peer(&lifo);
-  SpdyStreamPrecedence precedence(1);
-  EXPECT_EQ(0u, lifo.NumRegisteredStreams());
-  lifo.RegisterStream(3, precedence);
-  lifo.RegisterStream(5, precedence);
-  lifo.RegisterStream(7, precedence);
-  lifo.RegisterStream(9, precedence);
-  lifo.RegisterStream(11, precedence);
-  EXPECT_EQ(5u, lifo.NumRegisteredStreams());
-
-  EXPECT_TRUE(lifo.StreamRegistered(3));
-  EXPECT_TRUE(lifo.StreamRegistered(5));
-  EXPECT_TRUE(lifo.StreamRegistered(7));
-  EXPECT_TRUE(lifo.StreamRegistered(9));
-  EXPECT_TRUE(lifo.StreamRegistered(11));
-  EXPECT_SPDY_BUG(lifo.RegisterStream(11, precedence),
-                  "Stream 11 already registered");
-  EXPECT_EQ(5u, peer.NumRegisteredListStreams());
-
-  lifo.UnregisterStream(3);
-  EXPECT_EQ(4u, lifo.NumRegisteredStreams());
-  EXPECT_FALSE(lifo.StreamRegistered(3));
-  EXPECT_SPDY_BUG(lifo.UnregisterStream(3), "Stream 3 is not registered");
-  EXPECT_SPDY_BUG(lifo.UnregisterStream(13), "Stream 13 is not registered");
-  lifo.UnregisterStream(11);
-  EXPECT_FALSE(lifo.StreamRegistered(11));
-  lifo.UnregisterStream(7);
-  EXPECT_EQ(2u, lifo.NumRegisteredStreams());
-  EXPECT_FALSE(lifo.StreamRegistered(7));
-  EXPECT_TRUE(lifo.StreamRegistered(5));
-  EXPECT_TRUE(lifo.StreamRegistered(9));
-}
-
-// Test mark latest event time.
-TEST(LifoWriteSchedulerTest, GetLatestEventTest) {
-  LifoWriteScheduler<SpdyStreamId> lifo;
-  LifoWriteSchedulerPeer<SpdyStreamId> peer(&lifo);
-  SpdyStreamPrecedence precedence(1);
-  lifo.RegisterStream(1, precedence);
-  lifo.RegisterStream(3, precedence);
-  lifo.RegisterStream(5, precedence);
-  lifo.RegisterStream(7, precedence);
-  lifo.RegisterStream(9, precedence);
-  lifo.RecordStreamEventTime(1, 1);
-  lifo.RecordStreamEventTime(3, 8);
-  lifo.RecordStreamEventTime(5, 4);
-  lifo.RecordStreamEventTime(7, 2);
-  lifo.RecordStreamEventTime(9, 3);
-  EXPECT_SPDY_BUG(lifo.RecordStreamEventTime(11, 1),
-                  "Stream 11 is not registered");
-  EXPECT_EQ(0, lifo.GetLatestEventWithPrecedence(9));
-  EXPECT_EQ(3, lifo.GetLatestEventWithPrecedence(7));
-  EXPECT_EQ(3, lifo.GetLatestEventWithPrecedence(5));
-  EXPECT_EQ(4, lifo.GetLatestEventWithPrecedence(3));
-  EXPECT_EQ(8, lifo.GetLatestEventWithPrecedence(1));
-  EXPECT_SPDY_BUG(lifo.GetLatestEventWithPrecedence(11),
-                  "Stream 11 is not registered");
-}
-
-TEST(LifoWriteSchedulerTest, GetStreamPrecedence) {
-  LifoWriteScheduler<SpdyStreamId> lifo;
-  // Return lowest priority for unknown stream.
-  EXPECT_EQ(kV3LowestPriority, lifo.GetStreamPrecedence(1).spdy3_priority());
-
-  lifo.RegisterStream(1, SpdyStreamPrecedence(3));
-  EXPECT_TRUE(lifo.GetStreamPrecedence(1).is_spdy3_priority());
-  EXPECT_EQ(3, lifo.GetStreamPrecedence(1).spdy3_priority());
-
-  // Redundant registration shouldn't change stream priority.
-  EXPECT_SPDY_BUG(lifo.RegisterStream(1, SpdyStreamPrecedence(4)),
-                  "Stream 1 already registered");
-  EXPECT_EQ(3, lifo.GetStreamPrecedence(1).spdy3_priority());
-
-  lifo.UpdateStreamPrecedence(1, SpdyStreamPrecedence(5));
-  EXPECT_EQ(5, lifo.GetStreamPrecedence(1).spdy3_priority());
-}
-
-}  // namespace test
-
-}  // namespace spdy
