| 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" |
| 11 #include "net/quic/test_tools/quic_test_utils.h" | 11 #include "net/quic/test_tools/quic_test_utils.h" |
| 12 #include "testing/gmock/include/gmock/gmock.h" | 12 #include "testing/gmock/include/gmock/gmock.h" |
| 13 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
| 14 | 14 |
| 15 using std::vector; | 15 using std::vector; |
| 16 using testing::AnyNumber; | 16 using testing::AnyNumber; |
| 17 using testing::ElementsAre; | 17 using testing::ElementsAre; |
| 18 using testing::IsEmpty; | 18 using testing::IsEmpty; |
| 19 using testing::Not; |
| 19 using testing::Pair; | 20 using testing::Pair; |
| 20 using testing::Pointwise; | 21 using testing::Pointwise; |
| 21 using testing::Return; | 22 using testing::Return; |
| 22 using testing::StrictMock; | 23 using testing::StrictMock; |
| 23 using testing::_; | 24 using testing::_; |
| 24 | 25 |
| 25 namespace net { | 26 namespace net { |
| 26 namespace test { | 27 namespace test { |
| 27 namespace { | 28 namespace { |
| 28 | 29 |
| (...skipping 1091 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1120 } | 1121 } |
| 1121 RetransmitNextPacket(101); | 1122 RetransmitNextPacket(101); |
| 1122 RetransmitNextPacket(102); | 1123 RetransmitNextPacket(102); |
| 1123 if (FLAGS_quic_use_new_rto) { | 1124 if (FLAGS_quic_use_new_rto) { |
| 1124 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | 1125 EXPECT_FALSE(manager_.HasPendingRetransmissions()); |
| 1125 } else { | 1126 } else { |
| 1126 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | 1127 EXPECT_TRUE(manager_.HasPendingRetransmissions()); |
| 1127 } | 1128 } |
| 1128 | 1129 |
| 1129 // Ack a retransmission. | 1130 // Ack a retransmission. |
| 1130 if (FLAGS_quic_use_new_rto) { | |
| 1131 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | |
| 1132 } | |
| 1133 QuicAckFrame ack_frame; | 1131 QuicAckFrame ack_frame; |
| 1134 ack_frame.delta_time_largest_observed = QuicTime::Delta::Zero(); | 1132 ack_frame.delta_time_largest_observed = QuicTime::Delta::Zero(); |
| 1135 ack_frame.largest_observed = 102; | 1133 ack_frame.largest_observed = 102; |
| 1136 for (int i = 0; i < 102; ++i) { | 1134 for (int i = 0; i < 102; ++i) { |
| 1137 ack_frame.missing_packets.insert(i); | 1135 ack_frame.missing_packets.insert(i); |
| 1138 } | 1136 } |
| 1137 // Ensure no packets are lost. |
| 1139 EXPECT_CALL(*send_algorithm_, | 1138 EXPECT_CALL(*send_algorithm_, |
| 1140 OnCongestionEvent(true, _, ElementsAre(Pair(102, _)), _)); | 1139 OnCongestionEvent(true, _, ElementsAre(Pair(102, _)), |
| 1140 /*lost_packets=*/IsEmpty())); |
| 1141 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); |
| 1142 EXPECT_CALL(*network_change_visitor_, OnRttChange()); |
| 1143 if (FLAGS_quic_use_new_rto) { |
| 1144 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); |
| 1145 } |
| 1146 manager_.OnIncomingAck(ack_frame, clock_.Now()); |
| 1147 } |
| 1148 |
| 1149 TEST_F(QuicSentPacketManagerTest, NewRetransmissionTimeout) { |
| 1150 ValueRestore<bool> old_flag(&FLAGS_quic_use_new_rto, true); |
| 1151 QuicConfig client_config; |
| 1152 QuicTagVector options; |
| 1153 options.push_back(kNRTO); |
| 1154 QuicSentPacketManagerPeer::SetIsServer(&manager_, false); |
| 1155 client_config.SetConnectionOptionsToSend(options); |
| 1156 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); |
| 1157 EXPECT_CALL(*network_change_visitor_, OnRttChange()); |
| 1158 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _, _)); |
| 1159 manager_.SetFromConfig(client_config); |
| 1160 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_)); |
| 1161 |
| 1162 // Send 100 packets. |
| 1163 const size_t kNumSentPackets = 100; |
| 1164 for (size_t i = 1; i <= kNumSentPackets; ++i) { |
| 1165 SendDataPacket(i); |
| 1166 } |
| 1167 |
| 1168 EXPECT_FALSE(manager_.MaybeRetransmitTailLossProbe()); |
| 1169 manager_.OnRetransmissionTimeout(); |
| 1170 EXPECT_TRUE(manager_.HasPendingRetransmissions()); |
| 1171 EXPECT_EQ(100 * kDefaultLength, |
| 1172 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); |
| 1173 RetransmitNextPacket(101); |
| 1174 RetransmitNextPacket(102); |
| 1175 EXPECT_FALSE(manager_.HasPendingRetransmissions()); |
| 1176 |
| 1177 // Ack a retransmission and expect no call to OnRetransmissionTimeout. |
| 1178 QuicAckFrame ack_frame; |
| 1179 ack_frame.delta_time_largest_observed = QuicTime::Delta::Zero(); |
| 1180 ack_frame.largest_observed = 102; |
| 1181 for (int i = 0; i < 102; ++i) { |
| 1182 ack_frame.missing_packets.insert(i); |
| 1183 } |
| 1184 // This will include packets in the lost packet map. |
| 1185 EXPECT_CALL(*send_algorithm_, |
| 1186 OnCongestionEvent(true, _, ElementsAre(Pair(102, _)), |
| 1187 /*lost_packets=*/Not(IsEmpty()))); |
| 1141 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | 1188 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); |
| 1142 EXPECT_CALL(*network_change_visitor_, OnRttChange()); | 1189 EXPECT_CALL(*network_change_visitor_, OnRttChange()); |
| 1143 manager_.OnIncomingAck(ack_frame, clock_.Now()); | 1190 manager_.OnIncomingAck(ack_frame, clock_.Now()); |
| 1144 } | 1191 } |
| 1145 | 1192 |
| 1146 TEST_F(QuicSentPacketManagerTest, TwoRetransmissionTimeoutsAckSecond) { | 1193 TEST_F(QuicSentPacketManagerTest, TwoRetransmissionTimeoutsAckSecond) { |
| 1147 // Send 1 packet. | 1194 // Send 1 packet. |
| 1148 SendDataPacket(1); | 1195 SendDataPacket(1); |
| 1149 | 1196 |
| 1150 if (!FLAGS_quic_use_new_rto) { | 1197 if (!FLAGS_quic_use_new_rto) { |
| (...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1602 options.push_back(kNTLP); | 1649 options.push_back(kNTLP); |
| 1603 QuicSentPacketManagerPeer::SetIsServer(&manager_, false); | 1650 QuicSentPacketManagerPeer::SetIsServer(&manager_, false); |
| 1604 client_config.SetConnectionOptionsToSend(options); | 1651 client_config.SetConnectionOptionsToSend(options); |
| 1605 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | 1652 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); |
| 1606 EXPECT_CALL(*network_change_visitor_, OnRttChange()); | 1653 EXPECT_CALL(*network_change_visitor_, OnRttChange()); |
| 1607 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _, _)); | 1654 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _, _)); |
| 1608 manager_.SetFromConfig(client_config); | 1655 manager_.SetFromConfig(client_config); |
| 1609 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_)); | 1656 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_)); |
| 1610 } | 1657 } |
| 1611 | 1658 |
| 1659 TEST_F(QuicSentPacketManagerTest, NegotiateNewRTOFromOptionsAtServer) { |
| 1660 EXPECT_FALSE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_)); |
| 1661 QuicConfig config; |
| 1662 QuicTagVector options; |
| 1663 |
| 1664 options.push_back(kNRTO); |
| 1665 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); |
| 1666 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); |
| 1667 EXPECT_CALL(*network_change_visitor_, OnRttChange()); |
| 1668 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _, _)); |
| 1669 manager_.SetFromConfig(config); |
| 1670 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_)); |
| 1671 } |
| 1672 |
| 1673 TEST_F(QuicSentPacketManagerTest, NegotiateNewRTOFromOptionsAtClient) { |
| 1674 EXPECT_FALSE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_)); |
| 1675 QuicConfig client_config; |
| 1676 QuicTagVector options; |
| 1677 |
| 1678 options.push_back(kNRTO); |
| 1679 QuicSentPacketManagerPeer::SetIsServer(&manager_, false); |
| 1680 client_config.SetConnectionOptionsToSend(options); |
| 1681 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); |
| 1682 EXPECT_CALL(*network_change_visitor_, OnRttChange()); |
| 1683 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _, _)); |
| 1684 manager_.SetFromConfig(client_config); |
| 1685 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_)); |
| 1686 } |
| 1687 |
| 1612 TEST_F(QuicSentPacketManagerTest, NegotiatePacingFromOptions) { | 1688 TEST_F(QuicSentPacketManagerTest, NegotiatePacingFromOptions) { |
| 1613 EXPECT_FALSE(manager_.using_pacing()); | 1689 EXPECT_FALSE(manager_.using_pacing()); |
| 1614 | 1690 |
| 1615 QuicConfig config; | 1691 QuicConfig config; |
| 1616 QuicTagVector options; | 1692 QuicTagVector options; |
| 1617 options.push_back(kPACE); | 1693 options.push_back(kPACE); |
| 1618 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); | 1694 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); |
| 1619 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); | 1695 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()); |
| 1620 EXPECT_CALL(*network_change_visitor_, OnRttChange()); | 1696 EXPECT_CALL(*network_change_visitor_, OnRttChange()); |
| 1621 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _, /*using_pacing=*/true)); | 1697 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _, /*using_pacing=*/true)); |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1717 | 1793 |
| 1718 EXPECT_CALL(*send_algorithm_, ResumeConnectionState(_)); | 1794 EXPECT_CALL(*send_algorithm_, ResumeConnectionState(_)); |
| 1719 manager_.ResumeConnectionState(cached_network_params); | 1795 manager_.ResumeConnectionState(cached_network_params); |
| 1720 EXPECT_EQ(kRttMs * kNumMicrosPerMilli, | 1796 EXPECT_EQ(kRttMs * kNumMicrosPerMilli, |
| 1721 static_cast<uint64>(manager_.GetRttStats()->initial_rtt_us())); | 1797 static_cast<uint64>(manager_.GetRttStats()->initial_rtt_us())); |
| 1722 } | 1798 } |
| 1723 | 1799 |
| 1724 } // namespace | 1800 } // namespace |
| 1725 } // namespace test | 1801 } // namespace test |
| 1726 } // namespace net | 1802 } // namespace net |
| OLD | NEW |