| Index: net/quic/quic_packet_generator_test.cc
|
| diff --git a/net/quic/quic_packet_generator_test.cc b/net/quic/quic_packet_generator_test.cc
|
| index b90c39916f5bc8288251ba0132a311f1ec153a34..7738a8c98680c048b9153bac9c82a82f5aa1eb11 100644
|
| --- a/net/quic/quic_packet_generator_test.cc
|
| +++ b/net/quic/quic_packet_generator_test.cc
|
| @@ -106,8 +106,8 @@ class QuicPacketGeneratorTest : public ::testing::Test {
|
| protected:
|
| QuicPacketGeneratorTest()
|
| : framer_(QuicSupportedVersions(), QuicTime::Zero(), false),
|
| - creator_(42, &framer_, &random_, false),
|
| - generator_(&delegate_, NULL, &creator_),
|
| + generator_(42, &framer_, &random_, &delegate_),
|
| + creator_(QuicPacketGeneratorPeer::GetPacketCreator(&generator_)),
|
| packet_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL),
|
| packet2_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL),
|
| packet3_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL),
|
| @@ -224,9 +224,9 @@ class QuicPacketGeneratorTest : public ::testing::Test {
|
|
|
| QuicFramer framer_;
|
| MockRandom random_;
|
| - QuicPacketCreator creator_;
|
| StrictMock<MockDelegate> delegate_;
|
| QuicPacketGenerator generator_;
|
| + QuicPacketCreator* creator_;
|
| SimpleQuicFramer simple_framer_;
|
| SerializedPacket packet_;
|
| SerializedPacket packet2_;
|
| @@ -376,8 +376,8 @@ TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldFlush) {
|
| TEST_F(QuicPacketGeneratorTest, ConsumeData_NotWritable) {
|
| delegate_.SetCanNotWrite();
|
|
|
| - QuicConsumedData consumed = generator_.ConsumeData(1, MakeIOVector("foo"), 2,
|
| - true, NULL);
|
| + QuicConsumedData consumed = generator_.ConsumeData(
|
| + 1, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, NULL);
|
| EXPECT_EQ(0u, consumed.bytes_consumed);
|
| EXPECT_FALSE(consumed.fin_consumed);
|
| EXPECT_FALSE(generator_.HasQueuedFrames());
|
| @@ -387,8 +387,8 @@ TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldNotFlush) {
|
| delegate_.SetCanWriteAnything();
|
| generator_.StartBatchOperations();
|
|
|
| - QuicConsumedData consumed = generator_.ConsumeData(1, MakeIOVector("foo"), 2,
|
| - true, NULL);
|
| + QuicConsumedData consumed = generator_.ConsumeData(
|
| + 1, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, NULL);
|
| EXPECT_EQ(3u, consumed.bytes_consumed);
|
| EXPECT_TRUE(consumed.fin_consumed);
|
| EXPECT_TRUE(generator_.HasQueuedFrames());
|
| @@ -399,8 +399,8 @@ TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldFlush) {
|
|
|
| EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
|
| DoAll(SaveArg<0>(&packet_), Return(true)));
|
| - QuicConsumedData consumed = generator_.ConsumeData(1, MakeIOVector("foo"), 2,
|
| - true, NULL);
|
| + QuicConsumedData consumed = generator_.ConsumeData(
|
| + 1, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, NULL);
|
| EXPECT_EQ(3u, consumed.bytes_consumed);
|
| EXPECT_TRUE(consumed.fin_consumed);
|
| EXPECT_FALSE(generator_.HasQueuedFrames());
|
| @@ -415,9 +415,10 @@ TEST_F(QuicPacketGeneratorTest,
|
| delegate_.SetCanWriteAnything();
|
| generator_.StartBatchOperations();
|
|
|
| - generator_.ConsumeData(1, MakeIOVector("foo"), 2, true, NULL);
|
| - QuicConsumedData consumed = generator_.ConsumeData(3, MakeIOVector("quux"), 7,
|
| - false, NULL);
|
| + generator_.ConsumeData(1, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT,
|
| + NULL);
|
| + QuicConsumedData consumed = generator_.ConsumeData(
|
| + 3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, NULL);
|
| EXPECT_EQ(4u, consumed.bytes_consumed);
|
| EXPECT_FALSE(consumed.fin_consumed);
|
| EXPECT_TRUE(generator_.HasQueuedFrames());
|
| @@ -427,9 +428,10 @@ TEST_F(QuicPacketGeneratorTest, ConsumeData_BatchOperations) {
|
| delegate_.SetCanWriteAnything();
|
| generator_.StartBatchOperations();
|
|
|
| - generator_.ConsumeData(1, MakeIOVector("foo"), 2, true, NULL);
|
| - QuicConsumedData consumed = generator_.ConsumeData(3, MakeIOVector("quux"), 7,
|
| - false, NULL);
|
| + generator_.ConsumeData(1, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT,
|
| + NULL);
|
| + QuicConsumedData consumed = generator_.ConsumeData(
|
| + 3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, NULL);
|
| EXPECT_EQ(4u, consumed.bytes_consumed);
|
| EXPECT_FALSE(consumed.fin_consumed);
|
| EXPECT_TRUE(generator_.HasQueuedFrames());
|
| @@ -449,8 +451,7 @@ TEST_F(QuicPacketGeneratorTest, ConsumeDataFEC) {
|
| delegate_.SetCanWriteAnything();
|
|
|
| // Send FEC every two packets.
|
| - creator_.set_max_packets_per_fec_group(2);
|
| - QuicPacketGeneratorPeer::MaybeStartFecProtection(&generator_);
|
| + creator_->set_max_packets_per_fec_group(2);
|
|
|
| {
|
| InSequence dummy;
|
| @@ -466,10 +467,12 @@ TEST_F(QuicPacketGeneratorTest, ConsumeDataFEC) {
|
| DoAll(SaveArg<0>(&packet5_), Return(true)));
|
| }
|
|
|
| - // Send enough data to create 3 packets: two full and one partial.
|
| + // Send enough data to create 3 packets: two full and one partial. Send
|
| + // with MUST_FEC_PROTECT flag.
|
| size_t data_len = 2 * kDefaultMaxPacketSize + 100;
|
| QuicConsumedData consumed =
|
| - generator_.ConsumeData(3, CreateData(data_len), 0, true, NULL);
|
| + generator_.ConsumeData(3, CreateData(data_len), 0, true,
|
| + MUST_FEC_PROTECT, NULL);
|
| EXPECT_EQ(data_len, consumed.bytes_consumed);
|
| EXPECT_TRUE(consumed.fin_consumed);
|
| EXPECT_FALSE(generator_.HasQueuedFrames());
|
| @@ -485,9 +488,8 @@ TEST_F(QuicPacketGeneratorTest, ConsumeDataFEC) {
|
| TEST_F(QuicPacketGeneratorTest, ConsumeDataSendsFecAtEnd) {
|
| delegate_.SetCanWriteAnything();
|
|
|
| - // Send FEC every six packets.
|
| - creator_.set_max_packets_per_fec_group(6);
|
| - QuicPacketGeneratorPeer::MaybeStartFecProtection(&generator_);
|
| + // Enable FEC.
|
| + creator_->set_max_packets_per_fec_group(6);
|
| {
|
| InSequence dummy;
|
| EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
|
| @@ -498,10 +500,12 @@ TEST_F(QuicPacketGeneratorTest, ConsumeDataSendsFecAtEnd) {
|
| DoAll(SaveArg<0>(&packet3_), Return(true)));
|
| }
|
|
|
| - // Send enough data to create 2 packets: one full and one partial.
|
| + // Send enough data to create 2 packets: one full and one partial. Send
|
| + // with MUST_FEC_PROTECT flag.
|
| size_t data_len = 1 * kDefaultMaxPacketSize + 100;
|
| QuicConsumedData consumed =
|
| - generator_.ConsumeData(3, CreateData(data_len), 0, true, NULL);
|
| + generator_.ConsumeData(3, CreateData(data_len), 0, true,
|
| + MUST_FEC_PROTECT, NULL);
|
| EXPECT_EQ(data_len, consumed.bytes_consumed);
|
| EXPECT_TRUE(consumed.fin_consumed);
|
| EXPECT_FALSE(generator_.HasQueuedFrames());
|
| @@ -516,9 +520,9 @@ TEST_F(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) {
|
| // but not enough for a stream frame of 0 offset and one with non-zero offset.
|
| size_t length =
|
| NullEncrypter().GetCiphertextSize(0) +
|
| - GetPacketHeaderSize(creator_.connection_id_length(),
|
| + GetPacketHeaderSize(creator_->connection_id_length(),
|
| true,
|
| - creator_.next_sequence_number_length(),
|
| + creator_->next_sequence_number_length(),
|
| NOT_IN_FEC_GROUP) +
|
| // Add an extra 3 bytes for the payload and 1 byte so BytesFree is larger
|
| // than the GetMinStreamFrameSize.
|
| @@ -526,7 +530,7 @@ TEST_F(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) {
|
| NOT_IN_FEC_GROUP) + 3 +
|
| QuicFramer::GetMinStreamFrameSize(framer_.version(), 1, 0, true,
|
| NOT_IN_FEC_GROUP) + 1;
|
| - creator_.set_max_packet_length(length);
|
| + creator_->set_max_packet_length(length);
|
| delegate_.SetCanWriteAnything();
|
| {
|
| InSequence dummy;
|
| @@ -538,8 +542,8 @@ TEST_F(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) {
|
| generator_.StartBatchOperations();
|
| // Queue enough data to prevent a stream frame with a non-zero offset from
|
| // fitting.
|
| - QuicConsumedData consumed = generator_.ConsumeData(1, MakeIOVector("foo"), 0,
|
| - false, NULL);
|
| + QuicConsumedData consumed = generator_.ConsumeData(
|
| + 1, MakeIOVector("foo"), 0, false, MAY_FEC_PROTECT, NULL);
|
| EXPECT_EQ(3u, consumed.bytes_consumed);
|
| EXPECT_FALSE(consumed.fin_consumed);
|
| EXPECT_TRUE(generator_.HasQueuedFrames());
|
| @@ -547,7 +551,8 @@ TEST_F(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) {
|
| // This frame will not fit with the existing frame, causing the queued frame
|
| // to be serialized, and it will not fit with another frame like it, so it is
|
| // serialized by itself.
|
| - consumed = generator_.ConsumeData(1, MakeIOVector("bar"), 3, true, NULL);
|
| + consumed = generator_.ConsumeData(1, MakeIOVector("bar"), 3, true,
|
| + MAY_FEC_PROTECT, NULL);
|
| EXPECT_EQ(3u, consumed.bytes_consumed);
|
| EXPECT_TRUE(consumed.fin_consumed);
|
| EXPECT_FALSE(generator_.HasQueuedFrames());
|
| @@ -561,25 +566,23 @@ TEST_F(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) {
|
| TEST_F(QuicPacketGeneratorTest, SwitchFecOnOff) {
|
| delegate_.SetCanWriteAnything();
|
| // Enable FEC.
|
| - creator_.set_max_packets_per_fec_group(2);
|
| - EXPECT_FALSE(creator_.IsFecProtected());
|
| + creator_->set_max_packets_per_fec_group(2);
|
| + EXPECT_FALSE(creator_->IsFecProtected());
|
|
|
| // Send one unprotected data packet.
|
| EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
|
| DoAll(SaveArg<0>(&packet_), Return(true)));
|
| QuicConsumedData consumed =
|
| - generator_.ConsumeData(5, CreateData(1u), 0, true, NULL);
|
| + generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT,
|
| + NULL);
|
| EXPECT_EQ(1u, consumed.bytes_consumed);
|
| EXPECT_FALSE(generator_.HasQueuedFrames());
|
| - EXPECT_FALSE(creator_.IsFecProtected());
|
| + EXPECT_FALSE(creator_->IsFecProtected());
|
| // Verify that one data packet was sent.
|
| PacketContents contents;
|
| contents.num_stream_frames = 1;
|
| CheckPacketContains(contents, packet_);
|
|
|
| - // Turn on FEC protection.
|
| - QuicPacketGeneratorPeer::MaybeStartFecProtection(&generator_);
|
| - EXPECT_TRUE(creator_.IsFecProtected());
|
| {
|
| InSequence dummy;
|
| EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
|
| @@ -593,12 +596,12 @@ TEST_F(QuicPacketGeneratorTest, SwitchFecOnOff) {
|
| EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
|
| DoAll(SaveArg<0>(&packet6_), Return(true)));
|
| }
|
| - // Send enough data to create 3 packets.
|
| + // Send enough data to create 3 packets with MUST_FEC_PROTECT flag.
|
| size_t data_len = 2 * kDefaultMaxPacketSize + 100;
|
| - consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, NULL);
|
| + consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true,
|
| + MUST_FEC_PROTECT, NULL);
|
| EXPECT_EQ(data_len, consumed.bytes_consumed);
|
| EXPECT_FALSE(generator_.HasQueuedFrames());
|
| - EXPECT_TRUE(creator_.IsFecProtected());
|
|
|
| // Verify that two FEC packets were sent.
|
| CheckPacketHasSingleStreamFrame(packet2_);
|
| @@ -607,14 +610,14 @@ TEST_F(QuicPacketGeneratorTest, SwitchFecOnOff) {
|
| CheckPacketHasSingleStreamFrame(packet5_);
|
| CheckPacketIsFec(packet6_, /*fec_group=*/5u); // Sent at the end of stream.
|
|
|
| - // Turn off FEC protection and send one unprotected data packet.
|
| - QuicPacketGeneratorPeer::MaybeStopFecProtection(&generator_, false);
|
| + // Send one unprotected data packet.
|
| EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
|
| DoAll(SaveArg<0>(&packet7_), Return(true)));
|
| - consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, NULL);
|
| + consumed = generator_.ConsumeData(7, CreateData(1u), 0, true,
|
| + MAY_FEC_PROTECT, NULL);
|
| EXPECT_EQ(1u, consumed.bytes_consumed);
|
| EXPECT_FALSE(generator_.HasQueuedFrames());
|
| - EXPECT_FALSE(creator_.IsFecProtected());
|
| + EXPECT_FALSE(creator_->IsFecProtected());
|
| // Verify that one unprotected data packet was sent.
|
| CheckPacketContains(contents, packet7_);
|
| }
|
| @@ -622,33 +625,40 @@ TEST_F(QuicPacketGeneratorTest, SwitchFecOnOff) {
|
| TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFrameInCreator) {
|
| delegate_.SetCanWriteAnything();
|
| // Enable FEC.
|
| - creator_.set_max_packets_per_fec_group(2);
|
| + creator_->set_max_packets_per_fec_group(2);
|
|
|
| generator_.StartBatchOperations();
|
| // Queue enough data to prevent a stream frame with a non-zero offset from
|
| // fitting.
|
| - QuicConsumedData consumed = generator_.ConsumeData(7, CreateData(1u), 0,
|
| - true, NULL);
|
| + QuicConsumedData consumed = generator_.ConsumeData(
|
| + 7, CreateData(1u), 0, true, MAY_FEC_PROTECT, NULL);
|
| EXPECT_EQ(1u, consumed.bytes_consumed);
|
| - EXPECT_TRUE(creator_.HasPendingFrames());
|
| + EXPECT_TRUE(creator_->HasPendingFrames());
|
|
|
| - // Turn on FEC protection. Should cause queued frames to be flushed.
|
| + // Queue protected data for sending. Should cause queued frames to be flushed.
|
| EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
|
| DoAll(SaveArg<0>(&packet_), Return(true)));
|
| - EXPECT_FALSE(creator_.IsFecProtected());
|
| - QuicPacketGeneratorPeer::MaybeStartFecProtection(&generator_);
|
| - CheckPacketHasSingleStreamFrame(packet_);
|
| - EXPECT_TRUE(creator_.IsFecProtected());
|
| + EXPECT_FALSE(creator_->IsFecProtected());
|
| + consumed = generator_.ConsumeData(7, CreateData(1u), 0, true,
|
| + MUST_FEC_PROTECT, NULL);
|
| + EXPECT_EQ(1u, consumed.bytes_consumed);
|
| + PacketContents contents;
|
| + contents.num_stream_frames = 1;
|
| + // Transmitted packet was not FEC protected.
|
| + CheckPacketContains(contents, packet_);
|
| + EXPECT_TRUE(creator_->IsFecProtected());
|
| + EXPECT_TRUE(creator_->HasPendingFrames());
|
| }
|
|
|
| TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFramesInGenerator) {
|
| // Enable FEC.
|
| - creator_.set_max_packets_per_fec_group(2);
|
| + creator_->set_max_packets_per_fec_group(2);
|
|
|
| // Queue control frames in generator.
|
| delegate_.SetCanNotWrite();
|
| generator_.SetShouldSendAck(true, true);
|
| delegate_.SetCanWriteAnything();
|
| + generator_.StartBatchOperations();
|
|
|
| // Set up frames to write into the creator when control frames are written.
|
| EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame()));
|
| @@ -659,13 +669,15 @@ TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFramesInGenerator) {
|
|
|
| // Generator should have queued control frames, and creator should be empty.
|
| EXPECT_TRUE(generator_.HasQueuedFrames());
|
| - EXPECT_FALSE(creator_.HasPendingFrames());
|
| - EXPECT_FALSE(creator_.IsFecProtected());
|
| + EXPECT_FALSE(creator_->HasPendingFrames());
|
| + EXPECT_FALSE(creator_->IsFecProtected());
|
|
|
| - // Turn on FEC protection. Should cause queued control frames to be flushed.
|
| + // Queue protected data for sending. Should cause queued frames to be flushed.
|
| EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
|
| DoAll(SaveArg<0>(&packet_), Return(true)));
|
| - QuicPacketGeneratorPeer::MaybeStartFecProtection(&generator_);
|
| + QuicConsumedData consumed = generator_.ConsumeData(7, CreateData(1u), 0, true,
|
| + MUST_FEC_PROTECT, NULL);
|
| + EXPECT_EQ(1u, consumed.bytes_consumed);
|
| PacketContents contents;
|
| contents.num_ack_frames = 1;
|
| contents.num_feedback_frames = 1;
|
| @@ -673,50 +685,47 @@ TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFramesInGenerator) {
|
| CheckPacketContains(contents, packet_);
|
|
|
| // FEC protection should be on in creator.
|
| - EXPECT_TRUE(creator_.IsFecProtected());
|
| + EXPECT_TRUE(creator_->IsFecProtected());
|
| }
|
|
|
| TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentFramesProtected) {
|
| delegate_.SetCanWriteAnything();
|
|
|
| - // Enable and start FEC protection.
|
| - creator_.set_max_packets_per_fec_group(2);
|
| - QuicPacketGeneratorPeer::MaybeStartFecProtection(&generator_);
|
| - EXPECT_TRUE(creator_.IsFecProtected());
|
| + // Enable FEC.
|
| + creator_->set_max_packets_per_fec_group(2);
|
| + EXPECT_FALSE(creator_->IsFecProtected());
|
|
|
| // Queue stream frame to be protected in creator.
|
| generator_.StartBatchOperations();
|
| QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true,
|
| - NULL);
|
| + MUST_FEC_PROTECT, NULL);
|
| EXPECT_EQ(1u, consumed.bytes_consumed);
|
| - // Turn FEC protection off in generator.
|
| - QuicPacketGeneratorPeer::MaybeStopFecProtection(&generator_, /*force=*/false);
|
| // Creator has a pending protected frame.
|
| - EXPECT_TRUE(creator_.HasPendingFrames());
|
| - EXPECT_TRUE(creator_.IsFecProtected());
|
| + EXPECT_TRUE(creator_->HasPendingFrames());
|
| + EXPECT_TRUE(creator_->IsFecProtected());
|
|
|
| - // Add enough data to exceed size of current packet, so that current packet
|
| - // is sent. Both frames will be sent out in a single packet.
|
| + // Add enough unprotected data to exceed size of current packet, so that
|
| + // current packet is sent. Both frames will be sent out in a single packet.
|
| EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
|
| DoAll(SaveArg<0>(&packet_), Return(true)));
|
| size_t data_len = kDefaultMaxPacketSize;
|
| - consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, NULL);
|
| + consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true,
|
| + MAY_FEC_PROTECT, NULL);
|
| EXPECT_EQ(data_len, consumed.bytes_consumed);
|
| PacketContents contents;
|
| contents.num_stream_frames = 2u;
|
| contents.fec_group = 1u;
|
| CheckPacketContains(contents, packet_);
|
| // FEC protection should still be on in creator.
|
| - EXPECT_TRUE(creator_.IsFecProtected());
|
| + EXPECT_TRUE(creator_->IsFecProtected());
|
| }
|
|
|
| TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentPacketsProtected) {
|
| delegate_.SetCanWriteAnything();
|
|
|
| - // Enable and start FEC protection.
|
| - creator_.set_max_packets_per_fec_group(2);
|
| - QuicPacketGeneratorPeer::MaybeStartFecProtection(&generator_);
|
| - EXPECT_TRUE(creator_.IsFecProtected());
|
| + // Enable FEC.
|
| + creator_->set_max_packets_per_fec_group(2);
|
| + EXPECT_FALSE(creator_->IsFecProtected());
|
|
|
| generator_.StartBatchOperations();
|
| // Send first packet, FEC protected.
|
| @@ -724,21 +733,20 @@ TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentPacketsProtected) {
|
| DoAll(SaveArg<0>(&packet_), Return(true)));
|
| // Write enough data to cause a packet to be emitted.
|
| size_t data_len = kDefaultMaxPacketSize;
|
| - QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(data_len),
|
| - 0, true, NULL);
|
| + QuicConsumedData consumed = generator_.ConsumeData(
|
| + 5, CreateData(data_len), 0, true, MUST_FEC_PROTECT, NULL);
|
| EXPECT_EQ(data_len, consumed.bytes_consumed);
|
| PacketContents contents;
|
| contents.num_stream_frames = 1u;
|
| contents.fec_group = 1u;
|
| CheckPacketContains(contents, packet_);
|
|
|
| - // Turn FEC protection off in generator.
|
| - QuicPacketGeneratorPeer::MaybeStopFecProtection(&generator_, /*force=*/false);
|
| - // FEC group is still open in creator.
|
| - EXPECT_TRUE(creator_.IsFecProtected());
|
| + // FEC should still be on in creator.
|
| + EXPECT_TRUE(creator_->IsFecProtected());
|
|
|
| - // Send second packet, which is protected because it happens to fall within an
|
| - // open FEC group. Data packet will be followed by FEC packet.
|
| + // Send enough unprotected data to cause second packet to be sent, which gets
|
| + // protected because it happens to fall within an open FEC group. Data packet
|
| + // will be followed by FEC packet.
|
| {
|
| InSequence dummy;
|
| EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
|
| @@ -746,37 +754,36 @@ TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentPacketsProtected) {
|
| EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
|
| DoAll(SaveArg<0>(&packet3_), Return(true)));
|
| }
|
| - consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, NULL);
|
| + consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true,
|
| + MAY_FEC_PROTECT, NULL);
|
| EXPECT_EQ(data_len, consumed.bytes_consumed);
|
| contents.num_stream_frames = 2u;
|
| CheckPacketContains(contents, packet2_);
|
| CheckPacketIsFec(packet3_, /*fec_group=*/1u);
|
|
|
| // FEC protection should be off in creator.
|
| - EXPECT_FALSE(creator_.IsFecProtected());
|
| + EXPECT_FALSE(creator_->IsFecProtected());
|
| }
|
|
|
| TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffThenOnWithCreatorProtectionOn) {
|
| delegate_.SetCanWriteAnything();
|
| generator_.StartBatchOperations();
|
|
|
| - // Enable and start FEC protection.
|
| - creator_.set_max_packets_per_fec_group(2);
|
| - QuicPacketGeneratorPeer::MaybeStartFecProtection(&generator_);
|
| - EXPECT_TRUE(creator_.IsFecProtected());
|
| + // Enable FEC.
|
| + creator_->set_max_packets_per_fec_group(2);
|
| + EXPECT_FALSE(creator_->IsFecProtected());
|
|
|
| - // Queue one byte of FEC protected data and turn FEC off in generator.
|
| + // Queue one byte of FEC protected data.
|
| QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true,
|
| - NULL);
|
| - QuicPacketGeneratorPeer::MaybeStopFecProtection(&generator_, /*force=*/false);
|
| - EXPECT_TRUE(creator_.HasPendingFrames());
|
| + MUST_FEC_PROTECT, NULL);
|
| + EXPECT_TRUE(creator_->HasPendingFrames());
|
|
|
| - // Add more data causing first packet to be sent, FEC protected.
|
| + // Add more unprotected data causing first packet to be sent, FEC protected.
|
| EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
|
| DoAll(SaveArg<0>(&packet_), Return(true)));
|
| - // Write enough data to cause a packet to be emitted.
|
| size_t data_len = kDefaultMaxPacketSize;
|
| - consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, NULL);
|
| + consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true,
|
| + MAY_FEC_PROTECT, NULL);
|
| EXPECT_EQ(data_len, consumed.bytes_consumed);
|
| PacketContents contents;
|
| contents.num_stream_frames = 2u;
|
| @@ -784,9 +791,7 @@ TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffThenOnWithCreatorProtectionOn) {
|
| CheckPacketContains(contents, packet_);
|
|
|
| // FEC group is still open in creator.
|
| - EXPECT_TRUE(creator_.IsFecProtected());
|
| - // Turn FEC on again in generator, for the next data.
|
| - QuicPacketGeneratorPeer::MaybeStartFecProtection(&generator_);
|
| + EXPECT_TRUE(creator_->IsFecProtected());
|
|
|
| // Add data that should be protected, large enough to cause second packet to
|
| // be sent. Data packet should be followed by FEC packet.
|
| @@ -797,13 +802,14 @@ TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffThenOnWithCreatorProtectionOn) {
|
| EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
|
| DoAll(SaveArg<0>(&packet3_), Return(true)));
|
| }
|
| - consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, NULL);
|
| + consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true,
|
| + MUST_FEC_PROTECT, NULL);
|
| EXPECT_EQ(data_len, consumed.bytes_consumed);
|
| CheckPacketContains(contents, packet2_);
|
| CheckPacketIsFec(packet3_, /*fec_group=*/1u);
|
|
|
| - // FEC protection should be on in creator.
|
| - EXPECT_TRUE(creator_.IsFecProtected());
|
| + // FEC protection should remain on in creator.
|
| + EXPECT_TRUE(creator_->IsFecProtected());
|
| }
|
|
|
| TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations) {
|
| @@ -824,7 +830,8 @@ TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations) {
|
| Return(CreateFeedbackFrame()));
|
|
|
| // Send some data and a control frame
|
| - generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, NULL);
|
| + generator_.ConsumeData(3, MakeIOVector("quux"), 7, false,
|
| + MAY_FEC_PROTECT, NULL);
|
| generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame()));
|
|
|
| // All five frames will be flushed out in a single packet.
|
| @@ -871,7 +878,8 @@ TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations2) {
|
| // Send enough data to exceed one packet
|
| size_t data_len = kDefaultMaxPacketSize + 100;
|
| QuicConsumedData consumed =
|
| - generator_.ConsumeData(3, CreateData(data_len), 0, true, NULL);
|
| + generator_.ConsumeData(3, CreateData(data_len), 0, true,
|
| + MAY_FEC_PROTECT, NULL);
|
| EXPECT_EQ(data_len, consumed.bytes_consumed);
|
| EXPECT_TRUE(consumed.fin_consumed);
|
| generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame()));
|
|
|