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::ElementsAre; | 17 using testing::ElementsAre; |
17 using testing::Pair; | 18 using testing::Pair; |
18 using testing::Pointwise; | 19 using testing::Pointwise; |
19 using testing::Return; | 20 using testing::Return; |
20 using testing::StrictMock; | 21 using testing::StrictMock; |
21 using testing::_; | 22 using testing::_; |
22 | 23 |
23 namespace net { | 24 namespace net { |
24 namespace test { | 25 namespace test { |
25 namespace { | 26 namespace { |
(...skipping 10 matching lines...) Expand all Loading... |
36 class MockDebugDelegate : public QuicSentPacketManager::DebugDelegate { | 37 class MockDebugDelegate : public QuicSentPacketManager::DebugDelegate { |
37 public: | 38 public: |
38 MOCK_METHOD2(OnSpuriousPacketRetransmition, | 39 MOCK_METHOD2(OnSpuriousPacketRetransmition, |
39 void(TransmissionType transmission_type, | 40 void(TransmissionType transmission_type, |
40 QuicByteCount byte_size)); | 41 QuicByteCount byte_size)); |
41 }; | 42 }; |
42 | 43 |
43 class QuicSentPacketManagerTest : public ::testing::TestWithParam<bool> { | 44 class QuicSentPacketManagerTest : public ::testing::TestWithParam<bool> { |
44 protected: | 45 protected: |
45 QuicSentPacketManagerTest() | 46 QuicSentPacketManagerTest() |
46 : manager_(true, &clock_, &stats_, kFixRate, kNack), | 47 : manager_(true, &clock_, &stats_, kFixRateCongestionControl, kNack), |
47 send_algorithm_(new StrictMock<MockSendAlgorithm>) { | 48 send_algorithm_(new StrictMock<MockSendAlgorithm>), |
| 49 network_change_visitor_(new StrictMock<MockNetworkChangeVisitor>) { |
48 QuicSentPacketManagerPeer::SetSendAlgorithm(&manager_, send_algorithm_); | 50 QuicSentPacketManagerPeer::SetSendAlgorithm(&manager_, send_algorithm_); |
49 // Disable tail loss probes for most tests. | 51 // Disable tail loss probes for most tests. |
50 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 0); | 52 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 0); |
51 // Advance the time 1s so the send times are never QuicTime::Zero. | 53 // Advance the time 1s so the send times are never QuicTime::Zero. |
52 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000)); | 54 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000)); |
| 55 manager_.set_network_change_visitor(network_change_visitor_.get()); |
53 } | 56 } |
54 | 57 |
55 virtual ~QuicSentPacketManagerTest() OVERRIDE { | 58 virtual ~QuicSentPacketManagerTest() OVERRIDE { |
56 STLDeleteElements(&packets_); | 59 STLDeleteElements(&packets_); |
57 } | 60 } |
58 | 61 |
59 QuicByteCount BytesInFlight() { | 62 QuicByteCount BytesInFlight() { |
60 return QuicSentPacketManagerPeer::GetBytesInFlight(&manager_); | 63 return QuicSentPacketManagerPeer::GetBytesInFlight(&manager_); |
61 } | 64 } |
62 void VerifyUnackedPackets(QuicPacketSequenceNumber* packets, | 65 void VerifyUnackedPackets(QuicPacketSequenceNumber* packets, |
(...skipping 19 matching lines...) Expand all Loading... |
82 &manager_)); | 85 &manager_)); |
83 for (size_t i = 0; i < num_packets; ++i) { | 86 for (size_t i = 0; i < num_packets; ++i) { |
84 EXPECT_TRUE(manager_.HasRetransmittableFrames(packets[i])) | 87 EXPECT_TRUE(manager_.HasRetransmittableFrames(packets[i])) |
85 << " packets[" << i << "]:" << packets[i]; | 88 << " packets[" << i << "]:" << packets[i]; |
86 } | 89 } |
87 } | 90 } |
88 | 91 |
89 void ExpectAck(QuicPacketSequenceNumber largest_observed) { | 92 void ExpectAck(QuicPacketSequenceNumber largest_observed) { |
90 EXPECT_CALL(*send_algorithm_, OnCongestionEvent( | 93 EXPECT_CALL(*send_algorithm_, OnCongestionEvent( |
91 true, _, ElementsAre(Pair(largest_observed, _)), _)); | 94 true, _, ElementsAre(Pair(largest_observed, _)), _)); |
| 95 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) |
| 96 .WillOnce(Return(100 * kDefaultTCPMSS)); |
| 97 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)); |
92 } | 98 } |
93 | 99 |
94 void ExpectUpdatedRtt(QuicPacketSequenceNumber largest_observed) { | 100 void ExpectUpdatedRtt(QuicPacketSequenceNumber largest_observed) { |
95 EXPECT_CALL(*send_algorithm_, | 101 EXPECT_CALL(*send_algorithm_, |
96 OnCongestionEvent(true, _, _, _)); | 102 OnCongestionEvent(true, _, _, _)); |
| 103 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) |
| 104 .WillOnce(Return(100 * kDefaultTCPMSS)); |
| 105 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)); |
97 } | 106 } |
98 | 107 |
99 void ExpectAckAndLoss(bool rtt_updated, | 108 void ExpectAckAndLoss(bool rtt_updated, |
100 QuicPacketSequenceNumber largest_observed, | 109 QuicPacketSequenceNumber largest_observed, |
101 QuicPacketSequenceNumber lost_packet) { | 110 QuicPacketSequenceNumber lost_packet) { |
102 EXPECT_CALL(*send_algorithm_, OnCongestionEvent( | 111 EXPECT_CALL(*send_algorithm_, OnCongestionEvent( |
103 rtt_updated, _, ElementsAre(Pair(largest_observed, _)), | 112 rtt_updated, _, ElementsAre(Pair(largest_observed, _)), |
104 ElementsAre(Pair(lost_packet, _)))); | 113 ElementsAre(Pair(lost_packet, _)))); |
| 114 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) |
| 115 .WillOnce(Return(100 * kDefaultTCPMSS)); |
| 116 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)); |
105 } | 117 } |
106 | 118 |
107 // |packets_acked| and |packets_lost| should be in sequence number order. | 119 // |packets_acked| and |packets_lost| should be in sequence number order. |
108 void ExpectAcksAndLosses(bool rtt_updated, | 120 void ExpectAcksAndLosses(bool rtt_updated, |
109 QuicPacketSequenceNumber* packets_acked, | 121 QuicPacketSequenceNumber* packets_acked, |
110 size_t num_packets_acked, | 122 size_t num_packets_acked, |
111 QuicPacketSequenceNumber* packets_lost, | 123 QuicPacketSequenceNumber* packets_lost, |
112 size_t num_packets_lost) { | 124 size_t num_packets_lost) { |
113 vector<QuicPacketSequenceNumber> ack_vector; | 125 vector<QuicPacketSequenceNumber> ack_vector; |
114 for (size_t i = 0; i < num_packets_acked; ++i) { | 126 for (size_t i = 0; i < num_packets_acked; ++i) { |
115 ack_vector.push_back(packets_acked[i]); | 127 ack_vector.push_back(packets_acked[i]); |
116 } | 128 } |
117 vector<QuicPacketSequenceNumber> lost_vector; | 129 vector<QuicPacketSequenceNumber> lost_vector; |
118 for (size_t i = 0; i < num_packets_lost; ++i) { | 130 for (size_t i = 0; i < num_packets_lost; ++i) { |
119 lost_vector.push_back(packets_lost[i]); | 131 lost_vector.push_back(packets_lost[i]); |
120 } | 132 } |
121 EXPECT_CALL(*send_algorithm_, | 133 EXPECT_CALL(*send_algorithm_, |
122 OnCongestionEvent(rtt_updated, _, | 134 OnCongestionEvent(rtt_updated, _, |
123 Pointwise(KeyEq(), ack_vector), | 135 Pointwise(KeyEq(), ack_vector), |
124 Pointwise(KeyEq(), lost_vector))); | 136 Pointwise(KeyEq(), lost_vector))); |
| 137 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) |
| 138 .WillRepeatedly(Return(100 * kDefaultTCPMSS)); |
| 139 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)). |
| 140 Times(AnyNumber()); |
125 } | 141 } |
126 | 142 |
127 // Retransmits a packet as though it was a TLP retransmission, because TLP | 143 // Retransmits a packet as though it was a TLP retransmission, because TLP |
128 // leaves the |old_sequence_number| pending. | 144 // leaves the |old_sequence_number| pending. |
129 // TODO(ianswett): Test with transmission types besides TLP. | 145 // TODO(ianswett): Test with transmission types besides TLP. |
130 void RetransmitPacket(QuicPacketSequenceNumber old_sequence_number, | 146 void RetransmitPacket(QuicPacketSequenceNumber old_sequence_number, |
131 QuicPacketSequenceNumber new_sequence_number) { | 147 QuicPacketSequenceNumber new_sequence_number) { |
132 QuicSentPacketManagerPeer::MarkForRetransmission( | 148 QuicSentPacketManagerPeer::MarkForRetransmission( |
133 &manager_, old_sequence_number, TLP_RETRANSMISSION); | 149 &manager_, old_sequence_number, TLP_RETRANSMISSION); |
134 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | 150 EXPECT_TRUE(manager_.HasPendingRetransmissions()); |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
246 manager_.OnPacketSent(retransmission_sequence_number, clock_.Now(), | 262 manager_.OnPacketSent(retransmission_sequence_number, clock_.Now(), |
247 kDefaultLength, pending.transmission_type, | 263 kDefaultLength, pending.transmission_type, |
248 HAS_RETRANSMITTABLE_DATA); | 264 HAS_RETRANSMITTABLE_DATA); |
249 } | 265 } |
250 | 266 |
251 QuicSentPacketManager manager_; | 267 QuicSentPacketManager manager_; |
252 vector<QuicPacket*> packets_; | 268 vector<QuicPacket*> packets_; |
253 MockClock clock_; | 269 MockClock clock_; |
254 QuicConnectionStats stats_; | 270 QuicConnectionStats stats_; |
255 MockSendAlgorithm* send_algorithm_; | 271 MockSendAlgorithm* send_algorithm_; |
| 272 scoped_ptr<MockNetworkChangeVisitor> network_change_visitor_; |
256 }; | 273 }; |
257 | 274 |
258 TEST_F(QuicSentPacketManagerTest, IsUnacked) { | 275 TEST_F(QuicSentPacketManagerTest, IsUnacked) { |
259 VerifyUnackedPackets(NULL, 0); | 276 VerifyUnackedPackets(NULL, 0); |
260 | 277 |
261 SerializedPacket serialized_packet(CreateDataPacket(1)); | 278 SerializedPacket serialized_packet(CreateDataPacket(1)); |
262 | 279 |
263 manager_.OnSerializedPacket(serialized_packet); | 280 manager_.OnSerializedPacket(serialized_packet); |
264 | 281 |
265 QuicPacketSequenceNumber unacked[] = { 1 }; | 282 QuicPacketSequenceNumber unacked[] = { 1 }; |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
407 // since there is no retransmittable data outstanding. | 424 // since there is no retransmittable data outstanding. |
408 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime()); | 425 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime()); |
409 } | 426 } |
410 | 427 |
411 TEST_F(QuicSentPacketManagerTest, RetransmitTwiceThenAckPreviousBeforeSend) { | 428 TEST_F(QuicSentPacketManagerTest, RetransmitTwiceThenAckPreviousBeforeSend) { |
412 SendDataPacket(1); | 429 SendDataPacket(1); |
413 RetransmitAndSendPacket(1, 2); | 430 RetransmitAndSendPacket(1, 2); |
414 | 431 |
415 // Fire the RTO, which will mark 2 for retransmission (but will not send it). | 432 // Fire the RTO, which will mark 2 for retransmission (but will not send it). |
416 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | 433 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); |
| 434 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)); |
| 435 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) |
| 436 .WillOnce(Return(2 * kDefaultTCPMSS)); |
417 manager_.OnRetransmissionTimeout(); | 437 manager_.OnRetransmissionTimeout(); |
418 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | 438 EXPECT_TRUE(manager_.HasPendingRetransmissions()); |
419 | 439 |
420 // Ack 1 but not 2, before 2 is able to be sent. | 440 // Ack 1 but not 2, before 2 is able to be sent. |
421 // Since 1 has been retransmitted, it has already been lost, and so the | 441 // Since 1 has been retransmitted, it has already been lost, and so the |
422 // send algorithm is not informed that it has been ACK'd. | 442 // send algorithm is not informed that it has been ACK'd. |
423 ReceivedPacketInfo received_info; | 443 ReceivedPacketInfo received_info; |
424 received_info.largest_observed = 1; | 444 received_info.largest_observed = 1; |
425 ExpectUpdatedRtt(1); | 445 ExpectUpdatedRtt(1); |
426 EXPECT_CALL(*send_algorithm_, RevertRetransmissionTimeout()); | 446 EXPECT_CALL(*send_algorithm_, RevertRetransmissionTimeout()); |
(...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
865 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _)).WillOnce(Return( | 885 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _)).WillOnce(Return( |
866 QuicTime::Delta::Infinite())); | 886 QuicTime::Delta::Infinite())); |
867 EXPECT_EQ(QuicTime::Delta::Infinite(), | 887 EXPECT_EQ(QuicTime::Delta::Infinite(), |
868 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA)); | 888 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA)); |
869 | 889 |
870 // Advance the time enough to ensure all packets are RTO'd. | 890 // Advance the time enough to ensure all packets are RTO'd. |
871 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000)); | 891 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000)); |
872 | 892 |
873 // The final RTO abandons all of them. | 893 // The final RTO abandons all of them. |
874 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | 894 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); |
| 895 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)); |
| 896 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) |
| 897 .WillOnce(Return(2 * kDefaultTCPMSS)); |
875 manager_.OnRetransmissionTimeout(); | 898 manager_.OnRetransmissionTimeout(); |
876 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | 899 EXPECT_TRUE(manager_.HasPendingRetransmissions()); |
877 EXPECT_EQ(2u, stats_.tlp_count); | 900 EXPECT_EQ(2u, stats_.tlp_count); |
878 EXPECT_EQ(1u, stats_.rto_count); | 901 EXPECT_EQ(1u, stats_.rto_count); |
879 } | 902 } |
880 | 903 |
881 TEST_F(QuicSentPacketManagerTest, CryptoHandshakeTimeout) { | 904 TEST_F(QuicSentPacketManagerTest, CryptoHandshakeTimeout) { |
882 // Send 2 crypto packets and 3 data packets. | 905 // Send 2 crypto packets and 3 data packets. |
883 const size_t kNumSentCryptoPackets = 2; | 906 const size_t kNumSentCryptoPackets = 2; |
884 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) { | 907 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) { |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1116 } | 1139 } |
1117 | 1140 |
1118 TEST_F(QuicSentPacketManagerTest, RetransmissionTimeout) { | 1141 TEST_F(QuicSentPacketManagerTest, RetransmissionTimeout) { |
1119 // Send 100 packets and then ensure all are abandoned when the RTO fires. | 1142 // Send 100 packets and then ensure all are abandoned when the RTO fires. |
1120 const size_t kNumSentPackets = 100; | 1143 const size_t kNumSentPackets = 100; |
1121 for (size_t i = 1; i <= kNumSentPackets; ++i) { | 1144 for (size_t i = 1; i <= kNumSentPackets; ++i) { |
1122 SendDataPacket(i); | 1145 SendDataPacket(i); |
1123 } | 1146 } |
1124 | 1147 |
1125 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | 1148 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); |
| 1149 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)); |
| 1150 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) |
| 1151 .WillOnce(Return(2 * kDefaultTCPMSS)); |
1126 EXPECT_FALSE(manager_.MaybeRetransmitTailLossProbe()); | 1152 EXPECT_FALSE(manager_.MaybeRetransmitTailLossProbe()); |
1127 manager_.OnRetransmissionTimeout(); | 1153 manager_.OnRetransmissionTimeout(); |
1128 } | 1154 } |
1129 | 1155 |
1130 TEST_F(QuicSentPacketManagerTest, GetTransmissionTime) { | 1156 TEST_F(QuicSentPacketManagerTest, GetTransmissionTime) { |
1131 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime()); | 1157 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime()); |
1132 } | 1158 } |
1133 | 1159 |
1134 TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeCryptoHandshake) { | 1160 TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeCryptoHandshake) { |
1135 SendCryptoPacket(1); | 1161 SendCryptoPacket(1); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1207 SendDataPacket(3); | 1233 SendDataPacket(3); |
1208 SendDataPacket(4); | 1234 SendDataPacket(4); |
1209 | 1235 |
1210 QuicTime::Delta expected_rto_delay = QuicTime::Delta::FromMilliseconds(500); | 1236 QuicTime::Delta expected_rto_delay = QuicTime::Delta::FromMilliseconds(500); |
1211 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) | 1237 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) |
1212 .WillRepeatedly(Return(expected_rto_delay)); | 1238 .WillRepeatedly(Return(expected_rto_delay)); |
1213 QuicTime expected_time = clock_.Now().Add(expected_rto_delay); | 1239 QuicTime expected_time = clock_.Now().Add(expected_rto_delay); |
1214 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); | 1240 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); |
1215 | 1241 |
1216 // Retransmit the packet by invoking the retransmission timeout. | 1242 // Retransmit the packet by invoking the retransmission timeout. |
| 1243 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)); |
| 1244 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) |
| 1245 .WillOnce(Return(2 * kDefaultTCPMSS)); |
1217 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | 1246 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); |
1218 clock_.AdvanceTime(expected_rto_delay); | 1247 clock_.AdvanceTime(expected_rto_delay); |
1219 manager_.OnRetransmissionTimeout(); | 1248 manager_.OnRetransmissionTimeout(); |
1220 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | 1249 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); |
1221 RetransmitNextPacket(5); | 1250 RetransmitNextPacket(5); |
1222 RetransmitNextPacket(6); | 1251 RetransmitNextPacket(6); |
1223 EXPECT_EQ(2 * kDefaultLength, | 1252 EXPECT_EQ(2 * kDefaultLength, |
1224 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | 1253 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); |
1225 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | 1254 EXPECT_TRUE(manager_.HasPendingRetransmissions()); |
1226 | 1255 |
(...skipping 23 matching lines...) Expand all Loading... |
1250 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) | 1279 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) |
1251 .WillRepeatedly(Return(QuicTime::Delta::FromMilliseconds(1))); | 1280 .WillRepeatedly(Return(QuicTime::Delta::FromMilliseconds(1))); |
1252 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(200); | 1281 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(200); |
1253 | 1282 |
1254 // If the delay is smaller than the min, ensure it exponentially backs off | 1283 // If the delay is smaller than the min, ensure it exponentially backs off |
1255 // from the min. | 1284 // from the min. |
1256 for (int i = 0; i < 5; ++i) { | 1285 for (int i = 0; i < 5; ++i) { |
1257 EXPECT_EQ(delay, | 1286 EXPECT_EQ(delay, |
1258 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); | 1287 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); |
1259 delay = delay.Add(delay); | 1288 delay = delay.Add(delay); |
| 1289 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)); |
| 1290 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) |
| 1291 .WillOnce(Return(2 * kDefaultTCPMSS)); |
1260 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | 1292 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); |
1261 manager_.OnRetransmissionTimeout(); | 1293 manager_.OnRetransmissionTimeout(); |
1262 RetransmitNextPacket(i + 2); | 1294 RetransmitNextPacket(i + 2); |
1263 } | 1295 } |
1264 } | 1296 } |
1265 | 1297 |
1266 TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayMax) { | 1298 TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayMax) { |
1267 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) | 1299 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) |
1268 .WillOnce(Return(QuicTime::Delta::FromSeconds(500))); | 1300 .WillOnce(Return(QuicTime::Delta::FromSeconds(500))); |
1269 | 1301 |
1270 EXPECT_EQ(QuicTime::Delta::FromSeconds(60), | 1302 EXPECT_EQ(QuicTime::Delta::FromSeconds(60), |
1271 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); | 1303 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); |
1272 } | 1304 } |
1273 | 1305 |
1274 TEST_F(QuicSentPacketManagerTest, GetTransmissionDelay) { | 1306 TEST_F(QuicSentPacketManagerTest, GetTransmissionDelay) { |
1275 SendDataPacket(1); | 1307 SendDataPacket(1); |
1276 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(500); | 1308 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(500); |
1277 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) | 1309 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) |
1278 .WillRepeatedly(Return(delay)); | 1310 .WillRepeatedly(Return(delay)); |
1279 | 1311 |
1280 // Delay should back off exponentially. | 1312 // Delay should back off exponentially. |
1281 for (int i = 0; i < 5; ++i) { | 1313 for (int i = 0; i < 5; ++i) { |
1282 EXPECT_EQ(delay, | 1314 EXPECT_EQ(delay, |
1283 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); | 1315 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); |
1284 delay = delay.Add(delay); | 1316 delay = delay.Add(delay); |
| 1317 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)); |
| 1318 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) |
| 1319 .WillOnce(Return(2 * kDefaultTCPMSS)); |
1285 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | 1320 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); |
1286 manager_.OnRetransmissionTimeout(); | 1321 manager_.OnRetransmissionTimeout(); |
1287 RetransmitNextPacket(i + 2); | 1322 RetransmitNextPacket(i + 2); |
1288 } | 1323 } |
1289 } | 1324 } |
1290 | 1325 |
1291 TEST_F(QuicSentPacketManagerTest, GetLossDelay) { | 1326 TEST_F(QuicSentPacketManagerTest, GetLossDelay) { |
1292 MockLossAlgorithm* loss_algorithm = new MockLossAlgorithm(); | 1327 MockLossAlgorithm* loss_algorithm = new MockLossAlgorithm(); |
1293 QuicSentPacketManagerPeer::SetLossAlgorithm(&manager_, loss_algorithm); | 1328 QuicSentPacketManagerPeer::SetLossAlgorithm(&manager_, loss_algorithm); |
1294 | 1329 |
(...skipping 25 matching lines...) Expand all Loading... |
1320 } | 1355 } |
1321 | 1356 |
1322 TEST_F(QuicSentPacketManagerTest, NegotiateTimeLossDetection) { | 1357 TEST_F(QuicSentPacketManagerTest, NegotiateTimeLossDetection) { |
1323 EXPECT_EQ(kNack, | 1358 EXPECT_EQ(kNack, |
1324 QuicSentPacketManagerPeer::GetLossAlgorithm( | 1359 QuicSentPacketManagerPeer::GetLossAlgorithm( |
1325 &manager_)->GetLossDetectionType()); | 1360 &manager_)->GetLossDetectionType()); |
1326 | 1361 |
1327 QuicConfig config; | 1362 QuicConfig config; |
1328 QuicConfigPeer::SetReceivedLossDetection(&config, kTIME); | 1363 QuicConfigPeer::SetReceivedLossDetection(&config, kTIME); |
1329 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | 1364 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); |
| 1365 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)); |
| 1366 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) |
| 1367 .WillOnce(Return(100 * kDefaultTCPMSS)); |
1330 manager_.SetFromConfig(config); | 1368 manager_.SetFromConfig(config); |
1331 | 1369 |
1332 EXPECT_EQ(kTime, | 1370 EXPECT_EQ(kTime, |
1333 QuicSentPacketManagerPeer::GetLossAlgorithm( | 1371 QuicSentPacketManagerPeer::GetLossAlgorithm( |
1334 &manager_)->GetLossDetectionType()); | 1372 &manager_)->GetLossDetectionType()); |
1335 } | 1373 } |
1336 | 1374 |
1337 TEST_F(QuicSentPacketManagerTest, NegotiateTimeLossDetectionFromOptions) { | 1375 TEST_F(QuicSentPacketManagerTest, NegotiateTimeLossDetectionFromOptions) { |
1338 EXPECT_EQ(kNack, | 1376 EXPECT_EQ(kNack, |
1339 QuicSentPacketManagerPeer::GetLossAlgorithm( | 1377 QuicSentPacketManagerPeer::GetLossAlgorithm( |
1340 &manager_)->GetLossDetectionType()); | 1378 &manager_)->GetLossDetectionType()); |
1341 | 1379 |
1342 QuicConfig config; | 1380 QuicConfig config; |
1343 QuicTagVector options; | 1381 QuicTagVector options; |
1344 options.push_back(kTIME); | 1382 options.push_back(kTIME); |
1345 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); | 1383 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); |
1346 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | 1384 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); |
| 1385 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)); |
| 1386 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) |
| 1387 .WillOnce(Return(100 * kDefaultTCPMSS)); |
1347 manager_.SetFromConfig(config); | 1388 manager_.SetFromConfig(config); |
1348 | 1389 |
1349 EXPECT_EQ(kTime, | 1390 EXPECT_EQ(kTime, |
1350 QuicSentPacketManagerPeer::GetLossAlgorithm( | 1391 QuicSentPacketManagerPeer::GetLossAlgorithm( |
1351 &manager_)->GetLossDetectionType()); | 1392 &manager_)->GetLossDetectionType()); |
1352 } | 1393 } |
1353 | 1394 |
1354 TEST_F(QuicSentPacketManagerTest, NegotiatePacingFromOptions) { | 1395 TEST_F(QuicSentPacketManagerTest, NegotiatePacingFromOptions) { |
1355 ValueRestore<bool> old_flag(&FLAGS_enable_quic_pacing, true); | 1396 ValueRestore<bool> old_flag(&FLAGS_enable_quic_pacing, true); |
1356 EXPECT_FALSE(manager_.using_pacing()); | 1397 EXPECT_FALSE(manager_.using_pacing()); |
1357 | 1398 |
1358 QuicConfig config; | 1399 QuicConfig config; |
1359 QuicTagVector options; | 1400 QuicTagVector options; |
1360 options.push_back(kPACE); | 1401 options.push_back(kPACE); |
1361 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); | 1402 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); |
| 1403 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)); |
| 1404 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) |
| 1405 .WillOnce(Return(100 * kDefaultTCPMSS)); |
1362 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | 1406 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); |
1363 manager_.SetFromConfig(config); | 1407 manager_.SetFromConfig(config); |
1364 | 1408 |
1365 EXPECT_TRUE(manager_.using_pacing()); | 1409 EXPECT_TRUE(manager_.using_pacing()); |
1366 } | 1410 } |
1367 | 1411 |
1368 } // namespace | 1412 } // namespace |
1369 } // namespace test | 1413 } // namespace test |
1370 } // namespace net | 1414 } // namespace net |
OLD | NEW |