Deletes FifoWriteScheduler and LifoWriteScheduler, which are unused.
PiperOrigin-RevId: 367215105
Change-Id: I0176d9f04a15efb9d94ad76c5e512531416d3088
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