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..827f9712c8d3b4f18571a246faccc87bde2e11d7 100644 |
--- a/net/quic/quic_write_blocked_list_test.cc |
+++ b/net/quic/quic_write_blocked_list_test.cc |
@@ -7,6 +7,12 @@ |
#include "net/quic/test_tools/quic_test_utils.h" |
#include "testing/gtest/include/gtest/gtest.h" |
+using net::kLowestPriority; |
+using net::kHighestPriority; |
+ |
+using net::kLowestPriority; |
+using net::kHighestPriority; |
+ |
namespace net { |
namespace test { |
namespace { |
@@ -16,16 +22,11 @@ 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, net::kLowestPriority); |
+ write_blocked_list.AddStream(23, net::kHighestPriority); |
+ write_blocked_list.AddStream(17, net::kHighestPriority); |
+ write_blocked_list.AddStream(kHeadersStreamId, net::kHighestPriority); |
+ write_blocked_list.AddStream(kCryptoStreamId, net::kHighestPriority); |
EXPECT_EQ(5u, write_blocked_list.NumBlockedStreams()); |
EXPECT_TRUE(write_blocked_list.HasWriteBlockedCryptoOrHeadersStream()); |
@@ -47,8 +48,7 @@ TEST(QuicWriteBlockedListTest, PriorityOrder) { |
TEST(QuicWriteBlockedListTest, CryptoStream) { |
QuicWriteBlockedList write_blocked_list; |
- write_blocked_list.PushBack(kCryptoStreamId, |
- QuicWriteBlockedList::kHighestPriority); |
+ write_blocked_list.AddStream(kCryptoStreamId, net::kHighestPriority); |
EXPECT_EQ(1u, write_blocked_list.NumBlockedStreams()); |
EXPECT_TRUE(write_blocked_list.HasWriteBlockedCryptoOrHeadersStream()); |
@@ -59,8 +59,7 @@ TEST(QuicWriteBlockedListTest, CryptoStream) { |
TEST(QuicWriteBlockedListTest, HeadersStream) { |
QuicWriteBlockedList write_blocked_list; |
- write_blocked_list.PushBack(kHeadersStreamId, |
- QuicWriteBlockedList::kHighestPriority); |
+ write_blocked_list.AddStream(kHeadersStreamId, net::kHighestPriority); |
EXPECT_EQ(1u, write_blocked_list.NumBlockedStreams()); |
EXPECT_TRUE(write_blocked_list.HasWriteBlockedCryptoOrHeadersStream()); |
@@ -71,10 +70,8 @@ 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, net::kHighestPriority); |
+ write_blocked_list.AddStream(kHeadersStreamId, net::kHighestPriority); |
EXPECT_EQ(2u, write_blocked_list.NumBlockedStreams()); |
EXPECT_TRUE(write_blocked_list.HasWriteBlockedCryptoOrHeadersStream()); |
@@ -95,12 +92,9 @@ 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, net::kHighestPriority); |
+ write_blocked_list.AddStream(kBlockedId, net::kHighestPriority); |
+ write_blocked_list.AddStream(kBlockedId, net::kHighestPriority); |
// This should only result in one blocked stream being added. |
EXPECT_EQ(1u, write_blocked_list.NumBlockedStreams()); |
@@ -112,6 +106,60 @@ 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, net::kLowestPriority); |
+ write_blocked_list.AddStream(id2, net::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.AddStream(id1, net::kHighestPriority); |
+ write_blocked_list.UpdateBytesForStream(id1, 15999); |
+ write_blocked_list.AddStream(id1, net::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.AddStream(id1, net::kHighestPriority); |
+ write_blocked_list.UpdateBytesForStream(id1, 1); |
+ write_blocked_list.AddStream(id1, net::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.AddStream(id2, net::kHighestPriority); |
+ write_blocked_list.UpdateBytesForStream(id2, 15999); |
+ write_blocked_list.AddStream(id2, net::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, net::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(id3, 20000); |
+ write_blocked_list.AddStream(id3, net::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.AddStream(id2, net::kHighestPriority); |
+ write_blocked_list.UpdateBytesForStream(id2, 1); |
+ write_blocked_list.AddStream(id2, net::kLowestPriority); |
+ EXPECT_EQ(2u, write_blocked_list.NumBlockedStreams()); |
+ EXPECT_EQ(id1, write_blocked_list.PopFront()); |
+} |
+ |
} // namespace |
} // namespace test |
} // namespace net |