| 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());
|
|
|
|
|