OLD | NEW |
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 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
355 const char* expected3[] = {"def", "ghi"}; | 355 const char* expected3[] = {"def", "ghi"}; |
356 ASSERT_TRUE(VerifyReadableRegions(expected3, arraysize(expected3))); | 356 ASSERT_TRUE(VerifyReadableRegions(expected3, arraysize(expected3))); |
357 | 357 |
358 // Consume 5 bytes. | 358 // Consume 5 bytes. |
359 sequencer_->MarkConsumed(5); | 359 sequencer_->MarkConsumed(5); |
360 // Verify data. | 360 // Verify data. |
361 const char* expected4[] = {"i"}; | 361 const char* expected4[] = {"i"}; |
362 ASSERT_TRUE(VerifyReadableRegions(expected4, arraysize(expected4))); | 362 ASSERT_TRUE(VerifyReadableRegions(expected4, arraysize(expected4))); |
363 } | 363 } |
364 | 364 |
365 TEST_F(QuicStreamSequencerTest, BasicCloseOrdered) { | 365 TEST_F(QuicStreamSequencerTest, BasicHalfCloseOrdered) { |
366 InSequence s; | |
367 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); | |
368 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3)); | |
369 | |
370 EXPECT_CALL(stream_, TerminateFromPeer(false)); | |
371 sequencer_->CloseStreamAtOffset(3, false); | |
372 EXPECT_EQ(3u, sequencer_->close_offset()); | |
373 } | |
374 | |
375 TEST_F(QuicStreamSequencerTest, BasicHalfOrdered) { | |
376 InSequence s; | 366 InSequence s; |
377 | 367 |
378 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); | 368 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); |
379 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3)); | 369 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3)); |
380 | 370 |
381 EXPECT_CALL(stream_, TerminateFromPeer(true)); | 371 EXPECT_CALL(stream_, TerminateFromPeer(true)); |
382 sequencer_->CloseStreamAtOffset(3, true); | 372 sequencer_->CloseStreamAtOffset(3); |
383 EXPECT_EQ(3u, sequencer_->close_offset()); | 373 EXPECT_EQ(3u, sequencer_->close_offset()); |
384 } | 374 } |
385 | 375 |
386 TEST_F(QuicStreamSequencerTest, BasicCloseUnordered) { | 376 TEST_F(QuicStreamSequencerTest, BasicHalfCloseUnorderedWithFlush) { |
387 sequencer_->CloseStreamAtOffset(3, false); | 377 sequencer_->CloseStreamAtOffset(6); |
388 EXPECT_EQ(3u, sequencer_->close_offset()); | |
389 | |
390 InSequence s; | |
391 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); | |
392 EXPECT_CALL(stream_, TerminateFromPeer(false)); | |
393 | |
394 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3)); | |
395 } | |
396 | |
397 TEST_F(QuicStreamSequencerTest, BasicHalfUnorderedWithFlush) { | |
398 sequencer_->CloseStreamAtOffset(6, true); | |
399 EXPECT_EQ(6u, sequencer_->close_offset()); | 378 EXPECT_EQ(6u, sequencer_->close_offset()); |
400 InSequence s; | 379 InSequence s; |
401 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); | 380 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); |
402 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(3)); | 381 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(3)); |
403 EXPECT_CALL(stream_, TerminateFromPeer(true)); | 382 EXPECT_CALL(stream_, TerminateFromPeer(true)); |
404 | 383 |
405 EXPECT_TRUE(sequencer_->OnFrame(3, "def", 3)); | 384 EXPECT_TRUE(sequencer_->OnFrame(3, "def", 3)); |
406 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3)); | 385 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3)); |
407 } | 386 } |
408 | 387 |
409 TEST_F(QuicStreamSequencerTest, BasicCloseUnorderedWithFlush) { | |
410 sequencer_->CloseStreamAtOffset(6, false); | |
411 EXPECT_EQ(6u, sequencer_->close_offset()); | |
412 | |
413 InSequence s; | |
414 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); | |
415 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(3)); | |
416 EXPECT_CALL(stream_, TerminateFromPeer(false)); | |
417 | |
418 EXPECT_TRUE(sequencer_->OnFrame(3, "def", 3)); | |
419 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3)); | |
420 } | |
421 | |
422 TEST_F(QuicStreamSequencerTest, BasicHalfUnordered) { | 388 TEST_F(QuicStreamSequencerTest, BasicHalfUnordered) { |
423 sequencer_->CloseStreamAtOffset(3, true); | 389 sequencer_->CloseStreamAtOffset(3); |
424 EXPECT_EQ(3u, sequencer_->close_offset()); | 390 EXPECT_EQ(3u, sequencer_->close_offset()); |
425 InSequence s; | 391 InSequence s; |
426 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); | 392 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); |
427 EXPECT_CALL(stream_, TerminateFromPeer(true)); | 393 EXPECT_CALL(stream_, TerminateFromPeer(true)); |
428 | 394 |
429 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3)); | 395 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3)); |
430 } | 396 } |
431 | 397 |
432 TEST_F(QuicStreamSequencerTest, TerminateStreamBeforeCloseEqual) { | |
433 sequencer_->CloseStreamAtOffset(3, true); | |
434 EXPECT_EQ(3u, sequencer_->close_offset()); | |
435 | |
436 sequencer_->CloseStreamAtOffset(3, false); | |
437 EXPECT_EQ(3u, sequencer_->close_offset()); | |
438 | |
439 InSequence s; | |
440 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); | |
441 EXPECT_CALL(stream_, TerminateFromPeer(false)); | |
442 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3)); | |
443 } | |
444 | |
445 TEST_F(QuicStreamSequencerTest, CloseBeforeTermianteEqual) { | |
446 sequencer_->CloseStreamAtOffset(3, false); | |
447 EXPECT_EQ(3u, sequencer_->close_offset()); | |
448 | |
449 sequencer_->CloseStreamAtOffset(3, true); | |
450 EXPECT_EQ(3u, sequencer_->close_offset()); | |
451 | |
452 InSequence s; | |
453 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); | |
454 EXPECT_CALL(stream_, TerminateFromPeer(false)); | |
455 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3)); | |
456 } | |
457 | |
458 TEST_F(QuicStreamSequencerTest, TerminateWithReadv) { | 398 TEST_F(QuicStreamSequencerTest, TerminateWithReadv) { |
459 char buffer[3]; | 399 char buffer[3]; |
460 | 400 |
461 sequencer_->CloseStreamAtOffset(3, true); | 401 sequencer_->CloseStreamAtOffset(3); |
462 EXPECT_EQ(3u, sequencer_->close_offset()); | 402 EXPECT_EQ(3u, sequencer_->close_offset()); |
463 | 403 |
464 EXPECT_FALSE(sequencer_->IsHalfClosed()); | 404 EXPECT_FALSE(sequencer_->IsHalfClosed()); |
465 | 405 |
466 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(0)); | 406 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(0)); |
467 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3)); | 407 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3)); |
468 | 408 |
469 iovec iov = { &buffer[0], 3 }; | 409 iovec iov = { &buffer[0], 3 }; |
470 int bytes_read = sequencer_->Readv(&iov, 1); | 410 int bytes_read = sequencer_->Readv(&iov, 1); |
471 EXPECT_EQ(3, bytes_read); | 411 EXPECT_EQ(3, bytes_read); |
472 EXPECT_TRUE(sequencer_->IsHalfClosed()); | 412 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 } | 413 } |
493 | 414 |
494 TEST_F(QuicStreamSequencerTest, MutipleOffsets) { | 415 TEST_F(QuicStreamSequencerTest, MutipleOffsets) { |
495 sequencer_->CloseStreamAtOffset(3, false); | 416 sequencer_->CloseStreamAtOffset(3); |
496 EXPECT_EQ(3u, sequencer_->close_offset()); | 417 EXPECT_EQ(3u, sequencer_->close_offset()); |
497 | 418 |
498 EXPECT_CALL(stream_, Close(QUIC_MULTIPLE_TERMINATION_OFFSETS)); | 419 EXPECT_CALL(stream_, Close(QUIC_MULTIPLE_TERMINATION_OFFSETS)); |
499 sequencer_->CloseStreamAtOffset(5, false); | 420 sequencer_->CloseStreamAtOffset(5); |
500 EXPECT_EQ(3u, sequencer_->close_offset()); | 421 EXPECT_EQ(3u, sequencer_->close_offset()); |
501 | 422 |
502 EXPECT_CALL(stream_, Close(QUIC_MULTIPLE_TERMINATION_OFFSETS)); | 423 EXPECT_CALL(stream_, Close(QUIC_MULTIPLE_TERMINATION_OFFSETS)); |
503 sequencer_->CloseStreamAtOffset(1, false); | 424 sequencer_->CloseStreamAtOffset(1); |
504 EXPECT_EQ(3u, sequencer_->close_offset()); | 425 EXPECT_EQ(3u, sequencer_->close_offset()); |
505 | 426 |
506 sequencer_->CloseStreamAtOffset(3, false); | 427 sequencer_->CloseStreamAtOffset(3); |
507 EXPECT_EQ(3u, sequencer_->close_offset()); | 428 EXPECT_EQ(3u, sequencer_->close_offset()); |
508 } | 429 } |
509 | 430 |
510 class QuicSequencerRandomTest : public QuicStreamSequencerTest { | 431 class QuicSequencerRandomTest : public QuicStreamSequencerTest { |
511 public: | 432 public: |
512 typedef pair<int, string> Frame; | 433 typedef pair<int, string> Frame; |
513 typedef vector<Frame> FrameList; | 434 typedef vector<Frame> FrameList; |
514 | 435 |
515 void CreateFrames() { | 436 void CreateFrames() { |
516 int payload_size = arraysize(kPayload) - 1; | 437 int payload_size = arraysize(kPayload) - 1; |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
586 list_[index].second.size()); | 507 list_[index].second.size()); |
587 if (acked) { | 508 if (acked) { |
588 list_.erase(list_.begin() + index); | 509 list_.erase(list_.begin() + index); |
589 } | 510 } |
590 } | 511 } |
591 } | 512 } |
592 | 513 |
593 } // namespace | 514 } // namespace |
594 } // namespace test | 515 } // namespace test |
595 } // namespace net | 516 } // namespace net |
OLD | NEW |