| 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 ffc11e5739377f2d5aedcc51b040be10230f5ce3..b44334090a9fc9a9587c5a26f7d4f0e189f35461 100644
|
| --- a/net/quic/quic_sent_packet_manager_test.cc
|
| +++ b/net/quic/quic_sent_packet_manager_test.cc
|
| @@ -22,6 +22,7 @@ using testing::Not;
|
| using testing::Pair;
|
| using testing::Pointwise;
|
| using testing::Return;
|
| +using testing::SetArgPointee;
|
| using testing::StrictMock;
|
| using testing::_;
|
|
|
| @@ -1548,6 +1549,73 @@ TEST_P(QuicSentPacketManagerTest, NegotiateNewRTOFromOptionsAtClient) {
|
| EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
|
| }
|
|
|
| +TEST_P(QuicSentPacketManagerTest, NegotiateUndoFromOptionsAtServer) {
|
| + FLAGS_quic_loss_recovery_use_largest_acked = true;
|
| + EXPECT_FALSE(QuicSentPacketManagerPeer::GetUndoRetransmits(&manager_));
|
| + QuicConfig config;
|
| + QuicTagVector options;
|
| +
|
| + options.push_back(kUNDO);
|
| + QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
|
| + EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
|
| + EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
|
| + manager_.SetFromConfig(config);
|
| + EXPECT_TRUE(QuicSentPacketManagerPeer::GetUndoRetransmits(&manager_));
|
| +
|
| + // Ensure undo works as intended.
|
| + // Send 5 packets, mark the first 4 for retransmission, and then cancel
|
| + // them when 1 is acked.
|
| + EXPECT_CALL(*send_algorithm_, PacingRate())
|
| + .WillRepeatedly(Return(QuicBandwidth::Zero()));
|
| + EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
|
| + .WillOnce(Return(10 * kDefaultTCPMSS));
|
| + const size_t kNumSentPackets = 5;
|
| + for (size_t i = 1; i <= kNumSentPackets; ++i) {
|
| + SendDataPacket(i);
|
| + }
|
| + MockLossAlgorithm* loss_algorithm = new MockLossAlgorithm();
|
| + QuicSentPacketManagerPeer::SetLossAlgorithm(&manager_, loss_algorithm);
|
| + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
|
| + EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
|
| + SendAlgorithmInterface::CongestionVector lost_packets;
|
| + for (size_t i = 1; i < kNumSentPackets; ++i) {
|
| + lost_packets.push_back(std::make_pair(i, kMaxPacketSize));
|
| + }
|
| + EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _))
|
| + .WillOnce(SetArgPointee<4>(lost_packets));
|
| + QuicAckFrame ack_frame = InitAckFrame(kNumSentPackets);
|
| + NackPackets(1, kNumSentPackets, &ack_frame);
|
| + // Congestion block the sending right before losing the packets.
|
| + EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _))
|
| + .WillRepeatedly(Return(QuicTime::Delta::Infinite()));
|
| + manager_.OnIncomingAck(ack_frame, clock_.Now());
|
| + EXPECT_TRUE(manager_.HasPendingRetransmissions());
|
| + EXPECT_EQ(0u, BytesInFlight());
|
| +
|
| + // Ack 1 and ensure the retransmissions are cancelled and put back in flight.
|
| + EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _));
|
| + ack_frame = InitAckFrame(5);
|
| + NackPackets(2, kNumSentPackets, &ack_frame);
|
| + manager_.OnIncomingAck(ack_frame, clock_.Now());
|
| + EXPECT_FALSE(manager_.HasPendingRetransmissions());
|
| + EXPECT_EQ(3u * kDefaultLength, BytesInFlight());
|
| +}
|
| +
|
| +TEST_P(QuicSentPacketManagerTest, NegotiateUndoFromOptionsAtClient) {
|
| + FLAGS_quic_loss_recovery_use_largest_acked = true;
|
| + EXPECT_FALSE(QuicSentPacketManagerPeer::GetUndoRetransmits(&manager_));
|
| + QuicConfig client_config;
|
| + QuicTagVector options;
|
| +
|
| + options.push_back(kUNDO);
|
| + QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
|
| + client_config.SetConnectionOptionsToSend(options);
|
| + EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
|
| + EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
|
| + manager_.SetFromConfig(client_config);
|
| + EXPECT_TRUE(QuicSentPacketManagerPeer::GetUndoRetransmits(&manager_));
|
| +}
|
| +
|
| TEST_P(QuicSentPacketManagerTest,
|
| NegotiateConservativeReceiveWindowFromOptions) {
|
| EXPECT_EQ(kDefaultSocketReceiveBuffer,
|
|
|