| 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_packet_generator.h" | 5 #include "net/quic/quic_packet_generator.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "net/quic/crypto/crypto_protocol.h" | 9 #include "net/quic/crypto/crypto_protocol.h" |
| 10 #include "net/quic/crypto/null_encrypter.h" | 10 #include "net/quic/crypto/null_encrypter.h" |
| 11 #include "net/quic/crypto/quic_decrypter.h" | 11 #include "net/quic/crypto/quic_decrypter.h" |
| 12 #include "net/quic/crypto/quic_encrypter.h" | 12 #include "net/quic/crypto/quic_encrypter.h" |
| 13 #include "net/quic/quic_utils.h" | 13 #include "net/quic/quic_utils.h" |
| 14 #include "net/quic/test_tools/quic_packet_creator_peer.h" | 14 #include "net/quic/test_tools/quic_packet_creator_peer.h" |
| 15 #include "net/quic/test_tools/quic_packet_generator_peer.h" |
| 15 #include "net/quic/test_tools/quic_test_utils.h" | 16 #include "net/quic/test_tools/quic_test_utils.h" |
| 16 #include "net/quic/test_tools/simple_quic_framer.h" | 17 #include "net/quic/test_tools/simple_quic_framer.h" |
| 17 #include "testing/gmock/include/gmock/gmock.h" | 18 #include "testing/gmock/include/gmock/gmock.h" |
| 18 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
| 19 | 20 |
| 20 using base::StringPiece; | 21 using base::StringPiece; |
| 21 using std::string; | 22 using std::string; |
| 22 using testing::InSequence; | 23 using testing::InSequence; |
| 23 using testing::Return; | 24 using testing::Return; |
| 24 using testing::SaveArg; | 25 using testing::SaveArg; |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 104 class QuicPacketGeneratorTest : public ::testing::Test { | 105 class QuicPacketGeneratorTest : public ::testing::Test { |
| 105 protected: | 106 protected: |
| 106 QuicPacketGeneratorTest() | 107 QuicPacketGeneratorTest() |
| 107 : framer_(QuicSupportedVersions(), QuicTime::Zero(), false), | 108 : framer_(QuicSupportedVersions(), QuicTime::Zero(), false), |
| 108 creator_(42, &framer_, &random_, false), | 109 creator_(42, &framer_, &random_, false), |
| 109 generator_(&delegate_, NULL, &creator_), | 110 generator_(&delegate_, NULL, &creator_), |
| 110 packet_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), | 111 packet_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), |
| 111 packet2_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), | 112 packet2_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), |
| 112 packet3_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), | 113 packet3_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), |
| 113 packet4_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), | 114 packet4_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), |
| 114 packet5_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL) { | 115 packet5_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), |
| 116 packet6_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), |
| 117 packet7_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL) { |
| 115 } | 118 } |
| 116 | 119 |
| 117 ~QuicPacketGeneratorTest() { | 120 ~QuicPacketGeneratorTest() { |
| 118 delete packet_.packet; | 121 delete packet_.packet; |
| 119 delete packet_.retransmittable_frames; | 122 delete packet_.retransmittable_frames; |
| 120 delete packet2_.packet; | 123 delete packet2_.packet; |
| 121 delete packet2_.retransmittable_frames; | 124 delete packet2_.retransmittable_frames; |
| 122 delete packet3_.packet; | 125 delete packet3_.packet; |
| 123 delete packet3_.retransmittable_frames; | 126 delete packet3_.retransmittable_frames; |
| 124 delete packet4_.packet; | 127 delete packet4_.packet; |
| 125 delete packet4_.retransmittable_frames; | 128 delete packet4_.retransmittable_frames; |
| 126 delete packet5_.packet; | 129 delete packet5_.packet; |
| 127 delete packet5_.retransmittable_frames; | 130 delete packet5_.retransmittable_frames; |
| 131 delete packet6_.packet; |
| 132 delete packet6_.retransmittable_frames; |
| 133 delete packet7_.packet; |
| 134 delete packet7_.retransmittable_frames; |
| 128 } | 135 } |
| 129 | 136 |
| 130 QuicAckFrame* CreateAckFrame() { | 137 QuicAckFrame* CreateAckFrame() { |
| 131 // TODO(rch): Initialize this so it can be verified later. | 138 // TODO(rch): Initialize this so it can be verified later. |
| 132 return new QuicAckFrame(MakeAckFrame(0, 0)); | 139 return new QuicAckFrame(MakeAckFrame(0, 0)); |
| 133 } | 140 } |
| 134 | 141 |
| 135 QuicCongestionFeedbackFrame* CreateFeedbackFrame() { | 142 QuicCongestionFeedbackFrame* CreateFeedbackFrame() { |
| 136 QuicCongestionFeedbackFrame* frame = new QuicCongestionFeedbackFrame; | 143 QuicCongestionFeedbackFrame* frame = new QuicCongestionFeedbackFrame; |
| 137 frame->type = kFixRate; | 144 frame->type = kFixRate; |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 MockRandom random_; | 226 MockRandom random_; |
| 220 QuicPacketCreator creator_; | 227 QuicPacketCreator creator_; |
| 221 StrictMock<MockDelegate> delegate_; | 228 StrictMock<MockDelegate> delegate_; |
| 222 QuicPacketGenerator generator_; | 229 QuicPacketGenerator generator_; |
| 223 SimpleQuicFramer simple_framer_; | 230 SimpleQuicFramer simple_framer_; |
| 224 SerializedPacket packet_; | 231 SerializedPacket packet_; |
| 225 SerializedPacket packet2_; | 232 SerializedPacket packet2_; |
| 226 SerializedPacket packet3_; | 233 SerializedPacket packet3_; |
| 227 SerializedPacket packet4_; | 234 SerializedPacket packet4_; |
| 228 SerializedPacket packet5_; | 235 SerializedPacket packet5_; |
| 236 SerializedPacket packet6_; |
| 237 SerializedPacket packet7_; |
| 229 | 238 |
| 230 private: | 239 private: |
| 231 scoped_ptr<char[]> data_array_; | 240 scoped_ptr<char[]> data_array_; |
| 232 }; | 241 }; |
| 233 | 242 |
| 234 class MockDebugDelegate : public QuicPacketGenerator::DebugDelegate { | 243 class MockDebugDelegate : public QuicPacketGenerator::DebugDelegate { |
| 235 public: | 244 public: |
| 236 MOCK_METHOD1(OnFrameAddedToPacket, | 245 MOCK_METHOD1(OnFrameAddedToPacket, |
| 237 void(const QuicFrame&)); | 246 void(const QuicFrame&)); |
| 238 }; | 247 }; |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 433 | 442 |
| 434 PacketContents contents; | 443 PacketContents contents; |
| 435 contents.num_stream_frames = 2; | 444 contents.num_stream_frames = 2; |
| 436 CheckPacketContains(contents, packet_); | 445 CheckPacketContains(contents, packet_); |
| 437 } | 446 } |
| 438 | 447 |
| 439 TEST_F(QuicPacketGeneratorTest, ConsumeDataFEC) { | 448 TEST_F(QuicPacketGeneratorTest, ConsumeDataFEC) { |
| 440 delegate_.SetCanWriteAnything(); | 449 delegate_.SetCanWriteAnything(); |
| 441 | 450 |
| 442 // Send FEC every two packets. | 451 // Send FEC every two packets. |
| 443 EXPECT_TRUE(QuicPacketCreatorPeer::SwitchFecProtectionOn(&creator_, 2)); | 452 creator_.set_max_packets_per_fec_group(2); |
| 453 QuicPacketGeneratorPeer::MaybeStartFecProtection(&generator_); |
| 444 | 454 |
| 445 { | 455 { |
| 446 InSequence dummy; | 456 InSequence dummy; |
| 447 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 457 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 448 DoAll(SaveArg<0>(&packet_), Return(true))); | 458 DoAll(SaveArg<0>(&packet_), Return(true))); |
| 449 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 459 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 450 DoAll(SaveArg<0>(&packet2_), Return(true))); | 460 DoAll(SaveArg<0>(&packet2_), Return(true))); |
| 451 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 461 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 452 DoAll(SaveArg<0>(&packet3_), Return(true))); | 462 DoAll(SaveArg<0>(&packet3_), Return(true))); |
| 453 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 463 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| (...skipping 15 matching lines...) Expand all Loading... |
| 469 CheckPacketIsFec(packet3_, 1); | 479 CheckPacketIsFec(packet3_, 1); |
| 470 | 480 |
| 471 CheckPacketHasSingleStreamFrame(packet4_); | 481 CheckPacketHasSingleStreamFrame(packet4_); |
| 472 CheckPacketIsFec(packet5_, 4); | 482 CheckPacketIsFec(packet5_, 4); |
| 473 } | 483 } |
| 474 | 484 |
| 475 TEST_F(QuicPacketGeneratorTest, ConsumeDataSendsFecAtEnd) { | 485 TEST_F(QuicPacketGeneratorTest, ConsumeDataSendsFecAtEnd) { |
| 476 delegate_.SetCanWriteAnything(); | 486 delegate_.SetCanWriteAnything(); |
| 477 | 487 |
| 478 // Send FEC every six packets. | 488 // Send FEC every six packets. |
| 479 EXPECT_TRUE(QuicPacketCreatorPeer::SwitchFecProtectionOn(&creator_, 6)); | 489 creator_.set_max_packets_per_fec_group(6); |
| 490 QuicPacketGeneratorPeer::MaybeStartFecProtection(&generator_); |
| 480 { | 491 { |
| 481 InSequence dummy; | 492 InSequence dummy; |
| 482 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 493 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 483 DoAll(SaveArg<0>(&packet_), Return(true))); | 494 DoAll(SaveArg<0>(&packet_), Return(true))); |
| 484 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 495 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 485 DoAll(SaveArg<0>(&packet2_), Return(true))); | 496 DoAll(SaveArg<0>(&packet2_), Return(true))); |
| 486 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 497 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 487 DoAll(SaveArg<0>(&packet3_), Return(true))); | 498 DoAll(SaveArg<0>(&packet3_), Return(true))); |
| 488 } | 499 } |
| 489 | 500 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 540 EXPECT_EQ(3u, consumed.bytes_consumed); | 551 EXPECT_EQ(3u, consumed.bytes_consumed); |
| 541 EXPECT_TRUE(consumed.fin_consumed); | 552 EXPECT_TRUE(consumed.fin_consumed); |
| 542 EXPECT_FALSE(generator_.HasQueuedFrames()); | 553 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 543 | 554 |
| 544 PacketContents contents; | 555 PacketContents contents; |
| 545 contents.num_stream_frames = 1; | 556 contents.num_stream_frames = 1; |
| 546 CheckPacketContains(contents, packet_); | 557 CheckPacketContains(contents, packet_); |
| 547 CheckPacketContains(contents, packet2_); | 558 CheckPacketContains(contents, packet2_); |
| 548 } | 559 } |
| 549 | 560 |
| 561 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOff) { |
| 562 delegate_.SetCanWriteAnything(); |
| 563 // Enable FEC. |
| 564 creator_.set_max_packets_per_fec_group(2); |
| 565 EXPECT_FALSE(creator_.IsFecProtected()); |
| 566 |
| 567 // Send one unprotected data packet. |
| 568 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 569 DoAll(SaveArg<0>(&packet_), Return(true))); |
| 570 QuicConsumedData consumed = |
| 571 generator_.ConsumeData(5, CreateData(1u), 0, true, NULL); |
| 572 EXPECT_EQ(1u, consumed.bytes_consumed); |
| 573 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 574 EXPECT_FALSE(creator_.IsFecProtected()); |
| 575 // Verify that one data packet was sent. |
| 576 PacketContents contents; |
| 577 contents.num_stream_frames = 1; |
| 578 CheckPacketContains(contents, packet_); |
| 579 |
| 580 // Turn on FEC protection. |
| 581 QuicPacketGeneratorPeer::MaybeStartFecProtection(&generator_); |
| 582 EXPECT_TRUE(creator_.IsFecProtected()); |
| 583 { |
| 584 InSequence dummy; |
| 585 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 586 DoAll(SaveArg<0>(&packet2_), Return(true))); |
| 587 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 588 DoAll(SaveArg<0>(&packet3_), Return(true))); |
| 589 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 590 DoAll(SaveArg<0>(&packet4_), Return(true))); |
| 591 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 592 DoAll(SaveArg<0>(&packet5_), Return(true))); |
| 593 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 594 DoAll(SaveArg<0>(&packet6_), Return(true))); |
| 595 } |
| 596 // Send enough data to create 3 packets. |
| 597 size_t data_len = 2 * kDefaultMaxPacketSize + 100; |
| 598 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, NULL); |
| 599 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 600 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 601 EXPECT_TRUE(creator_.IsFecProtected()); |
| 602 |
| 603 // Verify that two FEC packets were sent. |
| 604 CheckPacketHasSingleStreamFrame(packet2_); |
| 605 CheckPacketHasSingleStreamFrame(packet3_); |
| 606 CheckPacketIsFec(packet4_, /*fec_group=*/2u); |
| 607 CheckPacketHasSingleStreamFrame(packet5_); |
| 608 CheckPacketIsFec(packet6_, /*fec_group=*/5u); // Sent at the end of stream. |
| 609 |
| 610 // Turn off FEC protection and send one unprotected data packet. |
| 611 QuicPacketGeneratorPeer::MaybeStopFecProtection(&generator_, false); |
| 612 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 613 DoAll(SaveArg<0>(&packet7_), Return(true))); |
| 614 consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, NULL); |
| 615 EXPECT_EQ(1u, consumed.bytes_consumed); |
| 616 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 617 EXPECT_FALSE(creator_.IsFecProtected()); |
| 618 // Verify that one unprotected data packet was sent. |
| 619 CheckPacketContains(contents, packet7_); |
| 620 } |
| 621 |
| 622 TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFrameInCreator) { |
| 623 delegate_.SetCanWriteAnything(); |
| 624 // Enable FEC. |
| 625 creator_.set_max_packets_per_fec_group(2); |
| 626 |
| 627 generator_.StartBatchOperations(); |
| 628 // Queue enough data to prevent a stream frame with a non-zero offset from |
| 629 // fitting. |
| 630 QuicConsumedData consumed = generator_.ConsumeData(7, CreateData(1u), 0, |
| 631 true, NULL); |
| 632 EXPECT_EQ(1u, consumed.bytes_consumed); |
| 633 EXPECT_TRUE(creator_.HasPendingFrames()); |
| 634 |
| 635 // Turn on FEC protection. Should cause queued frames to be flushed. |
| 636 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 637 DoAll(SaveArg<0>(&packet_), Return(true))); |
| 638 EXPECT_FALSE(creator_.IsFecProtected()); |
| 639 QuicPacketGeneratorPeer::MaybeStartFecProtection(&generator_); |
| 640 CheckPacketHasSingleStreamFrame(packet_); |
| 641 EXPECT_TRUE(creator_.IsFecProtected()); |
| 642 } |
| 643 |
| 644 TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFramesInGenerator) { |
| 645 // Enable FEC. |
| 646 creator_.set_max_packets_per_fec_group(2); |
| 647 |
| 648 // Queue control frames in generator. |
| 649 delegate_.SetCanNotWrite(); |
| 650 generator_.SetShouldSendAck(true, true); |
| 651 delegate_.SetCanWriteAnything(); |
| 652 |
| 653 // Set up frames to write into the creator when control frames are written. |
| 654 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
| 655 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( |
| 656 Return(CreateFeedbackFrame())); |
| 657 EXPECT_CALL(delegate_, CreateStopWaitingFrame()).WillOnce( |
| 658 Return(CreateStopWaitingFrame())); |
| 659 |
| 660 // Generator should have queued control frames, and creator should be empty. |
| 661 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 662 EXPECT_FALSE(creator_.HasPendingFrames()); |
| 663 EXPECT_FALSE(creator_.IsFecProtected()); |
| 664 |
| 665 // Turn on FEC protection. Should cause queued control frames to be flushed. |
| 666 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 667 DoAll(SaveArg<0>(&packet_), Return(true))); |
| 668 QuicPacketGeneratorPeer::MaybeStartFecProtection(&generator_); |
| 669 PacketContents contents; |
| 670 contents.num_ack_frames = 1; |
| 671 contents.num_feedback_frames = 1; |
| 672 contents.num_stop_waiting_frames = 1; |
| 673 CheckPacketContains(contents, packet_); |
| 674 |
| 675 // FEC protection should be on in creator. |
| 676 EXPECT_TRUE(creator_.IsFecProtected()); |
| 677 } |
| 678 |
| 679 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentFramesProtected) { |
| 680 delegate_.SetCanWriteAnything(); |
| 681 |
| 682 // Enable and start FEC protection. |
| 683 creator_.set_max_packets_per_fec_group(2); |
| 684 QuicPacketGeneratorPeer::MaybeStartFecProtection(&generator_); |
| 685 EXPECT_TRUE(creator_.IsFecProtected()); |
| 686 |
| 687 // Queue stream frame to be protected in creator. |
| 688 generator_.StartBatchOperations(); |
| 689 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, |
| 690 NULL); |
| 691 EXPECT_EQ(1u, consumed.bytes_consumed); |
| 692 // Turn FEC protection off in generator. |
| 693 QuicPacketGeneratorPeer::MaybeStopFecProtection(&generator_, /*force=*/false); |
| 694 // Creator has a pending protected frame. |
| 695 EXPECT_TRUE(creator_.HasPendingFrames()); |
| 696 EXPECT_TRUE(creator_.IsFecProtected()); |
| 697 |
| 698 // Add enough data to exceed size of current packet, so that current packet |
| 699 // is sent. Both frames will be sent out in a single packet. |
| 700 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 701 DoAll(SaveArg<0>(&packet_), Return(true))); |
| 702 size_t data_len = kDefaultMaxPacketSize; |
| 703 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, NULL); |
| 704 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 705 PacketContents contents; |
| 706 contents.num_stream_frames = 2u; |
| 707 contents.fec_group = 1u; |
| 708 CheckPacketContains(contents, packet_); |
| 709 // FEC protection should still be on in creator. |
| 710 EXPECT_TRUE(creator_.IsFecProtected()); |
| 711 } |
| 712 |
| 713 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentPacketsProtected) { |
| 714 delegate_.SetCanWriteAnything(); |
| 715 |
| 716 // Enable and start FEC protection. |
| 717 creator_.set_max_packets_per_fec_group(2); |
| 718 QuicPacketGeneratorPeer::MaybeStartFecProtection(&generator_); |
| 719 EXPECT_TRUE(creator_.IsFecProtected()); |
| 720 |
| 721 generator_.StartBatchOperations(); |
| 722 // Send first packet, FEC protected. |
| 723 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 724 DoAll(SaveArg<0>(&packet_), Return(true))); |
| 725 // Write enough data to cause a packet to be emitted. |
| 726 size_t data_len = kDefaultMaxPacketSize; |
| 727 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(data_len), |
| 728 0, true, NULL); |
| 729 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 730 PacketContents contents; |
| 731 contents.num_stream_frames = 1u; |
| 732 contents.fec_group = 1u; |
| 733 CheckPacketContains(contents, packet_); |
| 734 |
| 735 // Turn FEC protection off in generator. |
| 736 QuicPacketGeneratorPeer::MaybeStopFecProtection(&generator_, /*force=*/false); |
| 737 // FEC group is still open in creator. |
| 738 EXPECT_TRUE(creator_.IsFecProtected()); |
| 739 |
| 740 // Send second packet, which is protected because it happens to fall within an |
| 741 // open FEC group. Data packet will be followed by FEC packet. |
| 742 { |
| 743 InSequence dummy; |
| 744 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 745 DoAll(SaveArg<0>(&packet2_), Return(true))); |
| 746 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 747 DoAll(SaveArg<0>(&packet3_), Return(true))); |
| 748 } |
| 749 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, NULL); |
| 750 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 751 contents.num_stream_frames = 2u; |
| 752 CheckPacketContains(contents, packet2_); |
| 753 CheckPacketIsFec(packet3_, /*fec_group=*/1u); |
| 754 |
| 755 // FEC protection should be off in creator. |
| 756 EXPECT_FALSE(creator_.IsFecProtected()); |
| 757 } |
| 758 |
| 759 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffThenOnWithCreatorProtectionOn) { |
| 760 delegate_.SetCanWriteAnything(); |
| 761 generator_.StartBatchOperations(); |
| 762 |
| 763 // Enable and start FEC protection. |
| 764 creator_.set_max_packets_per_fec_group(2); |
| 765 QuicPacketGeneratorPeer::MaybeStartFecProtection(&generator_); |
| 766 EXPECT_TRUE(creator_.IsFecProtected()); |
| 767 |
| 768 // Queue one byte of FEC protected data and turn FEC off in generator. |
| 769 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, |
| 770 NULL); |
| 771 QuicPacketGeneratorPeer::MaybeStopFecProtection(&generator_, /*force=*/false); |
| 772 EXPECT_TRUE(creator_.HasPendingFrames()); |
| 773 |
| 774 // Add more data causing first packet to be sent, FEC protected. |
| 775 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 776 DoAll(SaveArg<0>(&packet_), Return(true))); |
| 777 // Write enough data to cause a packet to be emitted. |
| 778 size_t data_len = kDefaultMaxPacketSize; |
| 779 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, NULL); |
| 780 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 781 PacketContents contents; |
| 782 contents.num_stream_frames = 2u; |
| 783 contents.fec_group = 1u; |
| 784 CheckPacketContains(contents, packet_); |
| 785 |
| 786 // FEC group is still open in creator. |
| 787 EXPECT_TRUE(creator_.IsFecProtected()); |
| 788 // Turn FEC on again in generator, for the next data. |
| 789 QuicPacketGeneratorPeer::MaybeStartFecProtection(&generator_); |
| 790 |
| 791 // Add data that should be protected, large enough to cause second packet to |
| 792 // be sent. Data packet should be followed by FEC packet. |
| 793 { |
| 794 InSequence dummy; |
| 795 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 796 DoAll(SaveArg<0>(&packet2_), Return(true))); |
| 797 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 798 DoAll(SaveArg<0>(&packet3_), Return(true))); |
| 799 } |
| 800 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, NULL); |
| 801 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 802 CheckPacketContains(contents, packet2_); |
| 803 CheckPacketIsFec(packet3_, /*fec_group=*/1u); |
| 804 |
| 805 // FEC protection should be on in creator. |
| 806 EXPECT_TRUE(creator_.IsFecProtected()); |
| 807 } |
| 808 |
| 550 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations) { | 809 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations) { |
| 551 delegate_.SetCanNotWrite(); | 810 delegate_.SetCanNotWrite(); |
| 552 | 811 |
| 553 generator_.SetShouldSendAck(true, false); | 812 generator_.SetShouldSendAck(true, false); |
| 554 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 813 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
| 555 EXPECT_TRUE(generator_.HasQueuedFrames()); | 814 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 556 | 815 |
| 557 delegate_.SetCanWriteAnything(); | 816 delegate_.SetCanWriteAnything(); |
| 558 | 817 |
| 559 generator_.StartBatchOperations(); | 818 generator_.StartBatchOperations(); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 630 | 889 |
| 631 // The second should have the remainder of the stream data. | 890 // The second should have the remainder of the stream data. |
| 632 PacketContents contents2; | 891 PacketContents contents2; |
| 633 contents2.num_goaway_frames = 1; | 892 contents2.num_goaway_frames = 1; |
| 634 contents2.num_stream_frames = 1; | 893 contents2.num_stream_frames = 1; |
| 635 CheckPacketContains(contents2, packet2_); | 894 CheckPacketContains(contents2, packet2_); |
| 636 } | 895 } |
| 637 | 896 |
| 638 } // namespace test | 897 } // namespace test |
| 639 } // namespace net | 898 } // namespace net |
| OLD | NEW |