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 6275094d68a6c3f55b5eafea0e9612a237b7bb17..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; |
@@ -1127,17 +1128,63 @@ TEST_F(QuicSentPacketManagerTest, RetransmissionTimeout) { |
} |
// Ack a retransmission. |
+ 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); |
+ } |
+ // Ensure no packets are lost. |
+ EXPECT_CALL(*send_algorithm_, |
+ OnCongestionEvent(true, _, ElementsAre(Pair(102, _)), |
+ /*lost_packets=*/IsEmpty())); |
+ EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); |
+ EXPECT_CALL(*network_change_visitor_, OnRttChange()); |
if (FLAGS_quic_use_new_rto) { |
EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); |
} |
+ 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, _)), _)); |
+ 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()); |
@@ -1609,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()); |