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; |
25 using testing::StrictMock; | 26 using testing::StrictMock; |
26 using testing::_; | 27 using testing::_; |
27 | 28 |
28 namespace net { | 29 namespace net { |
29 namespace test { | 30 namespace test { |
30 namespace { | 31 namespace { |
31 | 32 |
32 class MockDelegate : public QuicPacketGenerator::DelegateInterface { | 33 class MockDelegate : public QuicPacketGenerator::DelegateInterface { |
33 public: | 34 public: |
34 MockDelegate() {} | 35 MockDelegate() {} |
35 virtual ~MockDelegate() {} | 36 virtual ~MockDelegate() OVERRIDE {} |
36 | 37 |
37 MOCK_METHOD3(ShouldGeneratePacket, | 38 MOCK_METHOD3(ShouldGeneratePacket, |
38 bool(TransmissionType transmission_type, | 39 bool(TransmissionType transmission_type, |
39 HasRetransmittableData retransmittable, | 40 HasRetransmittableData retransmittable, |
40 IsHandshake handshake)); | 41 IsHandshake handshake)); |
41 MOCK_METHOD0(CreateAckFrame, QuicAckFrame*()); | 42 MOCK_METHOD0(CreateAckFrame, QuicAckFrame*()); |
42 MOCK_METHOD0(CreateFeedbackFrame, QuicCongestionFeedbackFrame*()); | 43 MOCK_METHOD0(CreateFeedbackFrame, QuicCongestionFeedbackFrame*()); |
43 MOCK_METHOD0(CreateStopWaitingFrame, QuicStopWaitingFrame*()); | 44 MOCK_METHOD0(CreateStopWaitingFrame, QuicStopWaitingFrame*()); |
44 MOCK_METHOD1(OnSerializedPacket, bool(const SerializedPacket& packet)); | 45 MOCK_METHOD1(OnSerializedPacket, bool(const SerializedPacket& packet)); |
45 MOCK_METHOD2(CloseConnection, void(QuicErrorCode, bool)); | 46 MOCK_METHOD2(CloseConnection, void(QuicErrorCode, bool)); |
(...skipping 58 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 virtual ~QuicPacketGeneratorTest() OVERRIDE { |
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 |