Index: net/quic/quic_write_blocked_list_test.cc |
diff --git a/net/quic/quic_write_blocked_list_test.cc b/net/quic/quic_write_blocked_list_test.cc |
index 0633f63363634703952a79c65c57ff74d56daa33..47fe5191b797d904bcf2fec030dfc7819a9f53a4 100644 |
--- a/net/quic/quic_write_blocked_list_test.cc |
+++ b/net/quic/quic_write_blocked_list_test.cc |
@@ -16,16 +16,16 @@ TEST(QuicWriteBlockedListTest, PriorityOrder) { |
// Mark streams blocked in roughly reverse priority order, and |
// verify that streams are sorted. |
- write_blocked_list.PushBack(40, |
- QuicWriteBlockedList::kLowestPriority); |
- write_blocked_list.PushBack(23, |
- QuicWriteBlockedList::kHighestPriority); |
- write_blocked_list.PushBack(17, |
- QuicWriteBlockedList::kHighestPriority); |
- write_blocked_list.PushBack(kHeadersStreamId, |
- QuicWriteBlockedList::kHighestPriority); |
- write_blocked_list.PushBack(kCryptoStreamId, |
- QuicWriteBlockedList::kHighestPriority); |
+ write_blocked_list.AddStream(40, |
+ QuicWriteBlockedList::kLowestPriority); |
+ write_blocked_list.AddStream(23, |
+ QuicWriteBlockedList::kHighestPriority); |
+ write_blocked_list.AddStream(17, |
+ QuicWriteBlockedList::kHighestPriority); |
+ write_blocked_list.AddStream(kHeadersStreamId, |
+ QuicWriteBlockedList::kHighestPriority); |
+ write_blocked_list.AddStream(kCryptoStreamId, |
+ QuicWriteBlockedList::kHighestPriority); |
EXPECT_EQ(5u, write_blocked_list.NumBlockedStreams()); |
EXPECT_TRUE(write_blocked_list.HasWriteBlockedCryptoOrHeadersStream()); |
@@ -47,8 +47,8 @@ TEST(QuicWriteBlockedListTest, PriorityOrder) { |
TEST(QuicWriteBlockedListTest, CryptoStream) { |
QuicWriteBlockedList write_blocked_list; |
- write_blocked_list.PushBack(kCryptoStreamId, |
- QuicWriteBlockedList::kHighestPriority); |
+ write_blocked_list.AddStream(kCryptoStreamId, |
+ QuicWriteBlockedList::kHighestPriority); |
EXPECT_EQ(1u, write_blocked_list.NumBlockedStreams()); |
EXPECT_TRUE(write_blocked_list.HasWriteBlockedCryptoOrHeadersStream()); |
@@ -59,8 +59,8 @@ TEST(QuicWriteBlockedListTest, CryptoStream) { |
TEST(QuicWriteBlockedListTest, HeadersStream) { |
QuicWriteBlockedList write_blocked_list; |
- write_blocked_list.PushBack(kHeadersStreamId, |
- QuicWriteBlockedList::kHighestPriority); |
+ write_blocked_list.AddStream(kHeadersStreamId, |
+ QuicWriteBlockedList::kHighestPriority); |
EXPECT_EQ(1u, write_blocked_list.NumBlockedStreams()); |
EXPECT_TRUE(write_blocked_list.HasWriteBlockedCryptoOrHeadersStream()); |
@@ -71,10 +71,10 @@ TEST(QuicWriteBlockedListTest, HeadersStream) { |
TEST(QuicWriteBlockedListTest, VerifyHeadersStream) { |
QuicWriteBlockedList write_blocked_list; |
- write_blocked_list.PushBack(5, |
- QuicWriteBlockedList::kHighestPriority); |
- write_blocked_list.PushBack(kHeadersStreamId, |
- QuicWriteBlockedList::kHighestPriority); |
+ write_blocked_list.AddStream(5, |
+ QuicWriteBlockedList::kHighestPriority); |
+ write_blocked_list.AddStream(kHeadersStreamId, |
+ QuicWriteBlockedList::kHighestPriority); |
EXPECT_EQ(2u, write_blocked_list.NumBlockedStreams()); |
EXPECT_TRUE(write_blocked_list.HasWriteBlockedCryptoOrHeadersStream()); |
@@ -95,12 +95,12 @@ TEST(QuicWriteBlockedListTest, NoDuplicateEntries) { |
// Try to add a stream to the write blocked list multiple times at the same |
// priority. |
const QuicStreamId kBlockedId = kClientDataStreamId1; |
- write_blocked_list.PushBack(kBlockedId, |
- QuicWriteBlockedList::kHighestPriority); |
- write_blocked_list.PushBack(kBlockedId, |
- QuicWriteBlockedList::kHighestPriority); |
- write_blocked_list.PushBack(kBlockedId, |
- QuicWriteBlockedList::kHighestPriority); |
+ write_blocked_list.AddStream(kBlockedId, |
+ QuicWriteBlockedList::kHighestPriority); |
+ write_blocked_list.AddStream(kBlockedId, |
+ QuicWriteBlockedList::kHighestPriority); |
+ write_blocked_list.AddStream(kBlockedId, |
+ QuicWriteBlockedList::kHighestPriority); |
// This should only result in one blocked stream being added. |
EXPECT_EQ(1u, write_blocked_list.NumBlockedStreams()); |
@@ -112,6 +112,56 @@ TEST(QuicWriteBlockedListTest, NoDuplicateEntries) { |
EXPECT_FALSE(write_blocked_list.HasWriteBlockedDataStreams()); |
} |
+TEST(QuicWriteBlockedListTest, BatchingWrites) { |
+ FLAGS_quic_batch_writes = true; |
+ QuicWriteBlockedList write_blocked_list; |
+ |
+ const QuicStreamId id1 = kClientDataStreamId1; |
+ const QuicStreamId id2 = kClientDataStreamId2; |
+ |
+ write_blocked_list.AddStream(id1, QuicWriteBlockedList::kLowestPriority); |
+ write_blocked_list.AddStream(id2, QuicWriteBlockedList::kLowestPriority); |
+ 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, QuicWriteBlockedList::kLowestPriority); |
+ EXPECT_EQ(2u, write_blocked_list.NumBlockedStreams()); |
+ EXPECT_EQ(id1, write_blocked_list.PopFront()); |
+ |
+ // Once 16k is written the first stream will cede to the next. |
+ write_blocked_list.UpdateBytesForStream(id1, 1); |
+ write_blocked_list.AddStream(id1, QuicWriteBlockedList::kLowestPriority); |
+ 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, QuicWriteBlockedList::kLowestPriority); |
+ EXPECT_EQ(2u, write_blocked_list.NumBlockedStreams()); |
+ |
+ // Ensure higher priority streams are popped first. |
+ const QuicStreamId id3 = kClientDataStreamId2 + 2; |
+ write_blocked_list.AddStream(id3, QuicWriteBlockedList::kHighestPriority); |
+ 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(id1, 20000); |
+ write_blocked_list.AddStream(id3, QuicWriteBlockedList::kHighestPriority); |
+ 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, QuicWriteBlockedList::kLowestPriority); |
+ EXPECT_EQ(2u, write_blocked_list.NumBlockedStreams()); |
+ EXPECT_EQ(id1, write_blocked_list.PopFront()); |
+} |
+ |
} // namespace |
} // namespace test |
} // namespace net |