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

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

Issue 14651009: Land Recent QUIC changes (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix integer constant is too large for 'unsigned long' type Created 7 years, 7 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 | Annotate | Revision Log
« no previous file with comments | « net/quic/quic_stream_sequencer.cc ('k') | net/quic/quic_utils.h » ('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/rand_util.h" 10 #include "base/rand_util.h"
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
73 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 73 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
74 74
75 class QuicStreamSequencerTest : public ::testing::Test { 75 class QuicStreamSequencerTest : public ::testing::Test {
76 protected: 76 protected:
77 QuicStreamSequencerTest() 77 QuicStreamSequencerTest()
78 : session_(NULL), 78 : session_(NULL),
79 stream_(session_, 1), 79 stream_(session_, 1),
80 sequencer_(new QuicStreamSequencerPeer(&stream_)) { 80 sequencer_(new QuicStreamSequencerPeer(&stream_)) {
81 } 81 }
82 82
83 bool VerifyReadableRegions(const char** expected, size_t num_expected) {
84 iovec iovecs[5];
85 size_t num_iovecs = sequencer_->GetReadableRegions(iovecs,
86 arraysize(iovecs));
87 return VerifyIovecs(iovecs, num_iovecs, expected, num_expected);
88 }
89
90 bool VerifyIovecs(iovec* iovecs,
91 size_t num_iovecs,
92 const char** expected,
93 size_t num_expected) {
94 if (num_expected != num_iovecs) {
95 LOG(ERROR) << "Incorrect number of iovecs. Expected: "
96 << num_expected << " Actual: " << num_iovecs;
97 return false;
98 }
99 for (size_t i = 0; i < num_expected; ++i) {
100 if (!VerifyIovec(iovecs[i], expected[i])) {
101 return false;
102 }
103 }
104 return true;
105 }
106
107 bool VerifyIovec(const iovec& iovec, StringPiece expected) {
108 if (iovec.iov_len != expected.length()) {
109 LOG(ERROR) << "Invalid length: " << iovec.iov_len
110 << " vs " << expected.length();
111 return false;
112 }
113 if (memcmp(iovec.iov_base, expected.data(), expected.length()) != 0) {
114 LOG(ERROR) << "Invalid data: " << static_cast<char*>(iovec.iov_base)
115 << " vs " << expected.data();
116 return false;
117 }
118 return true;
119 }
120
83 QuicSession* session_; 121 QuicSession* session_;
84 testing::StrictMock<MockStream> stream_; 122 testing::StrictMock<MockStream> stream_;
85 scoped_ptr<QuicStreamSequencerPeer> sequencer_; 123 scoped_ptr<QuicStreamSequencerPeer> sequencer_;
86 }; 124 };
87 125
88 TEST_F(QuicStreamSequencerTest, RejectOldFrame) { 126 TEST_F(QuicStreamSequencerTest, RejectOldFrame) {
89 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)) 127 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3))
90 .WillOnce(Return(3)); 128 .WillOnce(Return(3));
91 129
92 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3)); 130 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3));
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
204 242
205 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(3)); 243 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(3));
206 EXPECT_CALL(stream_, ProcessData(StrEq("ghi"), 3)).WillOnce(Return(3)); 244 EXPECT_CALL(stream_, ProcessData(StrEq("ghi"), 3)).WillOnce(Return(3));
207 EXPECT_CALL(stream_, ProcessData(StrEq("jkl"), 3)).WillOnce(Return(3)); 245 EXPECT_CALL(stream_, ProcessData(StrEq("jkl"), 3)).WillOnce(Return(3));
208 246
209 EXPECT_TRUE(sequencer_->OnFrame(3, "def", 3)); 247 EXPECT_TRUE(sequencer_->OnFrame(3, "def", 3));
210 EXPECT_EQ(12u, sequencer_->num_bytes_consumed()); 248 EXPECT_EQ(12u, sequencer_->num_bytes_consumed());
211 EXPECT_EQ(0u, sequencer_->frames()->size()); 249 EXPECT_EQ(0u, sequencer_->frames()->size());
212 } 250 }
213 251
252 TEST_F(QuicStreamSequencerTest, OutOfOrderFramesBlockignWithReadv) {
253 sequencer_->SetMemoryLimit(9);
254 char buffer[20];
255 iovec iov[2];
256 iov[0].iov_base = &buffer[0];
257 iov[0].iov_len = 1;
258 iov[1].iov_base = &buffer[1];
259 iov[1].iov_len = 2;
260
261 // Push abc - process.
262 // Push jkl - buffer (not next data)
263 // Push def - don't process.
264 // Push mno - drop (too far out)
265 // Push ghi - buffer (def not processed)
266 // Read 2.
267 // Push mno - buffer (not all read)
268 // Read all
269 // Push pqr - process
270
271 InSequence s;
272 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
273 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(0));
274 EXPECT_CALL(stream_, ProcessData(StrEq("pqr"), 3)).WillOnce(Return(3));
275
276 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3));
277 EXPECT_TRUE(sequencer_->OnFrame(3, "def", 3));
278 EXPECT_TRUE(sequencer_->OnFrame(9, "jkl", 3));
279 EXPECT_FALSE(sequencer_->OnFrame(12, "mno", 3));
280 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi", 3));
281
282 // Read 3 bytes.
283 EXPECT_EQ(3, sequencer_->Readv(iov, 2));
284 EXPECT_EQ(0, strncmp(buffer, "def", 3));
285
286 // Now we have space to bufer this.
287 EXPECT_TRUE(sequencer_->OnFrame(12, "mno", 3));
288
289 // Read the remaining 9 bytes.
290 iov[1].iov_len = 19;
291 EXPECT_EQ(9, sequencer_->Readv(iov, 2));
292 EXPECT_EQ(0, strncmp(buffer, "ghijklmno", 9));
293
294 EXPECT_TRUE(sequencer_->OnFrame(15, "pqr", 3));
295 }
296
297 // Same as above, just using a different method for reading.
298 TEST_F(QuicStreamSequencerTest, OutOfOrderFramesBlockignWithGetReadableRegion) {
299 sequencer_->SetMemoryLimit(9);
300
301 InSequence s;
302 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
303 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(0));
304 EXPECT_CALL(stream_, ProcessData(StrEq("pqr"), 3)).WillOnce(Return(3));
305
306 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3));
307 EXPECT_TRUE(sequencer_->OnFrame(3, "def", 3));
308 EXPECT_TRUE(sequencer_->OnFrame(9, "jkl", 3));
309 EXPECT_FALSE(sequencer_->OnFrame(12, "mno", 3));
310 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi", 3));
311
312 // Read 3 bytes.
313 const char* expected[] = {"def", "ghi", "jkl"};
314 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected)));
315 char buffer[9];
316 iovec read_iov = { &buffer[0], 3 };
317 ASSERT_EQ(3, sequencer_->Readv(&read_iov, 1));
318
319 // Now we have space to bufer this.
320 EXPECT_TRUE(sequencer_->OnFrame(12, "mno", 3));
321
322 // Read the remaining 9 bytes.
323 const char* expected2[] = {"ghi", "jkl", "mno"};
324 ASSERT_TRUE(VerifyReadableRegions(expected2, arraysize(expected2)));
325 read_iov.iov_len = 9;
326 ASSERT_EQ(9, sequencer_->Readv(&read_iov, 1));
327
328 EXPECT_TRUE(sequencer_->OnFrame(15, "pqr", 3));
329 }
330
331 // Same as above, just using a different method for reading.
332 TEST_F(QuicStreamSequencerTest, MarkConsumed) {
333 sequencer_->SetMemoryLimit(9);
334
335 InSequence s;
336 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(0));
337
338 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3));
339 EXPECT_TRUE(sequencer_->OnFrame(3, "def", 3));
340 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi", 3));
341
342 // Peek into the data.
343 const char* expected[] = {"abc", "def", "ghi"};
344 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected)));
345
346 // Consume 1 byte.
347 sequencer_->MarkConsumed(1);
348 // Verify data.
349 const char* expected2[] = {"bc", "def", "ghi"};
350 ASSERT_TRUE(VerifyReadableRegions(expected2, arraysize(expected2)));
351
352 // Consume 2 bytes.
353 sequencer_->MarkConsumed(2);
354 // Verify data.
355 const char* expected3[] = {"def", "ghi"};
356 ASSERT_TRUE(VerifyReadableRegions(expected3, arraysize(expected3)));
357
358 // Consume 5 bytes.
359 sequencer_->MarkConsumed(5);
360 // Verify data.
361 const char* expected4[] = {"i"};
362 ASSERT_TRUE(VerifyReadableRegions(expected4, arraysize(expected4)));
363 }
364
214 TEST_F(QuicStreamSequencerTest, BasicCloseOrdered) { 365 TEST_F(QuicStreamSequencerTest, BasicCloseOrdered) {
215 InSequence s; 366 InSequence s;
216 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); 367 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
217 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3)); 368 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3));
218 369
219 EXPECT_CALL(stream_, TerminateFromPeer(false)); 370 EXPECT_CALL(stream_, TerminateFromPeer(false));
220 sequencer_->CloseStreamAtOffset(3, false); 371 sequencer_->CloseStreamAtOffset(3, false);
221 EXPECT_EQ(3u, sequencer_->close_offset()); 372 EXPECT_EQ(3u, sequencer_->close_offset());
222 } 373 }
223 374
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 448
298 sequencer_->CloseStreamAtOffset(3, true); 449 sequencer_->CloseStreamAtOffset(3, true);
299 EXPECT_EQ(3u, sequencer_->close_offset()); 450 EXPECT_EQ(3u, sequencer_->close_offset());
300 451
301 InSequence s; 452 InSequence s;
302 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); 453 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
303 EXPECT_CALL(stream_, TerminateFromPeer(false)); 454 EXPECT_CALL(stream_, TerminateFromPeer(false));
304 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3)); 455 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3));
305 } 456 }
306 457
458 TEST_F(QuicStreamSequencerTest, TerminateWithReadv) {
459 char buffer[3];
460
461 sequencer_->CloseStreamAtOffset(3, true);
462 EXPECT_EQ(3u, sequencer_->close_offset());
463
464 EXPECT_FALSE(sequencer_->IsHalfClosed());
465
466 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(0));
467 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3));
468
469 iovec iov = { &buffer[0], 3 };
470 int bytes_read = sequencer_->Readv(&iov, 1);
471 EXPECT_EQ(3, bytes_read);
472 EXPECT_TRUE(sequencer_->IsHalfClosed());
473 EXPECT_FALSE(sequencer_->IsClosed());
474 }
475
476 TEST_F(QuicStreamSequencerTest, CloseWithReadv) {
477 char buffer[3];
478
479 sequencer_->CloseStreamAtOffset(3, false);
480 EXPECT_EQ(3u, sequencer_->close_offset());
481
482 EXPECT_FALSE(sequencer_->IsClosed());
483
484 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(0));
485 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3));
486
487 iovec iov = { &buffer[0], 3 };
488 int bytes_read = sequencer_->Readv(&iov, 1);
489 EXPECT_EQ(3, bytes_read);
490 EXPECT_TRUE(sequencer_->IsHalfClosed());
491 EXPECT_TRUE(sequencer_->IsClosed());
492 }
493
307 TEST_F(QuicStreamSequencerTest, MutipleOffsets) { 494 TEST_F(QuicStreamSequencerTest, MutipleOffsets) {
308 sequencer_->CloseStreamAtOffset(3, false); 495 sequencer_->CloseStreamAtOffset(3, false);
309 EXPECT_EQ(3u, sequencer_->close_offset()); 496 EXPECT_EQ(3u, sequencer_->close_offset());
310 497
311 EXPECT_CALL(stream_, Close(QUIC_MULTIPLE_TERMINATION_OFFSETS)); 498 EXPECT_CALL(stream_, Close(QUIC_MULTIPLE_TERMINATION_OFFSETS));
312 sequencer_->CloseStreamAtOffset(5, false); 499 sequencer_->CloseStreamAtOffset(5, false);
313 EXPECT_EQ(3u, sequencer_->close_offset()); 500 EXPECT_EQ(3u, sequencer_->close_offset());
314 501
315 EXPECT_CALL(stream_, Close(QUIC_MULTIPLE_TERMINATION_OFFSETS)); 502 EXPECT_CALL(stream_, Close(QUIC_MULTIPLE_TERMINATION_OFFSETS));
316 sequencer_->CloseStreamAtOffset(1, false); 503 sequencer_->CloseStreamAtOffset(1, false);
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
399 list_[index].second.size()); 586 list_[index].second.size());
400 if (acked) { 587 if (acked) {
401 list_.erase(list_.begin() + index); 588 list_.erase(list_.begin() + index);
402 } 589 }
403 } 590 }
404 } 591 }
405 592
406 } // namespace 593 } // namespace
407 } // namespace test 594 } // namespace test
408 } // namespace net 595 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_stream_sequencer.cc ('k') | net/quic/quic_utils.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698