Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(90)

Side by Side Diff: net/quic/quic_write_blocked_list_test.cc

Issue 1470713003: Landing Recent QUIC changes until and including Mon Nov 16 14:15:48 2015 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Adding NET_EXPORT_PRIVATE to DelegateInterface. Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 // 4 //
5 #include "net/quic/quic_write_blocked_list.h" 5 #include "net/quic/quic_write_blocked_list.h"
6 6
7 #include "net/quic/test_tools/quic_test_utils.h" 7 #include "net/quic/test_tools/quic_test_utils.h"
8 #include "testing/gtest/include/gtest/gtest.h" 8 #include "testing/gtest/include/gtest/gtest.h"
9 9
10 using net::kLowestPriority;
11 using net::kHighestPriority;
12
13 using net::kLowestPriority;
14 using net::kHighestPriority;
15
10 namespace net { 16 namespace net {
11 namespace test { 17 namespace test {
12 namespace { 18 namespace {
13 19
14 TEST(QuicWriteBlockedListTest, PriorityOrder) { 20 TEST(QuicWriteBlockedListTest, PriorityOrder) {
15 QuicWriteBlockedList write_blocked_list; 21 QuicWriteBlockedList write_blocked_list;
16 22
17 // Mark streams blocked in roughly reverse priority order, and 23 // Mark streams blocked in roughly reverse priority order, and
18 // verify that streams are sorted. 24 // verify that streams are sorted.
19 write_blocked_list.PushBack(40, 25 write_blocked_list.AddStream(40, net::kLowestPriority);
20 QuicWriteBlockedList::kLowestPriority); 26 write_blocked_list.AddStream(23, net::kHighestPriority);
21 write_blocked_list.PushBack(23, 27 write_blocked_list.AddStream(17, net::kHighestPriority);
22 QuicWriteBlockedList::kHighestPriority); 28 write_blocked_list.AddStream(kHeadersStreamId, net::kHighestPriority);
23 write_blocked_list.PushBack(17, 29 write_blocked_list.AddStream(kCryptoStreamId, net::kHighestPriority);
24 QuicWriteBlockedList::kHighestPriority);
25 write_blocked_list.PushBack(kHeadersStreamId,
26 QuicWriteBlockedList::kHighestPriority);
27 write_blocked_list.PushBack(kCryptoStreamId,
28 QuicWriteBlockedList::kHighestPriority);
29 30
30 EXPECT_EQ(5u, write_blocked_list.NumBlockedStreams()); 31 EXPECT_EQ(5u, write_blocked_list.NumBlockedStreams());
31 EXPECT_TRUE(write_blocked_list.HasWriteBlockedCryptoOrHeadersStream()); 32 EXPECT_TRUE(write_blocked_list.HasWriteBlockedCryptoOrHeadersStream());
32 EXPECT_TRUE(write_blocked_list.HasWriteBlockedDataStreams()); 33 EXPECT_TRUE(write_blocked_list.HasWriteBlockedDataStreams());
33 // The Crypto stream is highest priority. 34 // The Crypto stream is highest priority.
34 EXPECT_EQ(kCryptoStreamId, write_blocked_list.PopFront()); 35 EXPECT_EQ(kCryptoStreamId, write_blocked_list.PopFront());
35 // Followed by the Headers stream. 36 // Followed by the Headers stream.
36 EXPECT_EQ(kHeadersStreamId, write_blocked_list.PopFront()); 37 EXPECT_EQ(kHeadersStreamId, write_blocked_list.PopFront());
37 // Streams with same priority are popped in the order they were inserted. 38 // Streams with same priority are popped in the order they were inserted.
38 EXPECT_EQ(23u, write_blocked_list.PopFront()); 39 EXPECT_EQ(23u, write_blocked_list.PopFront());
39 EXPECT_EQ(17u, write_blocked_list.PopFront()); 40 EXPECT_EQ(17u, write_blocked_list.PopFront());
40 // Low priority stream appears last. 41 // Low priority stream appears last.
41 EXPECT_EQ(40u, write_blocked_list.PopFront()); 42 EXPECT_EQ(40u, write_blocked_list.PopFront());
42 43
43 EXPECT_EQ(0u, write_blocked_list.NumBlockedStreams()); 44 EXPECT_EQ(0u, write_blocked_list.NumBlockedStreams());
44 EXPECT_FALSE(write_blocked_list.HasWriteBlockedCryptoOrHeadersStream()); 45 EXPECT_FALSE(write_blocked_list.HasWriteBlockedCryptoOrHeadersStream());
45 EXPECT_FALSE(write_blocked_list.HasWriteBlockedDataStreams()); 46 EXPECT_FALSE(write_blocked_list.HasWriteBlockedDataStreams());
46 } 47 }
47 48
48 TEST(QuicWriteBlockedListTest, CryptoStream) { 49 TEST(QuicWriteBlockedListTest, CryptoStream) {
49 QuicWriteBlockedList write_blocked_list; 50 QuicWriteBlockedList write_blocked_list;
50 write_blocked_list.PushBack(kCryptoStreamId, 51 write_blocked_list.AddStream(kCryptoStreamId, net::kHighestPriority);
51 QuicWriteBlockedList::kHighestPriority);
52 52
53 EXPECT_EQ(1u, write_blocked_list.NumBlockedStreams()); 53 EXPECT_EQ(1u, write_blocked_list.NumBlockedStreams());
54 EXPECT_TRUE(write_blocked_list.HasWriteBlockedCryptoOrHeadersStream()); 54 EXPECT_TRUE(write_blocked_list.HasWriteBlockedCryptoOrHeadersStream());
55 EXPECT_EQ(kCryptoStreamId, write_blocked_list.PopFront()); 55 EXPECT_EQ(kCryptoStreamId, write_blocked_list.PopFront());
56 EXPECT_EQ(0u, write_blocked_list.NumBlockedStreams()); 56 EXPECT_EQ(0u, write_blocked_list.NumBlockedStreams());
57 EXPECT_FALSE(write_blocked_list.HasWriteBlockedCryptoOrHeadersStream()); 57 EXPECT_FALSE(write_blocked_list.HasWriteBlockedCryptoOrHeadersStream());
58 } 58 }
59 59
60 TEST(QuicWriteBlockedListTest, HeadersStream) { 60 TEST(QuicWriteBlockedListTest, HeadersStream) {
61 QuicWriteBlockedList write_blocked_list; 61 QuicWriteBlockedList write_blocked_list;
62 write_blocked_list.PushBack(kHeadersStreamId, 62 write_blocked_list.AddStream(kHeadersStreamId, net::kHighestPriority);
63 QuicWriteBlockedList::kHighestPriority);
64 63
65 EXPECT_EQ(1u, write_blocked_list.NumBlockedStreams()); 64 EXPECT_EQ(1u, write_blocked_list.NumBlockedStreams());
66 EXPECT_TRUE(write_blocked_list.HasWriteBlockedCryptoOrHeadersStream()); 65 EXPECT_TRUE(write_blocked_list.HasWriteBlockedCryptoOrHeadersStream());
67 EXPECT_EQ(kHeadersStreamId, write_blocked_list.PopFront()); 66 EXPECT_EQ(kHeadersStreamId, write_blocked_list.PopFront());
68 EXPECT_EQ(0u, write_blocked_list.NumBlockedStreams()); 67 EXPECT_EQ(0u, write_blocked_list.NumBlockedStreams());
69 EXPECT_FALSE(write_blocked_list.HasWriteBlockedCryptoOrHeadersStream()); 68 EXPECT_FALSE(write_blocked_list.HasWriteBlockedCryptoOrHeadersStream());
70 } 69 }
71 70
72 TEST(QuicWriteBlockedListTest, VerifyHeadersStream) { 71 TEST(QuicWriteBlockedListTest, VerifyHeadersStream) {
73 QuicWriteBlockedList write_blocked_list; 72 QuicWriteBlockedList write_blocked_list;
74 write_blocked_list.PushBack(5, 73 write_blocked_list.AddStream(5, net::kHighestPriority);
75 QuicWriteBlockedList::kHighestPriority); 74 write_blocked_list.AddStream(kHeadersStreamId, net::kHighestPriority);
76 write_blocked_list.PushBack(kHeadersStreamId,
77 QuicWriteBlockedList::kHighestPriority);
78 75
79 EXPECT_EQ(2u, write_blocked_list.NumBlockedStreams()); 76 EXPECT_EQ(2u, write_blocked_list.NumBlockedStreams());
80 EXPECT_TRUE(write_blocked_list.HasWriteBlockedCryptoOrHeadersStream()); 77 EXPECT_TRUE(write_blocked_list.HasWriteBlockedCryptoOrHeadersStream());
81 EXPECT_TRUE(write_blocked_list.HasWriteBlockedDataStreams()); 78 EXPECT_TRUE(write_blocked_list.HasWriteBlockedDataStreams());
82 // In newer QUIC versions, there is a headers stream which is 79 // In newer QUIC versions, there is a headers stream which is
83 // higher priority than data streams. 80 // higher priority than data streams.
84 EXPECT_EQ(kHeadersStreamId, write_blocked_list.PopFront()); 81 EXPECT_EQ(kHeadersStreamId, write_blocked_list.PopFront());
85 EXPECT_EQ(5u, write_blocked_list.PopFront()); 82 EXPECT_EQ(5u, write_blocked_list.PopFront());
86 EXPECT_EQ(0u, write_blocked_list.NumBlockedStreams()); 83 EXPECT_EQ(0u, write_blocked_list.NumBlockedStreams());
87 EXPECT_FALSE(write_blocked_list.HasWriteBlockedCryptoOrHeadersStream()); 84 EXPECT_FALSE(write_blocked_list.HasWriteBlockedCryptoOrHeadersStream());
88 EXPECT_FALSE(write_blocked_list.HasWriteBlockedDataStreams()); 85 EXPECT_FALSE(write_blocked_list.HasWriteBlockedDataStreams());
89 } 86 }
90 87
91 TEST(QuicWriteBlockedListTest, NoDuplicateEntries) { 88 TEST(QuicWriteBlockedListTest, NoDuplicateEntries) {
92 // Test that QuicWriteBlockedList doesn't allow duplicate entries. 89 // Test that QuicWriteBlockedList doesn't allow duplicate entries.
93 QuicWriteBlockedList write_blocked_list; 90 QuicWriteBlockedList write_blocked_list;
94 91
95 // Try to add a stream to the write blocked list multiple times at the same 92 // Try to add a stream to the write blocked list multiple times at the same
96 // priority. 93 // priority.
97 const QuicStreamId kBlockedId = kClientDataStreamId1; 94 const QuicStreamId kBlockedId = kClientDataStreamId1;
98 write_blocked_list.PushBack(kBlockedId, 95 write_blocked_list.AddStream(kBlockedId, net::kHighestPriority);
99 QuicWriteBlockedList::kHighestPriority); 96 write_blocked_list.AddStream(kBlockedId, net::kHighestPriority);
100 write_blocked_list.PushBack(kBlockedId, 97 write_blocked_list.AddStream(kBlockedId, net::kHighestPriority);
101 QuicWriteBlockedList::kHighestPriority);
102 write_blocked_list.PushBack(kBlockedId,
103 QuicWriteBlockedList::kHighestPriority);
104 98
105 // This should only result in one blocked stream being added. 99 // This should only result in one blocked stream being added.
106 EXPECT_EQ(1u, write_blocked_list.NumBlockedStreams()); 100 EXPECT_EQ(1u, write_blocked_list.NumBlockedStreams());
107 EXPECT_TRUE(write_blocked_list.HasWriteBlockedDataStreams()); 101 EXPECT_TRUE(write_blocked_list.HasWriteBlockedDataStreams());
108 102
109 // There should only be one stream to pop off the front. 103 // There should only be one stream to pop off the front.
110 EXPECT_EQ(kBlockedId, write_blocked_list.PopFront()); 104 EXPECT_EQ(kBlockedId, write_blocked_list.PopFront());
111 EXPECT_EQ(0u, write_blocked_list.NumBlockedStreams()); 105 EXPECT_EQ(0u, write_blocked_list.NumBlockedStreams());
112 EXPECT_FALSE(write_blocked_list.HasWriteBlockedDataStreams()); 106 EXPECT_FALSE(write_blocked_list.HasWriteBlockedDataStreams());
113 } 107 }
114 108
109 TEST(QuicWriteBlockedListTest, BatchingWrites) {
110 FLAGS_quic_batch_writes = true;
111 QuicWriteBlockedList write_blocked_list;
112
113 const QuicStreamId id1 = kClientDataStreamId1;
114 const QuicStreamId id2 = kClientDataStreamId2;
115
116 write_blocked_list.AddStream(id1, net::kLowestPriority);
117 write_blocked_list.AddStream(id2, net::kLowestPriority);
118 EXPECT_EQ(2u, write_blocked_list.NumBlockedStreams());
119
120 // The first stream we push back should stay at the front until 16k is
121 // written.
122 EXPECT_EQ(id1, write_blocked_list.PopFront());
123 write_blocked_list.AddStream(id1, net::kHighestPriority);
124 write_blocked_list.UpdateBytesForStream(id1, 15999);
125 write_blocked_list.AddStream(id1, net::kLowestPriority);
126 EXPECT_EQ(2u, write_blocked_list.NumBlockedStreams());
127 EXPECT_EQ(id1, write_blocked_list.PopFront());
128
129 // Once 16k is written the first stream will cede to the next.
130 write_blocked_list.AddStream(id1, net::kHighestPriority);
131 write_blocked_list.UpdateBytesForStream(id1, 1);
132 write_blocked_list.AddStream(id1, net::kLowestPriority);
133 EXPECT_EQ(2u, write_blocked_list.NumBlockedStreams());
134 EXPECT_EQ(id2, write_blocked_list.PopFront());
135
136 // Set the new stream to have written all but one byte.
137 write_blocked_list.AddStream(id2, net::kHighestPriority);
138 write_blocked_list.UpdateBytesForStream(id2, 15999);
139 write_blocked_list.AddStream(id2, net::kLowestPriority);
140 EXPECT_EQ(2u, write_blocked_list.NumBlockedStreams());
141
142 // Ensure higher priority streams are popped first.
143 const QuicStreamId id3 = kClientDataStreamId2 + 2;
144 write_blocked_list.AddStream(id3, net::kHighestPriority);
145 EXPECT_EQ(id3, write_blocked_list.PopFront());
146
147 // Higher priority streams will always be popped first, even if using their
148 // byte quota
149 write_blocked_list.UpdateBytesForStream(id3, 20000);
150 write_blocked_list.AddStream(id3, net::kHighestPriority);
151 EXPECT_EQ(id3, write_blocked_list.PopFront());
152
153 // Once the higher priority stream is out of the way, id2 will resume its 16k
154 // write, with only 1 byte remaining of its guaranteed write allocation.
155 EXPECT_EQ(id2, write_blocked_list.PopFront());
156 write_blocked_list.AddStream(id2, net::kHighestPriority);
157 write_blocked_list.UpdateBytesForStream(id2, 1);
158 write_blocked_list.AddStream(id2, net::kLowestPriority);
159 EXPECT_EQ(2u, write_blocked_list.NumBlockedStreams());
160 EXPECT_EQ(id1, write_blocked_list.PopFront());
161 }
162
115 } // namespace 163 } // namespace
116 } // namespace test 164 } // namespace test
117 } // namespace net 165 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698