Index: net/quic/quic_sent_packet_manager_test.cc |
diff --git a/net/quic/quic_sent_packet_manager_test.cc b/net/quic/quic_sent_packet_manager_test.cc |
index 26e5bf5deadeaf73a278726e7df8d81d8b6d9791..e9b169b7f3a33c5182e018e47f453e6beaa63ae5 100644 |
--- a/net/quic/quic_sent_packet_manager_test.cc |
+++ b/net/quic/quic_sent_packet_manager_test.cc |
@@ -16,6 +16,7 @@ using std::vector; |
using testing::AnyNumber; |
using testing::ElementsAre; |
using testing::IsEmpty; |
+using testing::Not; |
using testing::Pair; |
using testing::Pointwise; |
using testing::Return; |
@@ -1136,7 +1137,7 @@ TEST_F(QuicSentPacketManagerTest, RetransmissionTimeout) { |
// Ensure no packets are lost. |
EXPECT_CALL(*send_algorithm_, |
OnCongestionEvent(true, _, ElementsAre(Pair(102, _)), |
- IsEmpty()) /*lost_packets=*/); |
+ /*lost_packets=*/IsEmpty())); |
EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); |
EXPECT_CALL(*network_change_visitor_, OnRttChange()); |
if (FLAGS_quic_use_new_rto) { |
@@ -1145,6 +1146,50 @@ TEST_F(QuicSentPacketManagerTest, RetransmissionTimeout) { |
manager_.OnIncomingAck(ack_frame, clock_.Now()); |
} |
+TEST_F(QuicSentPacketManagerTest, NewRetransmissionTimeout) { |
+ ValueRestore<bool> old_flag(&FLAGS_quic_use_new_rto, true); |
+ QuicConfig client_config; |
+ QuicTagVector options; |
+ options.push_back(kNRTO); |
+ QuicSentPacketManagerPeer::SetIsServer(&manager_, false); |
+ client_config.SetConnectionOptionsToSend(options); |
+ EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); |
+ EXPECT_CALL(*network_change_visitor_, OnRttChange()); |
+ EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _, _)); |
+ manager_.SetFromConfig(client_config); |
+ EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_)); |
+ |
+ // Send 100 packets. |
+ const size_t kNumSentPackets = 100; |
+ for (size_t i = 1; i <= kNumSentPackets; ++i) { |
+ SendDataPacket(i); |
+ } |
+ |
+ EXPECT_FALSE(manager_.MaybeRetransmitTailLossProbe()); |
+ manager_.OnRetransmissionTimeout(); |
+ EXPECT_TRUE(manager_.HasPendingRetransmissions()); |
+ EXPECT_EQ(100 * kDefaultLength, |
+ QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); |
+ RetransmitNextPacket(101); |
+ RetransmitNextPacket(102); |
+ EXPECT_FALSE(manager_.HasPendingRetransmissions()); |
+ |
+ // Ack a retransmission and expect no call to OnRetransmissionTimeout. |
+ QuicAckFrame ack_frame; |
+ ack_frame.delta_time_largest_observed = QuicTime::Delta::Zero(); |
+ ack_frame.largest_observed = 102; |
+ for (int i = 0; i < 102; ++i) { |
+ ack_frame.missing_packets.insert(i); |
+ } |
+ // This will include packets in the lost packet map. |
+ EXPECT_CALL(*send_algorithm_, |
+ OnCongestionEvent(true, _, ElementsAre(Pair(102, _)), |
+ /*lost_packets=*/Not(IsEmpty()))); |
+ EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); |
+ EXPECT_CALL(*network_change_visitor_, OnRttChange()); |
+ manager_.OnIncomingAck(ack_frame, clock_.Now()); |
+} |
+ |
TEST_F(QuicSentPacketManagerTest, TwoRetransmissionTimeoutsAckSecond) { |
// Send 1 packet. |
SendDataPacket(1); |
@@ -1611,6 +1656,35 @@ TEST_F(QuicSentPacketManagerTest, NegotiateNoTLPFromOptionsAtClient) { |
EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_)); |
} |
+TEST_F(QuicSentPacketManagerTest, NegotiateNewRTOFromOptionsAtServer) { |
+ EXPECT_FALSE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_)); |
+ QuicConfig config; |
+ QuicTagVector options; |
+ |
+ options.push_back(kNRTO); |
+ QuicConfigPeer::SetReceivedConnectionOptions(&config, options); |
+ EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); |
+ EXPECT_CALL(*network_change_visitor_, OnRttChange()); |
+ EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _, _)); |
+ manager_.SetFromConfig(config); |
+ EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_)); |
+} |
+ |
+TEST_F(QuicSentPacketManagerTest, NegotiateNewRTOFromOptionsAtClient) { |
+ EXPECT_FALSE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_)); |
+ QuicConfig client_config; |
+ QuicTagVector options; |
+ |
+ options.push_back(kNRTO); |
+ QuicSentPacketManagerPeer::SetIsServer(&manager_, false); |
+ client_config.SetConnectionOptionsToSend(options); |
+ EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); |
+ EXPECT_CALL(*network_change_visitor_, OnRttChange()); |
+ EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _, _)); |
+ manager_.SetFromConfig(client_config); |
+ EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_)); |
+} |
+ |
TEST_F(QuicSentPacketManagerTest, NegotiatePacingFromOptions) { |
EXPECT_FALSE(manager_.using_pacing()); |