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