Index: net/quic/quic_packet_creator_test.cc |
diff --git a/net/quic/quic_packet_creator_test.cc b/net/quic/quic_packet_creator_test.cc |
index 6d0ea5c8a0f7676880f07af59c12d7ea78cd3917..72faf7edf549d933794b92a7c4b81c41c42a51bf 100644 |
--- a/net/quic/quic_packet_creator_test.cc |
+++ b/net/quic/quic_packet_creator_test.cc |
@@ -119,7 +119,6 @@ class QuicPacketCreatorTest : public ::testing::TestWithParam<TestParams> { |
return QuicFramer::GetMinStreamFrameSize( |
client_framer_.version(), kStreamId, kOffset, true, is_in_fec_group); |
} |
- |
static const QuicStreamId kStreamId = 1u; |
static const QuicStreamOffset kOffset = 1u; |
@@ -140,7 +139,6 @@ INSTANTIATE_TEST_CASE_P(QuicPacketCreatorTests, |
QuicPacketCreatorTest, |
::testing::ValuesIn(GetTestParams())); |
- |
TEST_P(QuicPacketCreatorTest, SerializeFrames) { |
frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u, 0u)))); |
frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); |
@@ -167,7 +165,8 @@ TEST_P(QuicPacketCreatorTest, SerializeFrames) { |
} |
TEST_P(QuicPacketCreatorTest, SerializeWithFEC) { |
- creator_.options()->max_packets_per_fec_group = 6; |
+ // Enable FEC protection, and send FEC packet every 6 packets. |
+ EXPECT_TRUE(QuicPacketCreatorPeer::SwitchFecProtectionOn(&creator_, 6)); |
// Should return false since we do not have enough packets in the FEC group to |
// trigger an FEC packet. |
ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); |
@@ -259,7 +258,9 @@ TEST_P(QuicPacketCreatorTest, SerializeWithFECChangingSequenceNumberLength) { |
// P1 <change seq num length> P2 FEC, |
// and we expect that sequence number length should not change until the end |
// of the open FEC group. |
- creator_.options()->max_packets_per_fec_group = 6; |
+ |
+ // Enable FEC protection, and send FEC packet every 6 packets. |
+ EXPECT_TRUE(QuicPacketCreatorPeer::SwitchFecProtectionOn(&creator_, 6)); |
// Should return false since we do not have enough packets in the FEC group to |
// trigger an FEC packet. |
ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); |
@@ -391,6 +392,83 @@ TEST_P(QuicPacketCreatorTest, SerializeConnectionClose) { |
delete serialized.packet; |
} |
+TEST_P(QuicPacketCreatorTest, SwitchFecOnOffWithNoGroup) { |
+ // Enable FEC protection. |
+ creator_.set_max_packets_per_fec_group(6); |
+ EXPECT_TRUE(creator_.IsFecEnabled()); |
+ EXPECT_FALSE(creator_.IsFecProtected()); |
+ |
+ // Turn on FEC protection. |
+ creator_.StartFecProtectingPackets(); |
+ EXPECT_TRUE(creator_.IsFecProtected()); |
+ // We have no packets in the FEC group, so no FEC packet can be created. |
+ EXPECT_FALSE(creator_.ShouldSendFec(/*force_close=*/true)); |
+ // Since no packets are in FEC group yet, we should be able to turn FEC |
+ // off with no trouble. |
+ creator_.StopFecProtectingPackets(); |
+ EXPECT_FALSE(creator_.IsFecProtected()); |
+} |
+ |
+TEST_P(QuicPacketCreatorTest, SwitchFecOnOffWithGroupInProgress) { |
+ // Enable FEC protection, and send FEC packet every 6 packets. |
+ EXPECT_TRUE(QuicPacketCreatorPeer::SwitchFecProtectionOn(&creator_, 6)); |
+ frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); |
+ SerializedPacket serialized = creator_.SerializeAllFrames(frames_); |
+ delete frames_[0].stream_frame; |
+ delete serialized.packet; |
+ |
+ EXPECT_TRUE(creator_.IsFecProtected()); |
+ // We do not have enough packets in the FEC group to trigger an FEC packet. |
+ EXPECT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); |
+ // Should return true since there are packets in the FEC group. |
+ EXPECT_TRUE(creator_.ShouldSendFec(/*force_close=*/true)); |
+ |
+ // Switching FEC off should not change creator state, since there is an |
+ // FEC packet under construction. |
+ EXPECT_DFATAL(creator_.StopFecProtectingPackets(), |
+ "Cannot stop FEC protection with open FEC group."); |
+ EXPECT_TRUE(creator_.IsFecProtected()); |
+ // Confirm that FEC packet is still under construction. |
+ EXPECT_TRUE(creator_.ShouldSendFec(/*force_close=*/true)); |
+ |
+ serialized = creator_.SerializeFec(); |
+ delete serialized.packet; |
+ |
+ // Switching FEC on/off should work now. |
+ creator_.StopFecProtectingPackets(); |
+ EXPECT_FALSE(creator_.IsFecProtected()); |
+ creator_.StartFecProtectingPackets(); |
+ EXPECT_TRUE(creator_.IsFecProtected()); |
+} |
+ |
+TEST_P(QuicPacketCreatorTest, SwitchFecOnWithStreamFrameQueued) { |
+ // Add a stream frame to the creator. |
+ QuicFrame frame; |
+ size_t consumed = creator_.CreateStreamFrame( |
+ 1u, MakeIOVector("test"), 0u, false, &frame); |
+ EXPECT_EQ(4u, consumed); |
+ ASSERT_TRUE(frame.stream_frame); |
+ EXPECT_TRUE(creator_.AddSavedFrame(frame)); |
+ EXPECT_TRUE(creator_.HasPendingFrames()); |
+ |
+ // Enable FEC protection, and send FEC packet every 6 packets. |
+ creator_.set_max_packets_per_fec_group(6); |
+ EXPECT_TRUE(creator_.IsFecEnabled()); |
+ EXPECT_DFATAL(creator_.StartFecProtectingPackets(), |
+ "Cannot start FEC protection with pending frames."); |
+ EXPECT_FALSE(creator_.IsFecProtected()); |
+ |
+ // Serialize packet for transmission. |
+ SerializedPacket serialized = creator_.SerializePacket(); |
+ delete serialized.packet; |
+ delete serialized.retransmittable_frames; |
+ EXPECT_FALSE(creator_.HasPendingFrames()); |
+ |
+ // Since all pending frames have been serialized, turning FEC on should work. |
+ creator_.StartFecProtectingPackets(); |
+ EXPECT_TRUE(creator_.IsFecProtected()); |
+} |
+ |
TEST_P(QuicPacketCreatorTest, CreateStreamFrame) { |
QuicFrame frame; |
size_t consumed = creator_.CreateStreamFrame(1u, MakeIOVector("test"), 0u, |
@@ -469,8 +547,8 @@ TEST_P(QuicPacketCreatorTest, StreamFrameConsumption) { |
} |
TEST_P(QuicPacketCreatorTest, StreamFrameConsumptionWithFec) { |
- // Turn on FEC protection. |
- creator_.options()->max_packets_per_fec_group = 6; |
+ // Enable FEC protection, and send FEC packet every 6 packets. |
+ EXPECT_TRUE(QuicPacketCreatorPeer::SwitchFecProtectionOn(&creator_, 6)); |
// Compute the total overhead for a single frame in packet. |
const size_t overhead = GetPacketHeaderOverhead(IN_FEC_GROUP) |
+ GetEncryptionOverhead() + GetStreamFrameOverhead(IN_FEC_GROUP); |