| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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_sent_packet_manager.h" | 5 #include "net/quic/quic_sent_packet_manager.h" |
| 6 | 6 |
| 7 #include "base/stl_util.h" | 7 #include "base/stl_util.h" |
| 8 #include "net/quic/quic_flags.h" | 8 #include "net/quic/quic_flags.h" |
| 9 #include "net/quic/test_tools/quic_config_peer.h" | 9 #include "net/quic/test_tools/quic_config_peer.h" |
| 10 #include "net/quic/test_tools/quic_sent_packet_manager_peer.h" | 10 #include "net/quic/test_tools/quic_sent_packet_manager_peer.h" |
| (...skipping 589 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 600 VerifyUnackedPackets(unacked, arraysize(unacked)); | 600 VerifyUnackedPackets(unacked, arraysize(unacked)); |
| 601 QuicPacketSequenceNumber retransmittable[] = { 5 }; | 601 QuicPacketSequenceNumber retransmittable[] = { 5 }; |
| 602 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable)); | 602 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable)); |
| 603 } | 603 } |
| 604 | 604 |
| 605 TEST_F(QuicSentPacketManagerTest, AckPreviousTransmissionThenTruncatedAck) { | 605 TEST_F(QuicSentPacketManagerTest, AckPreviousTransmissionThenTruncatedAck) { |
| 606 SendDataPacket(1); | 606 SendDataPacket(1); |
| 607 RetransmitAndSendPacket(1, 2); | 607 RetransmitAndSendPacket(1, 2); |
| 608 RetransmitAndSendPacket(2, 3); | 608 RetransmitAndSendPacket(2, 3); |
| 609 RetransmitAndSendPacket(3, 4); | 609 RetransmitAndSendPacket(3, 4); |
| 610 manager_.OnSerializedPacket(CreateDataPacket(5)); | 610 SendDataPacket(5); |
| 611 manager_.OnSerializedPacket(CreateDataPacket(6)); | 611 SendDataPacket(6); |
| 612 manager_.OnSerializedPacket(CreateDataPacket(7)); | 612 SendDataPacket(7); |
| 613 manager_.OnSerializedPacket(CreateDataPacket(8)); | 613 SendDataPacket(8); |
| 614 manager_.OnSerializedPacket(CreateDataPacket(9)); | 614 SendDataPacket(9); |
| 615 | 615 |
| 616 // Ack previous transmission | 616 // Ack previous transmission |
| 617 { | 617 { |
| 618 QuicAckFrame ack_frame; | 618 QuicAckFrame ack_frame; |
| 619 ack_frame.largest_observed = 2; | 619 ack_frame.largest_observed = 2; |
| 620 ack_frame.missing_packets.insert(1); | 620 ack_frame.missing_packets.insert(1); |
| 621 ExpectAck(2); | 621 ExpectAck(2); |
| 622 manager_.OnIncomingAck(ack_frame, clock_.Now()); | 622 manager_.OnIncomingAck(ack_frame, clock_.Now()); |
| 623 EXPECT_TRUE(manager_.IsUnacked(4)); | 623 EXPECT_TRUE(manager_.IsUnacked(4)); |
| 624 } | 624 } |
| 625 | 625 |
| 626 // Truncated ack with 4 NACKs | 626 // Truncated ack with 4 NACKs |
| 627 { | 627 { |
| 628 QuicAckFrame ack_frame; | 628 QuicAckFrame ack_frame; |
| 629 ack_frame.largest_observed = 6; | 629 ack_frame.largest_observed = 6; |
| 630 ack_frame.missing_packets.insert(3); | 630 ack_frame.missing_packets.insert(3); |
| 631 ack_frame.missing_packets.insert(4); | 631 ack_frame.missing_packets.insert(4); |
| 632 ack_frame.missing_packets.insert(5); | 632 ack_frame.missing_packets.insert(5); |
| 633 ack_frame.missing_packets.insert(6); | 633 ack_frame.missing_packets.insert(6); |
| 634 ack_frame.is_truncated = true; | 634 ack_frame.is_truncated = true; |
| 635 ExpectAckAndLoss(false, 1, 3); | 635 ExpectAckAndLoss(true, 1, 3); |
| 636 manager_.OnIncomingAck(ack_frame, clock_.Now()); | 636 manager_.OnIncomingAck(ack_frame, clock_.Now()); |
| 637 } | 637 } |
| 638 | 638 |
| 639 // High water mark will be raised. | 639 // High water mark will be raised. |
| 640 QuicPacketSequenceNumber unacked[] = { 4, 5, 6, 7, 8, 9 }; | 640 QuicPacketSequenceNumber unacked[] = { 4, 5, 6, 7, 8, 9 }; |
| 641 VerifyUnackedPackets(unacked, arraysize(unacked)); | 641 VerifyUnackedPackets(unacked, arraysize(unacked)); |
| 642 QuicPacketSequenceNumber retransmittable[] = { 5, 6, 7, 8, 9 }; | 642 QuicPacketSequenceNumber retransmittable[] = { 5, 6, 7, 8, 9 }; |
| 643 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable)); | 643 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable)); |
| 644 } | 644 } |
| 645 | 645 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 657 TEST_F(QuicSentPacketManagerTest, GetLeastUnackedUnackedFec) { | 657 TEST_F(QuicSentPacketManagerTest, GetLeastUnackedUnackedFec) { |
| 658 SerializedPacket serialized_packet(CreateFecPacket(1)); | 658 SerializedPacket serialized_packet(CreateFecPacket(1)); |
| 659 | 659 |
| 660 manager_.OnSerializedPacket(serialized_packet); | 660 manager_.OnSerializedPacket(serialized_packet); |
| 661 EXPECT_EQ(1u, manager_.GetLeastUnacked()); | 661 EXPECT_EQ(1u, manager_.GetLeastUnacked()); |
| 662 } | 662 } |
| 663 | 663 |
| 664 TEST_F(QuicSentPacketManagerTest, GetLeastUnackedAndDiscard) { | 664 TEST_F(QuicSentPacketManagerTest, GetLeastUnackedAndDiscard) { |
| 665 VerifyUnackedPackets(NULL, 0); | 665 VerifyUnackedPackets(NULL, 0); |
| 666 | 666 |
| 667 SerializedPacket serialized_packet(CreateFecPacket(1)); | 667 SendFecPacket(1); |
| 668 manager_.OnSerializedPacket(serialized_packet); | |
| 669 EXPECT_EQ(1u, manager_.GetLeastUnacked()); | 668 EXPECT_EQ(1u, manager_.GetLeastUnacked()); |
| 670 | 669 |
| 671 SerializedPacket serialized_packet2(CreateFecPacket(2)); | 670 SendFecPacket(2); |
| 672 manager_.OnSerializedPacket(serialized_packet2); | |
| 673 EXPECT_EQ(1u, manager_.GetLeastUnacked()); | 671 EXPECT_EQ(1u, manager_.GetLeastUnacked()); |
| 674 | 672 |
| 675 SerializedPacket serialized_packet3(CreateFecPacket(3)); | 673 SendFecPacket(3); |
| 676 manager_.OnSerializedPacket(serialized_packet3); | |
| 677 EXPECT_EQ(1u, manager_.GetLeastUnacked()); | 674 EXPECT_EQ(1u, manager_.GetLeastUnacked()); |
| 678 | 675 |
| 679 QuicPacketSequenceNumber unacked[] = { 1, 2, 3 }; | 676 QuicPacketSequenceNumber unacked[] = { 1, 2, 3 }; |
| 680 VerifyUnackedPackets(unacked, arraysize(unacked)); | 677 VerifyUnackedPackets(unacked, arraysize(unacked)); |
| 681 VerifyRetransmittablePackets(NULL, 0); | 678 VerifyRetransmittablePackets(NULL, 0); |
| 682 | 679 |
| 683 // Ack 2, which has never been sent, so there's no rtt update. | 680 // Ack 2, so there's an rtt update. |
| 681 ExpectAck(2); |
| 684 QuicAckFrame ack_frame; | 682 QuicAckFrame ack_frame; |
| 685 ack_frame.largest_observed = 2; | 683 ack_frame.largest_observed = 2; |
| 684 ack_frame.missing_packets.insert(1); |
| 686 manager_.OnIncomingAck(ack_frame, clock_.Now()); | 685 manager_.OnIncomingAck(ack_frame, clock_.Now()); |
| 687 | 686 |
| 688 EXPECT_EQ(3u, manager_.GetLeastUnacked()); | 687 EXPECT_EQ(1u, manager_.GetLeastUnacked()); |
| 689 } | 688 } |
| 690 | 689 |
| 691 TEST_F(QuicSentPacketManagerTest, GetSentTime) { | 690 TEST_F(QuicSentPacketManagerTest, GetSentTime) { |
| 692 VerifyUnackedPackets(NULL, 0); | 691 VerifyUnackedPackets(NULL, 0); |
| 693 | 692 |
| 694 SerializedPacket serialized_packet(CreateFecPacket(1)); | 693 SerializedPacket serialized_packet(CreateFecPacket(1)); |
| 695 manager_.OnSerializedPacket(serialized_packet); | 694 manager_.OnSerializedPacket(serialized_packet); |
| 696 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _)) | 695 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _)) |
| 697 .Times(1).WillOnce(Return(true)); | 696 .Times(1).WillOnce(Return(true)); |
| 698 manager_.OnPacketSent(1, QuicTime::Zero(), kDefaultLength, NOT_RETRANSMISSION, | 697 manager_.OnPacketSent(1, QuicTime::Zero(), kDefaultLength, NOT_RETRANSMISSION, |
| (...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 968 | 967 |
| 969 // The first retransmission timeout retransmits 2 crypto packets. | 968 // The first retransmission timeout retransmits 2 crypto packets. |
| 970 manager_.OnRetransmissionTimeout(); | 969 manager_.OnRetransmissionTimeout(); |
| 971 RetransmitNextPacket(6); | 970 RetransmitNextPacket(6); |
| 972 RetransmitNextPacket(7); | 971 RetransmitNextPacket(7); |
| 973 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | 972 EXPECT_FALSE(manager_.HasPendingRetransmissions()); |
| 974 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | 973 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); |
| 975 | 974 |
| 976 // Now act like a version negotiation packet arrived, which would cause all | 975 // Now act like a version negotiation packet arrived, which would cause all |
| 977 // unacked packets to be retransmitted. | 976 // unacked packets to be retransmitted. |
| 978 manager_.RetransmitUnackedPackets(ALL_PACKETS); | 977 manager_.RetransmitUnackedPackets(ALL_UNACKED_RETRANSMISSION); |
| 979 | 978 |
| 980 // Ensure the first two pending packets are the crypto retransmits. | 979 // Ensure the first two pending packets are the crypto retransmits. |
| 981 ASSERT_TRUE(manager_.HasPendingRetransmissions()); | 980 ASSERT_TRUE(manager_.HasPendingRetransmissions()); |
| 982 EXPECT_EQ(6u, manager_.NextPendingRetransmission().sequence_number); | 981 EXPECT_EQ(6u, manager_.NextPendingRetransmission().sequence_number); |
| 983 RetransmitNextPacket(8); | 982 RetransmitNextPacket(8); |
| 984 EXPECT_EQ(7u, manager_.NextPendingRetransmission().sequence_number); | 983 EXPECT_EQ(7u, manager_.NextPendingRetransmission().sequence_number); |
| 985 RetransmitNextPacket(9); | 984 RetransmitNextPacket(9); |
| 986 | 985 |
| 987 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | 986 EXPECT_TRUE(manager_.HasPendingRetransmissions()); |
| 987 // Send 3 more data packets and ensure the least unacked is raised. |
| 988 RetransmitNextPacket(10); |
| 989 RetransmitNextPacket(11); |
| 990 RetransmitNextPacket(12); |
| 991 EXPECT_FALSE(manager_.HasPendingRetransmissions()); |
| 992 |
| 993 EXPECT_EQ(8u, manager_.GetLeastUnacked()); |
| 988 } | 994 } |
| 989 | 995 |
| 990 TEST_F(QuicSentPacketManagerTest, CryptoHandshakeSpuriousRetransmission) { | 996 TEST_F(QuicSentPacketManagerTest, CryptoHandshakeSpuriousRetransmission) { |
| 991 // Send 1 crypto packet. | 997 // Send 1 crypto packet. |
| 992 SendCryptoPacket(1); | 998 SendCryptoPacket(1); |
| 993 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | 999 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); |
| 994 | 1000 |
| 995 // Retransmit the crypto packet as 2. | 1001 // Retransmit the crypto packet as 2. |
| 996 manager_.OnRetransmissionTimeout(); | 1002 manager_.OnRetransmissionTimeout(); |
| 997 RetransmitNextPacket(2); | 1003 RetransmitNextPacket(2); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1036 // Send 1 crypto packet. | 1042 // Send 1 crypto packet. |
| 1037 SendCryptoPacket(1); | 1043 SendCryptoPacket(1); |
| 1038 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | 1044 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); |
| 1039 | 1045 |
| 1040 // Retransmit the crypto packet as 2. | 1046 // Retransmit the crypto packet as 2. |
| 1041 manager_.OnRetransmissionTimeout(); | 1047 manager_.OnRetransmissionTimeout(); |
| 1042 RetransmitNextPacket(2); | 1048 RetransmitNextPacket(2); |
| 1043 | 1049 |
| 1044 // Now retransmit all the unacked packets, which occurs when there is a | 1050 // Now retransmit all the unacked packets, which occurs when there is a |
| 1045 // version negotiation. | 1051 // version negotiation. |
| 1046 manager_.RetransmitUnackedPackets(ALL_PACKETS); | 1052 manager_.RetransmitUnackedPackets(ALL_UNACKED_RETRANSMISSION); |
| 1047 QuicPacketSequenceNumber unacked[] = { 1, 2 }; | 1053 QuicPacketSequenceNumber unacked[] = { 1, 2 }; |
| 1048 VerifyUnackedPackets(unacked, arraysize(unacked)); | 1054 VerifyUnackedPackets(unacked, arraysize(unacked)); |
| 1049 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | 1055 EXPECT_TRUE(manager_.HasPendingRetransmissions()); |
| 1050 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | 1056 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); |
| 1051 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | 1057 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); |
| 1052 } | 1058 } |
| 1053 | 1059 |
| 1054 TEST_F(QuicSentPacketManagerTest, | 1060 TEST_F(QuicSentPacketManagerTest, |
| 1055 CryptoHandshakeRetransmissionThenNeuterAndAck) { | 1061 CryptoHandshakeRetransmissionThenNeuterAndAck) { |
| 1056 // Send 1 crypto packet. | 1062 // Send 1 crypto packet. |
| (...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1436 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); | 1442 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); |
| 1437 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)); | 1443 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)); |
| 1438 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) | 1444 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) |
| 1439 .WillOnce(Return(100 * kDefaultTCPMSS)); | 1445 .WillOnce(Return(100 * kDefaultTCPMSS)); |
| 1440 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | 1446 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); |
| 1441 manager_.SetFromConfig(config); | 1447 manager_.SetFromConfig(config); |
| 1442 | 1448 |
| 1443 EXPECT_TRUE(manager_.using_pacing()); | 1449 EXPECT_TRUE(manager_.using_pacing()); |
| 1444 } | 1450 } |
| 1445 | 1451 |
| 1452 TEST_F(QuicSentPacketManagerTest, UseInitialRoundTripTimeToSend) { |
| 1453 uint32 initial_rtt_us = 325000; |
| 1454 EXPECT_NE(initial_rtt_us, |
| 1455 manager_.GetRttStats()->SmoothedRtt().ToMicroseconds()); |
| 1456 |
| 1457 QuicConfig config; |
| 1458 config.SetInitialRoundTripTimeUsToSend(initial_rtt_us); |
| 1459 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); |
| 1460 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)); |
| 1461 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) |
| 1462 .WillOnce(Return(100 * kDefaultTCPMSS)); |
| 1463 manager_.SetFromConfig(config); |
| 1464 |
| 1465 EXPECT_EQ(initial_rtt_us, |
| 1466 manager_.GetRttStats()->SmoothedRtt().ToMicroseconds()); |
| 1467 } |
| 1468 |
| 1446 } // namespace | 1469 } // namespace |
| 1447 } // namespace test | 1470 } // namespace test |
| 1448 } // namespace net | 1471 } // namespace net |
| OLD | NEW |