OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/quic/quic_connection.h" | 5 #include "net/quic/quic_connection.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
10 #include "net/base/net_errors.h" | 10 #include "net/base/net_errors.h" |
(...skipping 1743 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1754 // packet is retransmitted, and this retransmission (but not FEC) gets added | 1754 // packet is retransmitted, and this retransmission (but not FEC) gets added |
1755 // back into the inflight. | 1755 // back into the inflight. |
1756 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | 1756 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); |
1757 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); | 1757 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
1758 connection_.GetRetransmissionAlarm()->Fire(); | 1758 connection_.GetRetransmissionAlarm()->Fire(); |
1759 | 1759 |
1760 // The retransmission of packet 1 will be 3 bytes smaller than packet 1, since | 1760 // The retransmission of packet 1 will be 3 bytes smaller than packet 1, since |
1761 // the first transmission will have 1 byte for FEC group number and 2 bytes of | 1761 // the first transmission will have 1 byte for FEC group number and 2 bytes of |
1762 // stream frame size, which are absent in the retransmission. | 1762 // stream frame size, which are absent in the retransmission. |
1763 size_t retransmitted_packet = protected_packet - 3; | 1763 size_t retransmitted_packet = protected_packet - 3; |
1764 EXPECT_EQ(retransmitted_packet, | 1764 if (FLAGS_quic_use_new_rto) { |
1765 QuicSentPacketManagerPeer::GetBytesInFlight(manager_)); | 1765 EXPECT_EQ(protected_packet + retransmitted_packet, |
| 1766 QuicSentPacketManagerPeer::GetBytesInFlight(manager_)); |
| 1767 } else { |
| 1768 EXPECT_EQ(retransmitted_packet, |
| 1769 QuicSentPacketManagerPeer::GetBytesInFlight(manager_)); |
| 1770 } |
1766 EXPECT_FALSE(connection_.GetFecAlarm()->IsSet()); | 1771 EXPECT_FALSE(connection_.GetFecAlarm()->IsSet()); |
1767 | 1772 |
1768 // Receive ack for the retransmission. No data should be outstanding. | 1773 // Receive ack for the retransmission. No data should be outstanding. |
1769 QuicAckFrame ack = InitAckFrame(3); | 1774 QuicAckFrame ack = InitAckFrame(3); |
1770 NackPacket(1, &ack); | 1775 NackPacket(1, &ack); |
1771 NackPacket(2, &ack); | 1776 NackPacket(2, &ack); |
1772 SequenceNumberSet lost_packets; | 1777 SequenceNumberSet lost_packets; |
| 1778 if (FLAGS_quic_use_new_rto) { |
| 1779 lost_packets.insert(1); |
| 1780 } |
1773 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _)) | 1781 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _)) |
1774 .WillOnce(Return(lost_packets)); | 1782 .WillOnce(Return(lost_packets)); |
1775 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); | 1783 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); |
1776 ProcessAckPacket(&ack); | 1784 ProcessAckPacket(&ack); |
1777 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetBytesInFlight(manager_)); | |
1778 | 1785 |
1779 // Ensure the alarm is not set since all packets have been acked or abandoned. | 1786 // Ensure the alarm is not set since all packets have been acked or abandoned. |
1780 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet()); | 1787 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet()); |
1781 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetBytesInFlight(manager_)); | 1788 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetBytesInFlight(manager_)); |
1782 } | 1789 } |
1783 | 1790 |
1784 TEST_P(QuicConnectionTest, RemoveFECFromInflightOnLossRetransmission) { | 1791 TEST_P(QuicConnectionTest, RemoveFECFromInflightOnLossRetransmission) { |
1785 EXPECT_TRUE(creator_->IsFecEnabled()); | 1792 EXPECT_TRUE(creator_->IsFecEnabled()); |
1786 EXPECT_FALSE(connection_.GetFecAlarm()->IsSet()); | 1793 EXPECT_FALSE(connection_.GetFecAlarm()->IsSet()); |
1787 | 1794 |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1992 ProcessAckPacket(&ack); | 1999 ProcessAckPacket(&ack); |
1993 | 2000 |
1994 // No TLP alarm for FEC, but retransmission alarm should be set for an RTO. | 2001 // No TLP alarm for FEC, but retransmission alarm should be set for an RTO. |
1995 EXPECT_LT(0u, QuicSentPacketManagerPeer::GetBytesInFlight(manager_)); | 2002 EXPECT_LT(0u, QuicSentPacketManagerPeer::GetBytesInFlight(manager_)); |
1996 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); | 2003 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); |
1997 QuicTime rto_time = connection_.GetRetransmissionAlarm()->deadline(); | 2004 QuicTime rto_time = connection_.GetRetransmissionAlarm()->deadline(); |
1998 EXPECT_NE(QuicTime::Zero(), rto_time); | 2005 EXPECT_NE(QuicTime::Zero(), rto_time); |
1999 | 2006 |
2000 // Simulate the retransmission alarm firing. FEC packet is no longer | 2007 // Simulate the retransmission alarm firing. FEC packet is no longer |
2001 // outstanding. | 2008 // outstanding. |
2002 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(false)); | 2009 if (!FLAGS_quic_use_new_rto) { |
| 2010 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(false)); |
| 2011 } |
2003 clock_.AdvanceTime(rto_time.Subtract(clock_.Now())); | 2012 clock_.AdvanceTime(rto_time.Subtract(clock_.Now())); |
2004 connection_.GetRetransmissionAlarm()->Fire(); | 2013 connection_.GetRetransmissionAlarm()->Fire(); |
| 2014 |
2005 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet()); | 2015 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet()); |
2006 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetBytesInFlight(manager_)); | 2016 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetBytesInFlight(manager_)); |
2007 } | 2017 } |
2008 | 2018 |
2009 TEST_P(QuicConnectionTest, FramePacking) { | 2019 TEST_P(QuicConnectionTest, FramePacking) { |
2010 CongestionBlockWrites(); | 2020 CongestionBlockWrites(); |
2011 | 2021 |
2012 // Send an ack and two stream frames in 1 packet by queueing them. | 2022 // Send an ack and two stream frames in 1 packet by queueing them. |
2013 connection_.SendAck(); | 2023 connection_.SendAck(); |
2014 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll( | 2024 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll( |
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2319 OnPacketSent(_, _, _, packet_size - kQuicVersionSize, _)); | 2329 OnPacketSent(_, _, _, packet_size - kQuicVersionSize, _)); |
2320 ProcessAckPacket(&frame); | 2330 ProcessAckPacket(&frame); |
2321 } | 2331 } |
2322 | 2332 |
2323 TEST_P(QuicConnectionTest, QueueAfterTwoRTOs) { | 2333 TEST_P(QuicConnectionTest, QueueAfterTwoRTOs) { |
2324 for (int i = 0; i < 10; ++i) { | 2334 for (int i = 0; i < 10; ++i) { |
2325 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); | 2335 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
2326 connection_.SendStreamDataWithString(3, "foo", i * 3, !kFin, nullptr); | 2336 connection_.SendStreamDataWithString(3, "foo", i * 3, !kFin, nullptr); |
2327 } | 2337 } |
2328 | 2338 |
2329 // Block the congestion window and ensure they're queued. | 2339 // Block the writer and ensure they're queued. |
2330 BlockOnNextWrite(); | 2340 BlockOnNextWrite(); |
2331 clock_.AdvanceTime(DefaultRetransmissionTime()); | 2341 clock_.AdvanceTime(DefaultRetransmissionTime()); |
2332 // Only one packet should be retransmitted. | 2342 // Only one packet should be retransmitted. |
2333 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | 2343 if (!FLAGS_quic_use_new_rto) { |
| 2344 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); |
| 2345 } |
2334 connection_.GetRetransmissionAlarm()->Fire(); | 2346 connection_.GetRetransmissionAlarm()->Fire(); |
2335 EXPECT_TRUE(connection_.HasQueuedData()); | 2347 EXPECT_TRUE(connection_.HasQueuedData()); |
2336 | 2348 |
2337 // Unblock the congestion window. | 2349 // Unblock the writer. |
2338 writer_->SetWritable(); | 2350 writer_->SetWritable(); |
2339 clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds( | 2351 clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds( |
2340 2 * DefaultRetransmissionTime().ToMicroseconds())); | 2352 2 * DefaultRetransmissionTime().ToMicroseconds())); |
2341 // Retransmit already retransmitted packets event though the sequence number | 2353 // Retransmit already retransmitted packets event though the sequence number |
2342 // greater than the largest observed. | 2354 // greater than the largest observed. |
2343 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(10); | 2355 if (FLAGS_quic_use_new_rto) { |
| 2356 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); |
| 2357 } else { |
| 2358 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(10); |
| 2359 } |
2344 connection_.GetRetransmissionAlarm()->Fire(); | 2360 connection_.GetRetransmissionAlarm()->Fire(); |
2345 connection_.OnCanWrite(); | 2361 connection_.OnCanWrite(); |
2346 } | 2362 } |
2347 | 2363 |
2348 TEST_P(QuicConnectionTest, WriteBlockedThenSent) { | 2364 TEST_P(QuicConnectionTest, WriteBlockedThenSent) { |
2349 BlockOnNextWrite(); | 2365 BlockOnNextWrite(); |
2350 writer_->set_is_write_blocked_data_buffered(true); | 2366 writer_->set_is_write_blocked_data_buffered(true); |
2351 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); | 2367 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
2352 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, nullptr); | 2368 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, nullptr); |
2353 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); | 2369 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); |
2354 | 2370 |
2355 writer_->SetWritable(); | 2371 writer_->SetWritable(); |
2356 connection_.OnCanWrite(); | 2372 connection_.OnCanWrite(); |
2357 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); | 2373 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); |
2358 } | 2374 } |
2359 | 2375 |
2360 TEST_P(QuicConnectionTest, RetransmitWriteBlockedAckedOriginalThenSent) { | 2376 TEST_P(QuicConnectionTest, RetransmitWriteBlockedAckedOriginalThenSent) { |
2361 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2377 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
2362 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, nullptr); | 2378 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, nullptr); |
2363 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); | 2379 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); |
2364 | 2380 |
2365 BlockOnNextWrite(); | 2381 BlockOnNextWrite(); |
2366 writer_->set_is_write_blocked_data_buffered(true); | 2382 writer_->set_is_write_blocked_data_buffered(true); |
2367 // Simulate the retransmission alarm firing. | 2383 // Simulate the retransmission alarm firing. |
2368 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(_)); | 2384 if (!FLAGS_quic_use_new_rto) { |
| 2385 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(_)); |
| 2386 } |
2369 clock_.AdvanceTime(DefaultRetransmissionTime()); | 2387 clock_.AdvanceTime(DefaultRetransmissionTime()); |
2370 connection_.GetRetransmissionAlarm()->Fire(); | 2388 connection_.GetRetransmissionAlarm()->Fire(); |
2371 | 2389 |
2372 // Ack the sent packet before the callback returns, which happens in | 2390 // Ack the sent packet before the callback returns, which happens in |
2373 // rare circumstances with write blocked sockets. | 2391 // rare circumstances with write blocked sockets. |
2374 QuicAckFrame ack = InitAckFrame(1); | 2392 QuicAckFrame ack = InitAckFrame(1); |
2375 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); | 2393 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); |
2376 EXPECT_CALL(*send_algorithm_, RevertRetransmissionTimeout()); | 2394 if (!FLAGS_quic_use_new_rto) { |
| 2395 EXPECT_CALL(*send_algorithm_, RevertRetransmissionTimeout()); |
| 2396 } |
2377 ProcessAckPacket(&ack); | 2397 ProcessAckPacket(&ack); |
2378 | 2398 |
2379 writer_->SetWritable(); | 2399 writer_->SetWritable(); |
2380 connection_.OnCanWrite(); | 2400 connection_.OnCanWrite(); |
2381 // There is now a pending packet, but with no retransmittable frames. | 2401 // There is now a pending packet, but with no retransmittable frames. |
2382 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); | 2402 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); |
2383 EXPECT_FALSE(connection_.sent_packet_manager().HasRetransmittableFrames(2)); | 2403 EXPECT_FALSE(connection_.sent_packet_manager().HasRetransmittableFrames(2)); |
2384 } | 2404 } |
2385 | 2405 |
2386 TEST_P(QuicConnectionTest, AlarmsWhenWriteBlocked) { | 2406 TEST_P(QuicConnectionTest, AlarmsWhenWriteBlocked) { |
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2651 QuicTime default_retransmission_time = clock_.ApproximateNow().Add( | 2671 QuicTime default_retransmission_time = clock_.ApproximateNow().Add( |
2652 DefaultRetransmissionTime()); | 2672 DefaultRetransmissionTime()); |
2653 SendStreamDataToPeer(3, "foo", 0, !kFin, nullptr); | 2673 SendStreamDataToPeer(3, "foo", 0, !kFin, nullptr); |
2654 EXPECT_EQ(1u, stop_waiting()->least_unacked); | 2674 EXPECT_EQ(1u, stop_waiting()->least_unacked); |
2655 | 2675 |
2656 EXPECT_EQ(1u, writer_->header().packet_sequence_number); | 2676 EXPECT_EQ(1u, writer_->header().packet_sequence_number); |
2657 EXPECT_EQ(default_retransmission_time, | 2677 EXPECT_EQ(default_retransmission_time, |
2658 connection_.GetRetransmissionAlarm()->deadline()); | 2678 connection_.GetRetransmissionAlarm()->deadline()); |
2659 // Simulate the retransmission alarm firing. | 2679 // Simulate the retransmission alarm firing. |
2660 clock_.AdvanceTime(DefaultRetransmissionTime()); | 2680 clock_.AdvanceTime(DefaultRetransmissionTime()); |
2661 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | 2681 if (!FLAGS_quic_use_new_rto) { |
| 2682 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); |
| 2683 } |
2662 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 2u, _, _)); | 2684 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 2u, _, _)); |
2663 connection_.GetRetransmissionAlarm()->Fire(); | 2685 connection_.GetRetransmissionAlarm()->Fire(); |
2664 EXPECT_EQ(2u, writer_->header().packet_sequence_number); | 2686 EXPECT_EQ(2u, writer_->header().packet_sequence_number); |
2665 // We do not raise the high water mark yet. | 2687 // We do not raise the high water mark yet. |
2666 EXPECT_EQ(1u, stop_waiting()->least_unacked); | 2688 EXPECT_EQ(1u, stop_waiting()->least_unacked); |
2667 } | 2689 } |
2668 | 2690 |
2669 TEST_P(QuicConnectionTest, RTOWithSameEncryptionLevel) { | 2691 TEST_P(QuicConnectionTest, RTOWithSameEncryptionLevel) { |
2670 QuicTime default_retransmission_time = clock_.ApproximateNow().Add( | 2692 QuicTime default_retransmission_time = clock_.ApproximateNow().Add( |
2671 DefaultRetransmissionTime()); | 2693 DefaultRetransmissionTime()); |
2672 use_tagging_decrypter(); | 2694 use_tagging_decrypter(); |
2673 | 2695 |
2674 // A TaggingEncrypter puts kTagSize copies of the given byte (0x01 here) at | 2696 // A TaggingEncrypter puts kTagSize copies of the given byte (0x01 here) at |
2675 // the end of the packet. We can test this to check which encrypter was used. | 2697 // the end of the packet. We can test this to check which encrypter was used. |
2676 connection_.SetEncrypter(ENCRYPTION_NONE, new TaggingEncrypter(0x01)); | 2698 connection_.SetEncrypter(ENCRYPTION_NONE, new TaggingEncrypter(0x01)); |
2677 SendStreamDataToPeer(3, "foo", 0, !kFin, nullptr); | 2699 SendStreamDataToPeer(3, "foo", 0, !kFin, nullptr); |
2678 EXPECT_EQ(0x01010101u, writer_->final_bytes_of_last_packet()); | 2700 EXPECT_EQ(0x01010101u, writer_->final_bytes_of_last_packet()); |
2679 | 2701 |
2680 connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(0x02)); | 2702 connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(0x02)); |
2681 connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL); | 2703 connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL); |
2682 SendStreamDataToPeer(3, "foo", 0, !kFin, nullptr); | 2704 SendStreamDataToPeer(3, "foo", 0, !kFin, nullptr); |
2683 EXPECT_EQ(0x02020202u, writer_->final_bytes_of_last_packet()); | 2705 EXPECT_EQ(0x02020202u, writer_->final_bytes_of_last_packet()); |
2684 | 2706 |
2685 EXPECT_EQ(default_retransmission_time, | 2707 EXPECT_EQ(default_retransmission_time, |
2686 connection_.GetRetransmissionAlarm()->deadline()); | 2708 connection_.GetRetransmissionAlarm()->deadline()); |
2687 { | 2709 { |
2688 InSequence s; | 2710 InSequence s; |
2689 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | 2711 if (!FLAGS_quic_use_new_rto) { |
| 2712 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); |
| 2713 } |
2690 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 3, _, _)); | 2714 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 3, _, _)); |
2691 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 4, _, _)); | 2715 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 4, _, _)); |
2692 } | 2716 } |
2693 | 2717 |
2694 // Simulate the retransmission alarm firing. | 2718 // Simulate the retransmission alarm firing. |
2695 clock_.AdvanceTime(DefaultRetransmissionTime()); | 2719 clock_.AdvanceTime(DefaultRetransmissionTime()); |
2696 connection_.GetRetransmissionAlarm()->Fire(); | 2720 connection_.GetRetransmissionAlarm()->Fire(); |
2697 | 2721 |
2698 // Packet should have been sent with ENCRYPTION_NONE. | 2722 // Packet should have been sent with ENCRYPTION_NONE. |
2699 EXPECT_EQ(0x01010101u, writer_->final_bytes_of_previous_packet()); | 2723 EXPECT_EQ(0x01010101u, writer_->final_bytes_of_previous_packet()); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2733 | 2757 |
2734 TEST_P(QuicConnectionTest, | 2758 TEST_P(QuicConnectionTest, |
2735 DropRetransmitsForNullEncryptedPacketAfterForwardSecure) { | 2759 DropRetransmitsForNullEncryptedPacketAfterForwardSecure) { |
2736 use_tagging_decrypter(); | 2760 use_tagging_decrypter(); |
2737 connection_.SetEncrypter(ENCRYPTION_NONE, new TaggingEncrypter(0x01)); | 2761 connection_.SetEncrypter(ENCRYPTION_NONE, new TaggingEncrypter(0x01)); |
2738 QuicPacketSequenceNumber sequence_number; | 2762 QuicPacketSequenceNumber sequence_number; |
2739 SendStreamDataToPeer(3, "foo", 0, !kFin, &sequence_number); | 2763 SendStreamDataToPeer(3, "foo", 0, !kFin, &sequence_number); |
2740 | 2764 |
2741 // Simulate the retransmission alarm firing and the socket blocking. | 2765 // Simulate the retransmission alarm firing and the socket blocking. |
2742 BlockOnNextWrite(); | 2766 BlockOnNextWrite(); |
2743 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | 2767 if (!FLAGS_quic_use_new_rto) { |
| 2768 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); |
| 2769 } |
2744 clock_.AdvanceTime(DefaultRetransmissionTime()); | 2770 clock_.AdvanceTime(DefaultRetransmissionTime()); |
2745 connection_.GetRetransmissionAlarm()->Fire(); | 2771 connection_.GetRetransmissionAlarm()->Fire(); |
2746 | 2772 |
2747 // Go forward secure. | 2773 // Go forward secure. |
2748 connection_.SetEncrypter(ENCRYPTION_FORWARD_SECURE, | 2774 connection_.SetEncrypter(ENCRYPTION_FORWARD_SECURE, |
2749 new TaggingEncrypter(0x02)); | 2775 new TaggingEncrypter(0x02)); |
2750 connection_.SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE); | 2776 connection_.SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE); |
2751 connection_.NeuterUnencryptedPackets(); | 2777 connection_.NeuterUnencryptedPackets(); |
2752 | 2778 |
2753 EXPECT_EQ(QuicTime::Zero(), | 2779 EXPECT_EQ(QuicTime::Zero(), |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2895 DoAll(SaveArg<3>(&first_packet_size), Return(true))); | 2921 DoAll(SaveArg<3>(&first_packet_size), Return(true))); |
2896 | 2922 |
2897 connection_.SendStreamDataWithString(3, "first_packet", 0, !kFin, nullptr); | 2923 connection_.SendStreamDataWithString(3, "first_packet", 0, !kFin, nullptr); |
2898 QuicByteCount second_packet_size; | 2924 QuicByteCount second_packet_size; |
2899 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).WillOnce( | 2925 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).WillOnce( |
2900 DoAll(SaveArg<3>(&second_packet_size), Return(true))); | 2926 DoAll(SaveArg<3>(&second_packet_size), Return(true))); |
2901 connection_.SendStreamDataWithString(3, "second_packet", 12, !kFin, nullptr); | 2927 connection_.SendStreamDataWithString(3, "second_packet", 12, !kFin, nullptr); |
2902 EXPECT_NE(first_packet_size, second_packet_size); | 2928 EXPECT_NE(first_packet_size, second_packet_size); |
2903 // Advance the clock by huge time to make sure packets will be retransmitted. | 2929 // Advance the clock by huge time to make sure packets will be retransmitted. |
2904 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(10)); | 2930 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(10)); |
2905 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | 2931 if (!FLAGS_quic_use_new_rto) { |
| 2932 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); |
| 2933 } |
2906 { | 2934 { |
2907 InSequence s; | 2935 InSequence s; |
2908 EXPECT_CALL(*send_algorithm_, | 2936 EXPECT_CALL(*send_algorithm_, |
2909 OnPacketSent(_, _, _, first_packet_size, _)); | 2937 OnPacketSent(_, _, _, first_packet_size, _)); |
2910 EXPECT_CALL(*send_algorithm_, | 2938 EXPECT_CALL(*send_algorithm_, |
2911 OnPacketSent(_, _, _, second_packet_size, _)); | 2939 OnPacketSent(_, _, _, second_packet_size, _)); |
2912 } | 2940 } |
2913 connection_.GetRetransmissionAlarm()->Fire(); | 2941 connection_.GetRetransmissionAlarm()->Fire(); |
2914 | 2942 |
2915 // Advance again and expect the packets to be sent again in the same order. | 2943 // Advance again and expect the packets to be sent again in the same order. |
2916 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(20)); | 2944 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(20)); |
2917 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | 2945 if (!FLAGS_quic_use_new_rto) { |
| 2946 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); |
| 2947 } |
2918 { | 2948 { |
2919 InSequence s; | 2949 InSequence s; |
2920 EXPECT_CALL(*send_algorithm_, | 2950 EXPECT_CALL(*send_algorithm_, |
2921 OnPacketSent(_, _, _, first_packet_size, _)); | 2951 OnPacketSent(_, _, _, first_packet_size, _)); |
2922 EXPECT_CALL(*send_algorithm_, | 2952 EXPECT_CALL(*send_algorithm_, |
2923 OnPacketSent(_, _, _, second_packet_size, _)); | 2953 OnPacketSent(_, _, _, second_packet_size, _)); |
2924 } | 2954 } |
2925 connection_.GetRetransmissionAlarm()->Fire(); | 2955 connection_.GetRetransmissionAlarm()->Fire(); |
2926 } | 2956 } |
2927 | 2957 |
2928 TEST_P(QuicConnectionTest, RetransmissionCountCalculation) { | |
2929 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | |
2930 QuicPacketSequenceNumber original_sequence_number; | |
2931 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | |
2932 .WillOnce(DoAll(SaveArg<2>(&original_sequence_number), Return(true))); | |
2933 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, nullptr); | |
2934 | |
2935 EXPECT_TRUE(QuicConnectionPeer::IsSavedForRetransmission( | |
2936 &connection_, original_sequence_number)); | |
2937 EXPECT_FALSE(QuicConnectionPeer::IsRetransmission( | |
2938 &connection_, original_sequence_number)); | |
2939 // Force retransmission due to RTO. | |
2940 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(10)); | |
2941 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | |
2942 QuicPacketSequenceNumber rto_sequence_number; | |
2943 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | |
2944 .WillOnce(DoAll(SaveArg<2>(&rto_sequence_number), Return(true))); | |
2945 connection_.GetRetransmissionAlarm()->Fire(); | |
2946 EXPECT_FALSE(QuicConnectionPeer::IsSavedForRetransmission( | |
2947 &connection_, original_sequence_number)); | |
2948 ASSERT_TRUE(QuicConnectionPeer::IsSavedForRetransmission( | |
2949 &connection_, rto_sequence_number)); | |
2950 EXPECT_TRUE(QuicConnectionPeer::IsRetransmission( | |
2951 &connection_, rto_sequence_number)); | |
2952 // Once by explicit nack. | |
2953 SequenceNumberSet lost_packets; | |
2954 lost_packets.insert(rto_sequence_number); | |
2955 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _)) | |
2956 .WillOnce(Return(lost_packets)); | |
2957 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); | |
2958 QuicPacketSequenceNumber nack_sequence_number = 0; | |
2959 // Ack packets might generate some other packets, which are not | |
2960 // retransmissions. (More ack packets). | |
2961 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | |
2962 .Times(AnyNumber()); | |
2963 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | |
2964 .WillOnce(DoAll(SaveArg<2>(&nack_sequence_number), Return(true))); | |
2965 QuicAckFrame ack = InitAckFrame(rto_sequence_number); | |
2966 // Nack the retransmitted packet. | |
2967 NackPacket(original_sequence_number, &ack); | |
2968 NackPacket(rto_sequence_number, &ack); | |
2969 ProcessAckPacket(&ack); | |
2970 | |
2971 ASSERT_NE(0u, nack_sequence_number); | |
2972 EXPECT_FALSE(QuicConnectionPeer::IsSavedForRetransmission( | |
2973 &connection_, rto_sequence_number)); | |
2974 ASSERT_TRUE(QuicConnectionPeer::IsSavedForRetransmission( | |
2975 &connection_, nack_sequence_number)); | |
2976 EXPECT_TRUE(QuicConnectionPeer::IsRetransmission( | |
2977 &connection_, nack_sequence_number)); | |
2978 } | |
2979 | |
2980 TEST_P(QuicConnectionTest, SetRTOAfterWritingToSocket) { | 2958 TEST_P(QuicConnectionTest, SetRTOAfterWritingToSocket) { |
2981 BlockOnNextWrite(); | 2959 BlockOnNextWrite(); |
2982 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, nullptr); | 2960 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, nullptr); |
2983 // Make sure that RTO is not started when the packet is queued. | 2961 // Make sure that RTO is not started when the packet is queued. |
2984 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet()); | 2962 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet()); |
2985 | 2963 |
2986 // Test that RTO is started once we write to the socket. | 2964 // Test that RTO is started once we write to the socket. |
2987 writer_->SetWritable(); | 2965 writer_->SetWritable(); |
2988 connection_.OnCanWrite(); | 2966 connection_.OnCanWrite(); |
2989 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); | 2967 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); |
(...skipping 18 matching lines...) Expand all Loading... |
3008 ProcessAckPacket(&ack); | 2986 ProcessAckPacket(&ack); |
3009 EXPECT_TRUE(retransmission_alarm->IsSet()); | 2987 EXPECT_TRUE(retransmission_alarm->IsSet()); |
3010 EXPECT_GT(retransmission_alarm->deadline(), clock_.Now()); | 2988 EXPECT_GT(retransmission_alarm->deadline(), clock_.Now()); |
3011 | 2989 |
3012 // Move forward past the original RTO and ensure the RTO is still pending. | 2990 // Move forward past the original RTO and ensure the RTO is still pending. |
3013 clock_.AdvanceTime(DefaultRetransmissionTime().Multiply(2)); | 2991 clock_.AdvanceTime(DefaultRetransmissionTime().Multiply(2)); |
3014 | 2992 |
3015 // Ensure the second packet gets retransmitted when it finally fires. | 2993 // Ensure the second packet gets retransmitted when it finally fires. |
3016 EXPECT_TRUE(retransmission_alarm->IsSet()); | 2994 EXPECT_TRUE(retransmission_alarm->IsSet()); |
3017 EXPECT_LT(retransmission_alarm->deadline(), clock_.ApproximateNow()); | 2995 EXPECT_LT(retransmission_alarm->deadline(), clock_.ApproximateNow()); |
3018 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | 2996 if (!FLAGS_quic_use_new_rto) { |
| 2997 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); |
| 2998 } |
3019 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); | 2999 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); |
3020 // Manually cancel the alarm to simulate a real test. | 3000 // Manually cancel the alarm to simulate a real test. |
3021 connection_.GetRetransmissionAlarm()->Fire(); | 3001 connection_.GetRetransmissionAlarm()->Fire(); |
3022 | 3002 |
3023 // The new retransmitted sequence number should set the RTO to a larger value | 3003 // The new retransmitted sequence number should set the RTO to a larger value |
3024 // than previously. | 3004 // than previously. |
3025 EXPECT_TRUE(retransmission_alarm->IsSet()); | 3005 EXPECT_TRUE(retransmission_alarm->IsSet()); |
3026 QuicTime next_rto_time = retransmission_alarm->deadline(); | 3006 QuicTime next_rto_time = retransmission_alarm->deadline(); |
3027 QuicTime expected_rto_time = | 3007 QuicTime expected_rto_time = |
3028 connection_.sent_packet_manager().GetRetransmissionTime(); | 3008 connection_.sent_packet_manager().GetRetransmissionTime(); |
(...skipping 956 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3985 NackPacket(3, &nack_three); | 3965 NackPacket(3, &nack_three); |
3986 NackPacket(1, &nack_three); | 3966 NackPacket(1, &nack_three); |
3987 SequenceNumberSet lost_packets; | 3967 SequenceNumberSet lost_packets; |
3988 lost_packets.insert(1); | 3968 lost_packets.insert(1); |
3989 lost_packets.insert(3); | 3969 lost_packets.insert(3); |
3990 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _)) | 3970 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _)) |
3991 .WillOnce(Return(lost_packets)); | 3971 .WillOnce(Return(lost_packets)); |
3992 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); | 3972 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); |
3993 EXPECT_CALL(visitor_, OnCanWrite()).Times(2); | 3973 EXPECT_CALL(visitor_, OnCanWrite()).Times(2); |
3994 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 3974 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
3995 EXPECT_CALL(*send_algorithm_, RevertRetransmissionTimeout()); | 3975 if (!FLAGS_quic_use_new_rto) { |
| 3976 EXPECT_CALL(*send_algorithm_, RevertRetransmissionTimeout()); |
| 3977 } |
3996 ProcessAckPacket(&nack_three); | 3978 ProcessAckPacket(&nack_three); |
3997 | 3979 |
3998 EXPECT_CALL(*send_algorithm_, BandwidthEstimate()).WillOnce( | 3980 EXPECT_CALL(*send_algorithm_, BandwidthEstimate()).WillOnce( |
3999 Return(QuicBandwidth::Zero())); | 3981 Return(QuicBandwidth::Zero())); |
4000 | 3982 |
4001 const QuicConnectionStats& stats = connection_.GetStats(); | 3983 const QuicConnectionStats& stats = connection_.GetStats(); |
4002 EXPECT_EQ(3 * first_packet_size + 2 * second_packet_size - kQuicVersionSize, | 3984 EXPECT_EQ(3 * first_packet_size + 2 * second_packet_size - kQuicVersionSize, |
4003 stats.bytes_sent); | 3985 stats.bytes_sent); |
4004 EXPECT_EQ(5u, stats.packets_sent); | 3986 EXPECT_EQ(5u, stats.packets_sent); |
4005 EXPECT_EQ(2 * first_packet_size + second_packet_size - kQuicVersionSize, | 3987 EXPECT_EQ(2 * first_packet_size + second_packet_size - kQuicVersionSize, |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4231 QuicTime default_retransmission_time = clock_.ApproximateNow().Add( | 4213 QuicTime default_retransmission_time = clock_.ApproximateNow().Add( |
4232 DefaultRetransmissionTime()); | 4214 DefaultRetransmissionTime()); |
4233 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, delegate.get()); | 4215 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, delegate.get()); |
4234 EXPECT_EQ(1u, stop_waiting()->least_unacked); | 4216 EXPECT_EQ(1u, stop_waiting()->least_unacked); |
4235 | 4217 |
4236 EXPECT_EQ(1u, writer_->header().packet_sequence_number); | 4218 EXPECT_EQ(1u, writer_->header().packet_sequence_number); |
4237 EXPECT_EQ(default_retransmission_time, | 4219 EXPECT_EQ(default_retransmission_time, |
4238 connection_.GetRetransmissionAlarm()->deadline()); | 4220 connection_.GetRetransmissionAlarm()->deadline()); |
4239 // Simulate the retransmission alarm firing. | 4221 // Simulate the retransmission alarm firing. |
4240 clock_.AdvanceTime(DefaultRetransmissionTime()); | 4222 clock_.AdvanceTime(DefaultRetransmissionTime()); |
4241 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | 4223 if (!FLAGS_quic_use_new_rto) { |
| 4224 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); |
| 4225 } |
4242 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 2u, _, _)); | 4226 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 2u, _, _)); |
4243 connection_.GetRetransmissionAlarm()->Fire(); | 4227 connection_.GetRetransmissionAlarm()->Fire(); |
4244 EXPECT_EQ(2u, writer_->header().packet_sequence_number); | 4228 EXPECT_EQ(2u, writer_->header().packet_sequence_number); |
4245 // We do not raise the high water mark yet. | 4229 // We do not raise the high water mark yet. |
4246 EXPECT_EQ(1u, stop_waiting()->least_unacked); | 4230 EXPECT_EQ(1u, stop_waiting()->least_unacked); |
4247 | 4231 |
4248 // Ack the original packet, which will revert the RTO. | 4232 // Ack the original packet, which will revert the RTO. |
4249 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 4233 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
4250 EXPECT_CALL(*delegate.get(), OnAckNotification(1, _, _)); | 4234 EXPECT_CALL(*delegate.get(), OnAckNotification(1, _, _)); |
4251 EXPECT_CALL(*send_algorithm_, RevertRetransmissionTimeout()); | 4235 if (!FLAGS_quic_use_new_rto) { |
| 4236 EXPECT_CALL(*send_algorithm_, RevertRetransmissionTimeout()); |
| 4237 } |
4252 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); | 4238 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); |
4253 QuicAckFrame ack_frame = InitAckFrame(1); | 4239 QuicAckFrame ack_frame = InitAckFrame(1); |
4254 ProcessAckPacket(&ack_frame); | 4240 ProcessAckPacket(&ack_frame); |
4255 | 4241 |
4256 // Delegate is not notified again when the retransmit is acked. | 4242 // Delegate is not notified again when the retransmit is acked. |
4257 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); | 4243 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); |
4258 QuicAckFrame second_ack_frame = InitAckFrame(2); | 4244 QuicAckFrame second_ack_frame = InitAckFrame(2); |
4259 ProcessAckPacket(&second_ack_frame); | 4245 ProcessAckPacket(&second_ack_frame); |
4260 } | 4246 } |
4261 | 4247 |
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4519 // Regression test for b/18594622 | 4505 // Regression test for b/18594622 |
4520 scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate); | 4506 scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate); |
4521 EXPECT_DFATAL( | 4507 EXPECT_DFATAL( |
4522 connection_.SendStreamDataWithString(3, "", 0, !kFin, delegate.get()), | 4508 connection_.SendStreamDataWithString(3, "", 0, !kFin, delegate.get()), |
4523 "Attempt to send empty stream frame"); | 4509 "Attempt to send empty stream frame"); |
4524 } | 4510 } |
4525 | 4511 |
4526 } // namespace | 4512 } // namespace |
4527 } // namespace test | 4513 } // namespace test |
4528 } // namespace net | 4514 } // namespace net |
OLD | NEW |