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

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

Issue 1764913002: Deprecate --gfe2_reloadable_flag_quic_use_stream_sequencer_buffer. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@115690862
Patch Set: update dependency Created 4 years, 9 months 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
« no previous file with comments | « net/quic/quic_stream_sequencer.cc ('k') | net/quic/test_tools/quic_stream_sequencer_peer.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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_stream_sequencer.h" 5 #include "net/quic/quic_stream_sequencer.h"
6 6
7 #include <utility> 7 #include <utility>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
50 MOCK_METHOD1(Reset, void(QuicRstStreamErrorCode error)); 50 MOCK_METHOD1(Reset, void(QuicRstStreamErrorCode error));
51 MOCK_METHOD0(OnCanWrite, void()); 51 MOCK_METHOD0(OnCanWrite, void());
52 virtual bool IsFlowControlEnabled() const { return true; } 52 virtual bool IsFlowControlEnabled() const { return true; }
53 }; 53 };
54 54
55 namespace { 55 namespace {
56 56
57 static const char kPayload[] = 57 static const char kPayload[] =
58 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 58 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
59 59
60 class QuicStreamSequencerTest : public ::testing::TestWithParam<bool> { 60 class QuicStreamSequencerTest : public ::testing::Test {
61 public: 61 public:
62 void SetUp() override {
63 FLAGS_quic_use_stream_sequencer_buffer = GetParam();
64 sequencer_.reset(new QuicStreamSequencer(&stream_, &clock_));
65 }
66
67 void ConsumeData(size_t num_bytes) { 62 void ConsumeData(size_t num_bytes) {
68 char buffer[1024]; 63 char buffer[1024];
69 ASSERT_GT(arraysize(buffer), num_bytes); 64 ASSERT_GT(arraysize(buffer), num_bytes);
70 struct iovec iov; 65 struct iovec iov;
71 iov.iov_base = buffer; 66 iov.iov_base = buffer;
72 iov.iov_len = num_bytes; 67 iov.iov_len = num_bytes;
73 ASSERT_EQ(static_cast<int>(num_bytes), sequencer_->Readv(&iov, 1)); 68 ASSERT_EQ(static_cast<int>(num_bytes), sequencer_->Readv(&iov, 1));
74 } 69 }
75 70
76 protected: 71 protected:
77 QuicStreamSequencerTest() 72 QuicStreamSequencerTest()
78 : connection_(new MockConnection(&helper_, Perspective::IS_CLIENT)), 73 : connection_(new MockConnection(&helper_, Perspective::IS_CLIENT)),
79 session_(connection_), 74 session_(connection_),
80 stream_(&session_, 1) {} 75 stream_(&session_, 1),
76 sequencer_(new QuicStreamSequencer(&stream_, &clock_)) {}
81 77
82 // Verify that the data in first region match with the expected[0]. 78 // Verify that the data in first region match with the expected[0].
83 bool VerifyReadableRegion(const vector<string>& expected) { 79 bool VerifyReadableRegion(const vector<string>& expected) {
84 iovec iovecs[1]; 80 iovec iovecs[1];
85 if (sequencer_->GetReadableRegions(iovecs, 1)) { 81 if (sequencer_->GetReadableRegions(iovecs, 1)) {
86 return (VerifyIovecs(iovecs, 1, vector<string>{expected[0]})); 82 return (VerifyIovecs(iovecs, 1, vector<string>{expected[0]}));
87 } 83 }
88 return false; 84 return false;
89 } 85 }
90 86
91 // Verify that the data in each of currently readable regions match with each 87 // Verify that the data in each of currently readable regions match with each
92 // item given in |expected|. 88 // item given in |expected|.
93 bool VerifyReadableRegions(const vector<string>& expected) { 89 bool VerifyReadableRegions(const vector<string>& expected) {
94 iovec iovecs[5]; 90 iovec iovecs[5];
95 size_t num_iovecs = 91 size_t num_iovecs =
96 sequencer_->GetReadableRegions(iovecs, arraysize(iovecs)); 92 sequencer_->GetReadableRegions(iovecs, arraysize(iovecs));
97 return VerifyReadableRegion(expected) && 93 return VerifyReadableRegion(expected) &&
98 VerifyIovecs(iovecs, num_iovecs, expected); 94 VerifyIovecs(iovecs, num_iovecs, expected);
99 } 95 }
100 96
101 bool VerifyIovecs(iovec* iovecs, 97 bool VerifyIovecs(iovec* iovecs,
102 size_t num_iovecs, 98 size_t num_iovecs,
103 const vector<string>& expected) { 99 const vector<string>& expected) {
104 if (!FLAGS_quic_use_stream_sequencer_buffer) { 100 int start_position = 0;
105 if (expected.size() != num_iovecs) { 101 for (size_t i = 0; i < num_iovecs; ++i) {
106 LOG(ERROR) << "Incorrect number of iovecs. Expected: " 102 if (!VerifyIovec(iovecs[i],
107 << expected.size() << " Actual: " << num_iovecs; 103 expected[0].substr(start_position, iovecs[i].iov_len))) {
108 return false; 104 return false;
109 } 105 }
110 106 start_position += iovecs[i].iov_len;
111 for (size_t i = 0; i < num_iovecs; ++i) {
112 if (!VerifyIovec(iovecs[i], expected[i])) {
113 return false;
114 }
115 }
116 } else {
117 int start_position = 0;
118 for (size_t i = 0; i < num_iovecs; ++i) {
119 if (!VerifyIovec(iovecs[i], expected[0].substr(start_position,
120 iovecs[i].iov_len))) {
121 return false;
122 }
123 start_position += iovecs[i].iov_len;
124 }
125 } 107 }
126 return true; 108 return true;
127 } 109 }
128 110
129 bool VerifyIovec(const iovec& iovec, StringPiece expected) { 111 bool VerifyIovec(const iovec& iovec, StringPiece expected) {
130 if (iovec.iov_len != expected.length()) { 112 if (iovec.iov_len != expected.length()) {
131 LOG(ERROR) << "Invalid length: " << iovec.iov_len << " vs " 113 LOG(ERROR) << "Invalid length: " << iovec.iov_len << " vs "
132 << expected.length(); 114 << expected.length();
133 return false; 115 return false;
134 } 116 }
(...skipping 30 matching lines...) Expand all
165 } 147 }
166 148
167 MockConnectionHelper helper_; 149 MockConnectionHelper helper_;
168 MockConnection* connection_; 150 MockConnection* connection_;
169 MockClock clock_; 151 MockClock clock_;
170 MockQuicSpdySession session_; 152 MockQuicSpdySession session_;
171 testing::StrictMock<MockStream> stream_; 153 testing::StrictMock<MockStream> stream_;
172 scoped_ptr<QuicStreamSequencer> sequencer_; 154 scoped_ptr<QuicStreamSequencer> sequencer_;
173 }; 155 };
174 156
175 INSTANTIATE_TEST_CASE_P(QuicStreamSequencerTests,
176 QuicStreamSequencerTest,
177 ::testing::Values(false, true));
178
179 // TODO(rch): reorder these tests so they build on each other. 157 // TODO(rch): reorder these tests so they build on each other.
180 158
181 TEST_P(QuicStreamSequencerTest, RejectOldFrame) { 159 TEST_F(QuicStreamSequencerTest, RejectOldFrame) {
182 EXPECT_CALL(stream_, OnDataAvailable()) 160 EXPECT_CALL(stream_, OnDataAvailable())
183 .WillOnce(testing::Invoke( 161 .WillOnce(testing::Invoke(
184 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, 162 CreateFunctor(&QuicStreamSequencerTest::ConsumeData,
185 base::Unretained(this), 3))); 163 base::Unretained(this), 3)));
186 164
187 OnFrame(0, "abc"); 165 OnFrame(0, "abc");
188 166
189 EXPECT_EQ(0u, NumBufferedBytes()); 167 EXPECT_EQ(0u, NumBufferedBytes());
190 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); 168 EXPECT_EQ(3u, sequencer_->NumBytesConsumed());
191 EXPECT_EQ(3u, stream_.flow_controller()->bytes_consumed()); 169 EXPECT_EQ(3u, stream_.flow_controller()->bytes_consumed());
192 // Ignore this - it matches a past packet number and we should not see it 170 // Ignore this - it matches a past packet number and we should not see it
193 // again. 171 // again.
194 OnFrame(0, "def"); 172 OnFrame(0, "def");
195 EXPECT_EQ(0u, NumBufferedBytes()); 173 EXPECT_EQ(0u, NumBufferedBytes());
196 } 174 }
197 175
198 TEST_P(QuicStreamSequencerTest, RejectBufferedFrame) { 176 TEST_F(QuicStreamSequencerTest, RejectBufferedFrame) {
199 EXPECT_CALL(stream_, OnDataAvailable()); 177 EXPECT_CALL(stream_, OnDataAvailable());
200 178
201 OnFrame(0, "abc"); 179 OnFrame(0, "abc");
202 EXPECT_EQ(3u, NumBufferedBytes()); 180 EXPECT_EQ(3u, NumBufferedBytes());
203 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); 181 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
204 182
205 // Ignore this - it matches a buffered frame. 183 // Ignore this - it matches a buffered frame.
206 // Right now there's no checking that the payload is consistent. 184 // Right now there's no checking that the payload is consistent.
207 OnFrame(0, "def"); 185 OnFrame(0, "def");
208 EXPECT_EQ(3u, NumBufferedBytes()); 186 EXPECT_EQ(3u, NumBufferedBytes());
209 } 187 }
210 188
211 TEST_P(QuicStreamSequencerTest, FullFrameConsumed) { 189 TEST_F(QuicStreamSequencerTest, FullFrameConsumed) {
212 EXPECT_CALL(stream_, OnDataAvailable()) 190 EXPECT_CALL(stream_, OnDataAvailable())
213 .WillOnce(testing::Invoke( 191 .WillOnce(testing::Invoke(
214 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, 192 CreateFunctor(&QuicStreamSequencerTest::ConsumeData,
215 base::Unretained(this), 3))); 193 base::Unretained(this), 3)));
216 194
217 OnFrame(0, "abc"); 195 OnFrame(0, "abc");
218 EXPECT_EQ(0u, NumBufferedBytes()); 196 EXPECT_EQ(0u, NumBufferedBytes());
219 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); 197 EXPECT_EQ(3u, sequencer_->NumBytesConsumed());
220 } 198 }
221 199
222 TEST_P(QuicStreamSequencerTest, BlockedThenFullFrameConsumed) { 200 TEST_F(QuicStreamSequencerTest, BlockedThenFullFrameConsumed) {
223 sequencer_->SetBlockedUntilFlush(); 201 sequencer_->SetBlockedUntilFlush();
224 202
225 OnFrame(0, "abc"); 203 OnFrame(0, "abc");
226 EXPECT_EQ(3u, NumBufferedBytes()); 204 EXPECT_EQ(3u, NumBufferedBytes());
227 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); 205 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
228 206
229 EXPECT_CALL(stream_, OnDataAvailable()) 207 EXPECT_CALL(stream_, OnDataAvailable())
230 .WillOnce(testing::Invoke( 208 .WillOnce(testing::Invoke(
231 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, 209 CreateFunctor(&QuicStreamSequencerTest::ConsumeData,
232 base::Unretained(this), 3))); 210 base::Unretained(this), 3)));
233 sequencer_->SetUnblocked(); 211 sequencer_->SetUnblocked();
234 EXPECT_EQ(0u, NumBufferedBytes()); 212 EXPECT_EQ(0u, NumBufferedBytes());
235 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); 213 EXPECT_EQ(3u, sequencer_->NumBytesConsumed());
236 214
237 EXPECT_CALL(stream_, OnDataAvailable()) 215 EXPECT_CALL(stream_, OnDataAvailable())
238 .WillOnce(testing::Invoke( 216 .WillOnce(testing::Invoke(
239 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, 217 CreateFunctor(&QuicStreamSequencerTest::ConsumeData,
240 base::Unretained(this), 3))); 218 base::Unretained(this), 3)));
241 EXPECT_FALSE(sequencer_->IsClosed()); 219 EXPECT_FALSE(sequencer_->IsClosed());
242 OnFinFrame(3, "def"); 220 OnFinFrame(3, "def");
243 EXPECT_TRUE(sequencer_->IsClosed()); 221 EXPECT_TRUE(sequencer_->IsClosed());
244 } 222 }
245 223
246 TEST_P(QuicStreamSequencerTest, BlockedThenFullFrameAndFinConsumed) { 224 TEST_F(QuicStreamSequencerTest, BlockedThenFullFrameAndFinConsumed) {
247 sequencer_->SetBlockedUntilFlush(); 225 sequencer_->SetBlockedUntilFlush();
248 226
249 OnFinFrame(0, "abc"); 227 OnFinFrame(0, "abc");
250 EXPECT_EQ(3u, NumBufferedBytes()); 228 EXPECT_EQ(3u, NumBufferedBytes());
251 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); 229 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
252 230
253 EXPECT_CALL(stream_, OnDataAvailable()) 231 EXPECT_CALL(stream_, OnDataAvailable())
254 .WillOnce(testing::Invoke( 232 .WillOnce(testing::Invoke(
255 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, 233 CreateFunctor(&QuicStreamSequencerTest::ConsumeData,
256 base::Unretained(this), 3))); 234 base::Unretained(this), 3)));
257 EXPECT_FALSE(sequencer_->IsClosed()); 235 EXPECT_FALSE(sequencer_->IsClosed());
258 sequencer_->SetUnblocked(); 236 sequencer_->SetUnblocked();
259 EXPECT_TRUE(sequencer_->IsClosed()); 237 EXPECT_TRUE(sequencer_->IsClosed());
260 EXPECT_EQ(0u, NumBufferedBytes()); 238 EXPECT_EQ(0u, NumBufferedBytes());
261 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); 239 EXPECT_EQ(3u, sequencer_->NumBytesConsumed());
262 } 240 }
263 241
264 TEST_P(QuicStreamSequencerTest, EmptyFrame) { 242 TEST_F(QuicStreamSequencerTest, EmptyFrame) {
265 EXPECT_CALL(stream_, 243 EXPECT_CALL(stream_,
266 CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _)); 244 CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _));
267 OnFrame(0, ""); 245 OnFrame(0, "");
268 EXPECT_EQ(0u, NumBufferedBytes()); 246 EXPECT_EQ(0u, NumBufferedBytes());
269 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); 247 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
270 } 248 }
271 249
272 TEST_P(QuicStreamSequencerTest, EmptyFinFrame) { 250 TEST_F(QuicStreamSequencerTest, EmptyFinFrame) {
273 EXPECT_CALL(stream_, OnDataAvailable()); 251 EXPECT_CALL(stream_, OnDataAvailable());
274 OnFinFrame(0, ""); 252 OnFinFrame(0, "");
275 EXPECT_EQ(0u, NumBufferedBytes()); 253 EXPECT_EQ(0u, NumBufferedBytes());
276 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); 254 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
277 } 255 }
278 256
279 TEST_P(QuicStreamSequencerTest, PartialFrameConsumed) { 257 TEST_F(QuicStreamSequencerTest, PartialFrameConsumed) {
280 EXPECT_CALL(stream_, OnDataAvailable()) 258 EXPECT_CALL(stream_, OnDataAvailable())
281 .WillOnce(testing::Invoke( 259 .WillOnce(testing::Invoke(
282 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, 260 CreateFunctor(&QuicStreamSequencerTest::ConsumeData,
283 base::Unretained(this), 2))); 261 base::Unretained(this), 2)));
284 262
285 OnFrame(0, "abc"); 263 OnFrame(0, "abc");
286 EXPECT_EQ(1u, NumBufferedBytes()); 264 EXPECT_EQ(1u, NumBufferedBytes());
287 EXPECT_EQ(2u, sequencer_->NumBytesConsumed()); 265 EXPECT_EQ(2u, sequencer_->NumBytesConsumed());
288 } 266 }
289 267
290 TEST_P(QuicStreamSequencerTest, NextxFrameNotConsumed) { 268 TEST_F(QuicStreamSequencerTest, NextxFrameNotConsumed) {
291 EXPECT_CALL(stream_, OnDataAvailable()); 269 EXPECT_CALL(stream_, OnDataAvailable());
292 270
293 OnFrame(0, "abc"); 271 OnFrame(0, "abc");
294 EXPECT_EQ(3u, NumBufferedBytes()); 272 EXPECT_EQ(3u, NumBufferedBytes());
295 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); 273 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
296 EXPECT_EQ(0, sequencer_->num_early_frames_received()); 274 EXPECT_EQ(0, sequencer_->num_early_frames_received());
297 } 275 }
298 276
299 TEST_P(QuicStreamSequencerTest, FutureFrameNotProcessed) { 277 TEST_F(QuicStreamSequencerTest, FutureFrameNotProcessed) {
300 OnFrame(3, "abc"); 278 OnFrame(3, "abc");
301 EXPECT_EQ(3u, NumBufferedBytes()); 279 EXPECT_EQ(3u, NumBufferedBytes());
302 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); 280 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
303 EXPECT_EQ(1, sequencer_->num_early_frames_received()); 281 EXPECT_EQ(1, sequencer_->num_early_frames_received());
304 } 282 }
305 283
306 TEST_P(QuicStreamSequencerTest, OutOfOrderFrameProcessed) { 284 TEST_F(QuicStreamSequencerTest, OutOfOrderFrameProcessed) {
307 // Buffer the first 285 // Buffer the first
308 OnFrame(6, "ghi"); 286 OnFrame(6, "ghi");
309 EXPECT_EQ(3u, NumBufferedBytes()); 287 EXPECT_EQ(3u, NumBufferedBytes());
310 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); 288 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
311 EXPECT_EQ(3u, sequencer_->NumBytesBuffered()); 289 EXPECT_EQ(3u, sequencer_->NumBytesBuffered());
312 // Buffer the second 290 // Buffer the second
313 OnFrame(3, "def"); 291 OnFrame(3, "def");
314 EXPECT_EQ(6u, NumBufferedBytes()); 292 EXPECT_EQ(6u, NumBufferedBytes());
315 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); 293 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
316 EXPECT_EQ(6u, sequencer_->NumBytesBuffered()); 294 EXPECT_EQ(6u, sequencer_->NumBytesBuffered());
317 295
318 EXPECT_CALL(stream_, OnDataAvailable()) 296 EXPECT_CALL(stream_, OnDataAvailable())
319 .WillOnce(testing::Invoke( 297 .WillOnce(testing::Invoke(
320 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, 298 CreateFunctor(&QuicStreamSequencerTest::ConsumeData,
321 base::Unretained(this), 9))); 299 base::Unretained(this), 9)));
322 300
323 // Now process all of them at once. 301 // Now process all of them at once.
324 OnFrame(0, "abc"); 302 OnFrame(0, "abc");
325 EXPECT_EQ(9u, sequencer_->NumBytesConsumed()); 303 EXPECT_EQ(9u, sequencer_->NumBytesConsumed());
326 EXPECT_EQ(0u, sequencer_->NumBytesBuffered()); 304 EXPECT_EQ(0u, sequencer_->NumBytesBuffered());
327 305
328 EXPECT_EQ(0u, NumBufferedBytes()); 306 EXPECT_EQ(0u, NumBufferedBytes());
329 } 307 }
330 308
331 TEST_P(QuicStreamSequencerTest, BasicHalfCloseOrdered) { 309 TEST_F(QuicStreamSequencerTest, BasicHalfCloseOrdered) {
332 InSequence s; 310 InSequence s;
333 311
334 EXPECT_CALL(stream_, OnDataAvailable()) 312 EXPECT_CALL(stream_, OnDataAvailable())
335 .WillOnce(testing::Invoke( 313 .WillOnce(testing::Invoke(
336 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, 314 CreateFunctor(&QuicStreamSequencerTest::ConsumeData,
337 base::Unretained(this), 3))); 315 base::Unretained(this), 3)));
338 OnFinFrame(0, "abc"); 316 OnFinFrame(0, "abc");
339 317
340 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); 318 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get()));
341 } 319 }
342 320
343 TEST_P(QuicStreamSequencerTest, BasicHalfCloseUnorderedWithFlush) { 321 TEST_F(QuicStreamSequencerTest, BasicHalfCloseUnorderedWithFlush) {
344 OnFinFrame(6, ""); 322 OnFinFrame(6, "");
345 EXPECT_EQ(6u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); 323 EXPECT_EQ(6u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get()));
346 324
347 OnFrame(3, "def"); 325 OnFrame(3, "def");
348 EXPECT_CALL(stream_, OnDataAvailable()) 326 EXPECT_CALL(stream_, OnDataAvailable())
349 .WillOnce(testing::Invoke( 327 .WillOnce(testing::Invoke(
350 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, 328 CreateFunctor(&QuicStreamSequencerTest::ConsumeData,
351 base::Unretained(this), 6))); 329 base::Unretained(this), 6)));
352 EXPECT_FALSE(sequencer_->IsClosed()); 330 EXPECT_FALSE(sequencer_->IsClosed());
353 OnFrame(0, "abc"); 331 OnFrame(0, "abc");
354 EXPECT_TRUE(sequencer_->IsClosed()); 332 EXPECT_TRUE(sequencer_->IsClosed());
355 } 333 }
356 334
357 TEST_P(QuicStreamSequencerTest, BasicHalfUnordered) { 335 TEST_F(QuicStreamSequencerTest, BasicHalfUnordered) {
358 OnFinFrame(3, ""); 336 OnFinFrame(3, "");
359 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); 337 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get()));
360 338
361 EXPECT_CALL(stream_, OnDataAvailable()) 339 EXPECT_CALL(stream_, OnDataAvailable())
362 .WillOnce(testing::Invoke( 340 .WillOnce(testing::Invoke(
363 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, 341 CreateFunctor(&QuicStreamSequencerTest::ConsumeData,
364 base::Unretained(this), 3))); 342 base::Unretained(this), 3)));
365 EXPECT_FALSE(sequencer_->IsClosed()); 343 EXPECT_FALSE(sequencer_->IsClosed());
366 OnFrame(0, "abc"); 344 OnFrame(0, "abc");
367 EXPECT_TRUE(sequencer_->IsClosed()); 345 EXPECT_TRUE(sequencer_->IsClosed());
368 } 346 }
369 347
370 TEST_P(QuicStreamSequencerTest, TerminateWithReadv) { 348 TEST_F(QuicStreamSequencerTest, TerminateWithReadv) {
371 char buffer[3]; 349 char buffer[3];
372 350
373 OnFinFrame(3, ""); 351 OnFinFrame(3, "");
374 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); 352 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get()));
375 353
376 EXPECT_FALSE(sequencer_->IsClosed()); 354 EXPECT_FALSE(sequencer_->IsClosed());
377 355
378 EXPECT_CALL(stream_, OnDataAvailable()); 356 EXPECT_CALL(stream_, OnDataAvailable());
379 OnFrame(0, "abc"); 357 OnFrame(0, "abc");
380 358
381 iovec iov = {&buffer[0], 3}; 359 iovec iov = {&buffer[0], 3};
382 int bytes_read = sequencer_->Readv(&iov, 1); 360 int bytes_read = sequencer_->Readv(&iov, 1);
383 EXPECT_EQ(3, bytes_read); 361 EXPECT_EQ(3, bytes_read);
384 EXPECT_TRUE(sequencer_->IsClosed()); 362 EXPECT_TRUE(sequencer_->IsClosed());
385 } 363 }
386 364
387 TEST_P(QuicStreamSequencerTest, MutipleOffsets) { 365 TEST_F(QuicStreamSequencerTest, MutipleOffsets) {
388 OnFinFrame(3, ""); 366 OnFinFrame(3, "");
389 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); 367 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get()));
390 368
391 EXPECT_CALL(stream_, Reset(QUIC_MULTIPLE_TERMINATION_OFFSETS)); 369 EXPECT_CALL(stream_, Reset(QUIC_MULTIPLE_TERMINATION_OFFSETS));
392 OnFinFrame(5, ""); 370 OnFinFrame(5, "");
393 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); 371 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get()));
394 372
395 EXPECT_CALL(stream_, Reset(QUIC_MULTIPLE_TERMINATION_OFFSETS)); 373 EXPECT_CALL(stream_, Reset(QUIC_MULTIPLE_TERMINATION_OFFSETS));
396 OnFinFrame(1, ""); 374 OnFinFrame(1, "");
397 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); 375 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get()));
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
432 } 410 }
433 411
434 string output_; 412 string output_;
435 // Data which peek at using GetReadableRegion if we back up. 413 // Data which peek at using GetReadableRegion if we back up.
436 string peeked_; 414 string peeked_;
437 FrameList list_; 415 FrameList list_;
438 }; 416 };
439 417
440 // All frames are processed as soon as we have sequential data. 418 // All frames are processed as soon as we have sequential data.
441 // Infinite buffering, so all frames are acked right away. 419 // Infinite buffering, so all frames are acked right away.
442 TEST_P(QuicSequencerRandomTest, RandomFramesNoDroppingNoBackup) { 420 TEST_F(QuicSequencerRandomTest, RandomFramesNoDroppingNoBackup) {
443 InSequence s; 421 InSequence s;
444 EXPECT_CALL(stream_, OnDataAvailable()) 422 EXPECT_CALL(stream_, OnDataAvailable())
445 .Times(AnyNumber()) 423 .Times(AnyNumber())
446 .WillRepeatedly( 424 .WillRepeatedly(
447 Invoke(this, &QuicSequencerRandomTest::ReadAvailableData)); 425 Invoke(this, &QuicSequencerRandomTest::ReadAvailableData));
448 426
449 while (!list_.empty()) { 427 while (!list_.empty()) {
450 int index = OneToN(list_.size()) - 1; 428 int index = OneToN(list_.size()) - 1;
451 LOG(ERROR) << "Sending index " << index << " " << list_[index].second; 429 LOG(ERROR) << "Sending index " << index << " " << list_[index].second;
452 OnFrame(list_[index].first, list_[index].second.data()); 430 OnFrame(list_[index].first, list_[index].second.data());
453 431
454 list_.erase(list_.begin() + index); 432 list_.erase(list_.begin() + index);
455 } 433 }
456 434
457 ASSERT_EQ(arraysize(kPayload) - 1, output_.size()); 435 ASSERT_EQ(arraysize(kPayload) - 1, output_.size());
458 EXPECT_EQ(kPayload, output_); 436 EXPECT_EQ(kPayload, output_);
459 } 437 }
460 438
461 TEST_P(QuicSequencerRandomTest, RandomFramesNoDroppingBackup) { 439 TEST_F(QuicSequencerRandomTest, RandomFramesNoDroppingBackup) {
462 char buffer[10]; 440 char buffer[10];
463 iovec iov[2]; 441 iovec iov[2];
464 iov[0].iov_base = &buffer[0]; 442 iov[0].iov_base = &buffer[0];
465 iov[0].iov_len = 5; 443 iov[0].iov_len = 5;
466 iov[1].iov_base = &buffer[5]; 444 iov[1].iov_base = &buffer[5];
467 iov[1].iov_len = 5; 445 iov[1].iov_len = 5;
468 446
469 EXPECT_CALL(stream_, OnDataAvailable()).Times(AnyNumber()); 447 EXPECT_CALL(stream_, OnDataAvailable()).Times(AnyNumber());
470 448
471 while (output_.size() != arraysize(kPayload) - 1) { 449 while (output_.size() != arraysize(kPayload) - 1) {
(...skipping 25 matching lines...) Expand all
497 int bytes_read = sequencer_->Readv(iov, 2); 475 int bytes_read = sequencer_->Readv(iov, 2);
498 output_.append(buffer, bytes_read); 476 output_.append(buffer, bytes_read);
499 ASSERT_EQ(output_.size(), peeked_.size()); 477 ASSERT_EQ(output_.size(), peeked_.size());
500 } 478 }
501 } 479 }
502 EXPECT_EQ(string(kPayload), output_); 480 EXPECT_EQ(string(kPayload), output_);
503 EXPECT_EQ(string(kPayload), peeked_); 481 EXPECT_EQ(string(kPayload), peeked_);
504 } 482 }
505 483
506 // Same as above, just using a different method for reading. 484 // Same as above, just using a different method for reading.
507 TEST_P(QuicStreamSequencerTest, MarkConsumed) { 485 TEST_F(QuicStreamSequencerTest, MarkConsumed) {
508 InSequence s; 486 InSequence s;
509 EXPECT_CALL(stream_, OnDataAvailable()); 487 EXPECT_CALL(stream_, OnDataAvailable());
510 488
511 OnFrame(0, "abc"); 489 OnFrame(0, "abc");
512 OnFrame(3, "def"); 490 OnFrame(3, "def");
513 OnFrame(6, "ghi"); 491 OnFrame(6, "ghi");
514 492
515 // abcdefghi buffered. 493 // abcdefghi buffered.
516 EXPECT_EQ(9u, sequencer_->NumBytesBuffered()); 494 EXPECT_EQ(9u, sequencer_->NumBytesBuffered());
517 495
518 // Peek into the data. 496 // Peek into the data.
519 vector<string> expected; 497 vector<string> expected = {"abcdefghi"};
520 if (FLAGS_quic_use_stream_sequencer_buffer) {
521 expected = vector<string>{"abcdefghi"};
522 } else {
523 expected = vector<string>{"abc", "def", "ghi"};
524 }
525 ASSERT_TRUE(VerifyReadableRegions(expected)); 498 ASSERT_TRUE(VerifyReadableRegions(expected));
526 499
527 // Consume 1 byte. 500 // Consume 1 byte.
528 sequencer_->MarkConsumed(1); 501 sequencer_->MarkConsumed(1);
529 EXPECT_EQ(1u, stream_.flow_controller()->bytes_consumed()); 502 EXPECT_EQ(1u, stream_.flow_controller()->bytes_consumed());
530 // Verify data. 503 // Verify data.
531 vector<string> expected2; 504 vector<string> expected2 = {"bcdefghi"};
532 if (FLAGS_quic_use_stream_sequencer_buffer) {
533 expected2 = vector<string>{"bcdefghi"};
534 } else {
535 expected2 = vector<string>{"bc", "def", "ghi"};
536 }
537 ASSERT_TRUE(VerifyReadableRegions(expected2)); 505 ASSERT_TRUE(VerifyReadableRegions(expected2));
538 EXPECT_EQ(8u, sequencer_->NumBytesBuffered()); 506 EXPECT_EQ(8u, sequencer_->NumBytesBuffered());
539 507
540 // Consume 2 bytes. 508 // Consume 2 bytes.
541 sequencer_->MarkConsumed(2); 509 sequencer_->MarkConsumed(2);
542 EXPECT_EQ(3u, stream_.flow_controller()->bytes_consumed()); 510 EXPECT_EQ(3u, stream_.flow_controller()->bytes_consumed());
543 // Verify data. 511 // Verify data.
544 vector<string> expected3; 512 vector<string> expected3 = {"defghi"};
545 if (FLAGS_quic_use_stream_sequencer_buffer) {
546 expected3 = vector<string>{"defghi"};
547 } else {
548 expected3 = vector<string>{"def", "ghi"};
549 }
550 ASSERT_TRUE(VerifyReadableRegions(expected3)); 513 ASSERT_TRUE(VerifyReadableRegions(expected3));
551 EXPECT_EQ(6u, sequencer_->NumBytesBuffered()); 514 EXPECT_EQ(6u, sequencer_->NumBytesBuffered());
552 515
553 // Consume 5 bytes. 516 // Consume 5 bytes.
554 sequencer_->MarkConsumed(5); 517 sequencer_->MarkConsumed(5);
555 EXPECT_EQ(8u, stream_.flow_controller()->bytes_consumed()); 518 EXPECT_EQ(8u, stream_.flow_controller()->bytes_consumed());
556 // Verify data. 519 // Verify data.
557 vector<string> expected4{"i"}; 520 vector<string> expected4{"i"};
558 ASSERT_TRUE(VerifyReadableRegions(expected4)); 521 ASSERT_TRUE(VerifyReadableRegions(expected4));
559 EXPECT_EQ(1u, sequencer_->NumBytesBuffered()); 522 EXPECT_EQ(1u, sequencer_->NumBytesBuffered());
560 } 523 }
561 524
562 TEST_P(QuicStreamSequencerTest, MarkConsumedError) { 525 TEST_F(QuicStreamSequencerTest, MarkConsumedError) {
563 EXPECT_CALL(stream_, OnDataAvailable()); 526 EXPECT_CALL(stream_, OnDataAvailable());
564 527
565 OnFrame(0, "abc"); 528 OnFrame(0, "abc");
566 OnFrame(9, "jklmnopqrstuvwxyz"); 529 OnFrame(9, "jklmnopqrstuvwxyz");
567 530
568 // Peek into the data. Only the first chunk should be readable because of the 531 // Peek into the data. Only the first chunk should be readable because of the
569 // missing data. 532 // missing data.
570 vector<string> expected{"abc"}; 533 vector<string> expected{"abc"};
571 ASSERT_TRUE(VerifyReadableRegions(expected)); 534 ASSERT_TRUE(VerifyReadableRegions(expected));
572 535
573 // Now, attempt to mark consumed more data than was readable and expect the 536 // Now, attempt to mark consumed more data than was readable and expect the
574 // stream to be closed. 537 // stream to be closed.
575 EXPECT_CALL(stream_, Reset(QUIC_ERROR_PROCESSING_STREAM)); 538 EXPECT_CALL(stream_, Reset(QUIC_ERROR_PROCESSING_STREAM));
576 EXPECT_DFATAL(sequencer_->MarkConsumed(4), 539 EXPECT_DFATAL(sequencer_->MarkConsumed(4),
577 "Invalid argument to MarkConsumed." 540 "Invalid argument to MarkConsumed."
578 " expect to consume: 4, but not enough bytes available."); 541 " expect to consume: 4, but not enough bytes available.");
579 } 542 }
580 543
581 TEST_P(QuicStreamSequencerTest, MarkConsumedWithMissingPacket) { 544 TEST_F(QuicStreamSequencerTest, MarkConsumedWithMissingPacket) {
582 InSequence s; 545 InSequence s;
583 EXPECT_CALL(stream_, OnDataAvailable()); 546 EXPECT_CALL(stream_, OnDataAvailable());
584 547
585 OnFrame(0, "abc"); 548 OnFrame(0, "abc");
586 OnFrame(3, "def"); 549 OnFrame(3, "def");
587 // Missing packet: 6, ghi. 550 // Missing packet: 6, ghi.
588 OnFrame(9, "jkl"); 551 OnFrame(9, "jkl");
589 552
590 vector<string> expected; 553 vector<string> expected = {"abcdef"};
591 if (FLAGS_quic_use_stream_sequencer_buffer) {
592 expected = vector<string>{"abcdef"};
593 } else {
594 expected = vector<string>{"abc", "def"};
595 }
596 ASSERT_TRUE(VerifyReadableRegions(expected)); 554 ASSERT_TRUE(VerifyReadableRegions(expected));
597 555
598 sequencer_->MarkConsumed(6); 556 sequencer_->MarkConsumed(6);
599 } 557 }
600 558
601 TEST(QuicFrameListTest, FrameOverlapsBufferedData) { 559 TEST(QuicFrameListTest, FrameOverlapsBufferedData) {
602 QuicFrameList buffer; 560 QuicFrameList buffer;
603 561
604 // Ensure that FrameOverlapsBufferedData returns appropriate responses when 562 // Ensure that FrameOverlapsBufferedData returns appropriate responses when
605 // there is existing data buffered. 563 // there is existing data buffered.
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
639 &buffer, 597 &buffer,
640 QuicStreamFrame(1, false, kBufferedOffset - kNewDataLength, data))); 598 QuicStreamFrame(1, false, kBufferedOffset - kNewDataLength, data)));
641 599
642 // New byte range entirely outside of buffered frames, start offset later than 600 // New byte range entirely outside of buffered frames, start offset later than
643 // buffered frame. 601 // buffered frame.
644 EXPECT_FALSE(QuicStreamSequencerPeer::FrameOverlapsBufferedData( 602 EXPECT_FALSE(QuicStreamSequencerPeer::FrameOverlapsBufferedData(
645 &buffer, 603 &buffer,
646 QuicStreamFrame(1, false, kBufferedOffset + kBufferedDataLength, data))); 604 QuicStreamFrame(1, false, kBufferedOffset + kBufferedDataLength, data)));
647 } 605 }
648 606
649 TEST_P(QuicStreamSequencerTest, DontAcceptOverlappingFrames) { 607 TEST_F(QuicStreamSequencerTest, DontAcceptOverlappingFrames) {
650 // The peer should never send us non-identical stream frames which contain 608 // The peer should never send us non-identical stream frames which contain
651 // overlapping byte ranges - if they do, we close the connection. 609 // overlapping byte ranges - if they do, we close the connection.
652 610
653 QuicStreamFrame frame1(kClientDataStreamId1, false, 1, StringPiece("hello")); 611 QuicStreamFrame frame1(kClientDataStreamId1, false, 1, StringPiece("hello"));
654 sequencer_->OnStreamFrame(frame1); 612 sequencer_->OnStreamFrame(frame1);
655 613
656 QuicStreamFrame frame2(kClientDataStreamId1, false, 2, StringPiece("hello")); 614 QuicStreamFrame frame2(kClientDataStreamId1, false, 2, StringPiece("hello"));
657 EXPECT_CALL(stream_, CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _)) 615 EXPECT_CALL(stream_, CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _))
658 .Times(1); 616 .Times(1);
659 sequencer_->OnStreamFrame(frame2); 617 sequencer_->OnStreamFrame(frame2);
660 } 618 }
661 619
662 TEST_P(QuicStreamSequencerTest, InOrderTimestamps) { 620 TEST_F(QuicStreamSequencerTest, InOrderTimestamps) {
663 // This test verifies that timestamps returned by 621 // This test verifies that timestamps returned by
664 // GetReadableRegion() are in the correct sequence when frames 622 // GetReadableRegion() are in the correct sequence when frames
665 // arrive at the sequencer in order. 623 // arrive at the sequencer in order.
666 EXPECT_CALL(stream_, OnDataAvailable()); 624 EXPECT_CALL(stream_, OnDataAvailable());
667 625
668 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); 626 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1));
669 627
670 // Buffer the first frame. 628 // Buffer the first frame.
671 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); 629 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1));
672 QuicTime t1 = clock_.ApproximateNow(); 630 QuicTime t1 = clock_.ApproximateNow();
(...skipping 20 matching lines...) Expand all
693 EXPECT_EQ(3u, sequencer_->NumBytesBuffered()); 651 EXPECT_EQ(3u, sequencer_->NumBytesBuffered());
694 652
695 EXPECT_TRUE(sequencer_->GetReadableRegion(iovecs, &timestamp)); 653 EXPECT_TRUE(sequencer_->GetReadableRegion(iovecs, &timestamp));
696 EXPECT_EQ(timestamp, t2); 654 EXPECT_EQ(timestamp, t2);
697 QuicStreamSequencerTest::ConsumeData(3); 655 QuicStreamSequencerTest::ConsumeData(3);
698 EXPECT_EQ(0u, NumBufferedBytes()); 656 EXPECT_EQ(0u, NumBufferedBytes());
699 EXPECT_EQ(6u, sequencer_->NumBytesConsumed()); 657 EXPECT_EQ(6u, sequencer_->NumBytesConsumed());
700 EXPECT_EQ(0u, sequencer_->NumBytesBuffered()); 658 EXPECT_EQ(0u, sequencer_->NumBytesBuffered());
701 } 659 }
702 660
703 TEST_P(QuicStreamSequencerTest, OutOfOrderTimestamps) { 661 TEST_F(QuicStreamSequencerTest, OutOfOrderTimestamps) {
704 // This test verifies that timestamps returned by 662 // This test verifies that timestamps returned by
705 // GetReadableRegion() are in the correct sequence when frames 663 // GetReadableRegion() are in the correct sequence when frames
706 // arrive at the sequencer out of order. 664 // arrive at the sequencer out of order.
707 EXPECT_CALL(stream_, OnDataAvailable()); 665 EXPECT_CALL(stream_, OnDataAvailable());
708 666
709 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); 667 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1));
710 668
711 // Buffer the first frame 669 // Buffer the first frame
712 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); 670 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1));
713 QuicTime t1 = clock_.ApproximateNow(); 671 QuicTime t1 = clock_.ApproximateNow();
(...skipping 23 matching lines...) Expand all
737 EXPECT_EQ(timestamp, t1); 695 EXPECT_EQ(timestamp, t1);
738 QuicStreamSequencerTest::ConsumeData(3); 696 QuicStreamSequencerTest::ConsumeData(3);
739 EXPECT_EQ(0u, NumBufferedBytes()); 697 EXPECT_EQ(0u, NumBufferedBytes());
740 EXPECT_EQ(6u, sequencer_->NumBytesConsumed()); 698 EXPECT_EQ(6u, sequencer_->NumBytesConsumed());
741 EXPECT_EQ(0u, sequencer_->NumBytesBuffered()); 699 EXPECT_EQ(0u, sequencer_->NumBytesBuffered());
742 } 700 }
743 701
744 } // namespace 702 } // namespace
745 } // namespace test 703 } // namespace test
746 } // namespace net 704 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_stream_sequencer.cc ('k') | net/quic/test_tools/quic_stream_sequencer_peer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698