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 331b183466704bf71357ab24defc1aaa7d50c7fe..a400833e0f835e12a035260b5547638aa45a8edf 100644 |
--- a/net/quic/quic_packet_generator_test.cc |
+++ b/net/quic/quic_packet_generator_test.cc |
@@ -563,9 +563,75 @@ TEST_F(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) { |
CheckPacketContains(contents, packet2_); |
} |
+TEST_F(QuicPacketGeneratorTest, FecGroupSizeOnCongestionWindowChange) { |
+ delegate_.SetCanWriteAnything(); |
+ creator_->set_max_packets_per_fec_group(50); |
+ EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); |
+ EXPECT_FALSE(creator_->IsFecGroupOpen()); |
+ |
+ // On reduced cwnd. |
+ generator_.OnCongestionWindowChange(7 * kDefaultTCPMSS); |
+ EXPECT_EQ(3u, creator_->max_packets_per_fec_group()); |
+ |
+ // On increased cwnd. |
+ generator_.OnCongestionWindowChange(100 * kDefaultTCPMSS); |
+ EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); |
+ |
+ // On collapsed cwnd. |
+ generator_.OnCongestionWindowChange(1 * kDefaultTCPMSS); |
+ EXPECT_EQ(2u, creator_->max_packets_per_fec_group()); |
+} |
+ |
+TEST_F(QuicPacketGeneratorTest, FecGroupSizeChangeWithOpenGroup) { |
+ delegate_.SetCanWriteAnything(); |
+ // TODO(jri): This starting of batch mode should not be required when |
+ // FEC sending is separated from batching operations. |
+ generator_.StartBatchOperations(); |
+ creator_->set_max_packets_per_fec_group(50); |
+ EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); |
+ EXPECT_FALSE(creator_->IsFecGroupOpen()); |
+ |
+ // Send enough data to create 4 packets with MUST_FEC_PROTECT flag. |
+ // 3 packets are sent, one is queued in the creator. |
+ { |
+ InSequence dummy; |
+ EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
+ DoAll(SaveArg<0>(&packet_), Return(true))); |
+ EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
+ DoAll(SaveArg<0>(&packet2_), Return(true))); |
+ EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
+ DoAll(SaveArg<0>(&packet3_), Return(true))); |
+ } |
+ size_t data_len = 3 * kDefaultMaxPacketSize + 1; |
+ QuicConsumedData consumed = generator_.ConsumeData( |
+ 7, CreateData(data_len), 0, true, MUST_FEC_PROTECT, NULL); |
+ EXPECT_EQ(data_len, consumed.bytes_consumed); |
+ EXPECT_TRUE(creator_->IsFecGroupOpen()); |
+ |
+ // Change FEC groupsize. |
+ generator_.OnCongestionWindowChange(2 * kDefaultTCPMSS); |
+ EXPECT_EQ(2u, creator_->max_packets_per_fec_group()); |
+ |
+ // Send enough data to trigger one unprotected data packet, |
+ // causing the FEC packet to also be sent. |
+ { |
+ InSequence dummy; |
+ EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
+ DoAll(SaveArg<0>(&packet4_), Return(true))); |
+ EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
+ DoAll(SaveArg<0>(&packet5_), Return(true))); |
+ } |
+ consumed = generator_.ConsumeData(7, CreateData(kDefaultMaxPacketSize), 0, |
+ true, MAY_FEC_PROTECT, NULL); |
+ EXPECT_EQ(kDefaultMaxPacketSize, consumed.bytes_consumed); |
+ // Verify that one FEC packet was sent. |
+ CheckPacketIsFec(packet5_, /*fec_group=*/1u); |
+ EXPECT_FALSE(creator_->IsFecGroupOpen()); |
+ EXPECT_FALSE(creator_->IsFecProtected()); |
+} |
+ |
TEST_F(QuicPacketGeneratorTest, SwitchFecOnOff) { |
delegate_.SetCanWriteAnything(); |
- // Enable FEC. |
creator_->set_max_packets_per_fec_group(2); |
EXPECT_FALSE(creator_->IsFecProtected()); |