| 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 1183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1194 ack_frame.missing_packets.insert(1); | 1194 ack_frame.missing_packets.insert(1); |
| 1195 ExpectUpdatedRtt(2); | 1195 ExpectUpdatedRtt(2); |
| 1196 EXPECT_CALL(*send_algorithm_, RevertRetransmissionTimeout()); | 1196 EXPECT_CALL(*send_algorithm_, RevertRetransmissionTimeout()); |
| 1197 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | 1197 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); |
| 1198 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | 1198 EXPECT_FALSE(manager_.HasPendingRetransmissions()); |
| 1199 EXPECT_EQ(4 * kDefaultLength, | 1199 EXPECT_EQ(4 * kDefaultLength, |
| 1200 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | 1200 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); |
| 1201 | 1201 |
| 1202 // Wait 2RTTs from now for the RTO, since it's the max of the RTO time | 1202 // Wait 2RTTs from now for the RTO, since it's the max of the RTO time |
| 1203 // and the TLP time. In production, there would always be two TLP's first. | 1203 // and the TLP time. In production, there would always be two TLP's first. |
| 1204 expected_time = clock_.Now().Add(QuicTime::Delta::FromMilliseconds(200)); | 1204 // Since retransmission was spurious, smoothed_rtt_ is expired, and replaced |
| 1205 // by the latest RTT sample of 500ms. |
| 1206 expected_time = clock_.Now().Add(QuicTime::Delta::FromMilliseconds(1000)); |
| 1205 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); | 1207 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); |
| 1206 } | 1208 } |
| 1207 | 1209 |
| 1208 TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayMin) { | 1210 TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayMin) { |
| 1209 SendDataPacket(1); | 1211 SendDataPacket(1); |
| 1210 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) | 1212 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) |
| 1211 .WillRepeatedly(Return(QuicTime::Delta::FromMilliseconds(1))); | 1213 .WillRepeatedly(Return(QuicTime::Delta::FromMilliseconds(1))); |
| 1212 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(200); | 1214 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(200); |
| 1213 | 1215 |
| 1214 // If the delay is smaller than the min, ensure it exponentially backs off | 1216 // If the delay is smaller than the min, ensure it exponentially backs off |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1299 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) | 1301 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) |
| 1300 .WillOnce(Return(100 * kDefaultTCPMSS)); | 1302 .WillOnce(Return(100 * kDefaultTCPMSS)); |
| 1301 manager_.SetFromConfig(config); | 1303 manager_.SetFromConfig(config); |
| 1302 | 1304 |
| 1303 EXPECT_EQ(kTime, | 1305 EXPECT_EQ(kTime, |
| 1304 QuicSentPacketManagerPeer::GetLossAlgorithm( | 1306 QuicSentPacketManagerPeer::GetLossAlgorithm( |
| 1305 &manager_)->GetLossDetectionType()); | 1307 &manager_)->GetLossDetectionType()); |
| 1306 } | 1308 } |
| 1307 | 1309 |
| 1308 TEST_F(QuicSentPacketManagerTest, NegotiateCongestionControlFromOptions) { | 1310 TEST_F(QuicSentPacketManagerTest, NegotiateCongestionControlFromOptions) { |
| 1311 ValueRestore<bool> old_flag(&FLAGS_quic_allow_bbr, true); |
| 1309 QuicConfig config; | 1312 QuicConfig config; |
| 1310 QuicTagVector options; | 1313 QuicTagVector options; |
| 1311 | 1314 |
| 1312 options.push_back(kRENO); | 1315 options.push_back(kRENO); |
| 1313 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); | 1316 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); |
| 1314 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)); | 1317 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)); |
| 1315 manager_.SetFromConfig(config); | 1318 manager_.SetFromConfig(config); |
| 1316 EXPECT_EQ(kReno, QuicSentPacketManagerPeer::GetCongestionControlAlgorithm( | 1319 EXPECT_EQ(kReno, QuicSentPacketManagerPeer::GetSendAlgorithm( |
| 1317 manager_)->GetCongestionControlType()); | 1320 manager_)->GetCongestionControlType()); |
| 1318 | 1321 |
| 1319 // TODO(rtenneti): Enable the following code after BBR code is checked in. | 1322 // TODO(rtenneti): Enable the following code after BBR code is checked in. |
| 1320 #if 0 | 1323 #if 0 |
| 1321 options.clear(); | 1324 options.clear(); |
| 1322 options.push_back(kTBBR); | 1325 options.push_back(kTBBR); |
| 1323 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); | 1326 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); |
| 1324 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)); | 1327 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)); |
| 1325 manager_.SetFromConfig(config); | 1328 manager_.SetFromConfig(config); |
| 1326 EXPECT_EQ(kBBR, QuicSentPacketManagerPeer::GetCongestionControlAlgorithm( | 1329 EXPECT_EQ(kBBR, QuicSentPacketManagerPeer::GetSendAlgorithm( |
| 1327 manager_)->GetCongestionControlType()); | 1330 manager_)->GetCongestionControlType()); |
| 1328 #endif | 1331 #endif |
| 1329 } | 1332 } |
| 1330 | 1333 |
| 1331 TEST_F(QuicSentPacketManagerTest, NegotiateNumConnectionsFromOptions) { | 1334 TEST_F(QuicSentPacketManagerTest, NegotiateNumConnectionsFromOptions) { |
| 1332 QuicConfig config; | 1335 QuicConfig config; |
| 1333 QuicTagVector options; | 1336 QuicTagVector options; |
| 1334 | 1337 |
| 1335 options.push_back(k1CON); | 1338 options.push_back(k1CON); |
| 1336 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); | 1339 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); |
| 1337 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)); | 1340 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)); |
| 1338 EXPECT_CALL(*send_algorithm_, SetNumEmulatedConnections(1)); | 1341 EXPECT_CALL(*send_algorithm_, SetNumEmulatedConnections(1)); |
| 1339 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) | 1342 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) |
| 1340 .WillOnce(Return(100 * kDefaultTCPMSS)); | 1343 .WillOnce(Return(100 * kDefaultTCPMSS)); |
| 1341 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | 1344 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); |
| 1342 manager_.SetFromConfig(config); | 1345 manager_.SetFromConfig(config); |
| 1343 | 1346 |
| 1344 QuicSentPacketManagerPeer::SetIsServer(&manager_, false); | 1347 QuicSentPacketManagerPeer::SetIsServer(&manager_, false); |
| 1345 QuicConfig client_config; | 1348 QuicConfig client_config; |
| 1346 client_config.SetConnectionOptionsToSend(options); | 1349 client_config.SetConnectionOptionsToSend(options); |
| 1347 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)); | 1350 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)); |
| 1348 EXPECT_CALL(*send_algorithm_, SetNumEmulatedConnections(1)); | 1351 EXPECT_CALL(*send_algorithm_, SetNumEmulatedConnections(1)); |
| 1349 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) | 1352 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) |
| 1350 .WillOnce(Return(100 * kDefaultTCPMSS)); | 1353 .WillOnce(Return(100 * kDefaultTCPMSS)); |
| 1351 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | 1354 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); |
| 1352 manager_.SetFromConfig(client_config); | 1355 manager_.SetFromConfig(client_config); |
| 1353 } | 1356 } |
| 1354 | 1357 |
| 1358 TEST_F(QuicSentPacketManagerTest, NegotiateNoTLPFromOptionsAtServer) { |
| 1359 QuicConfig config; |
| 1360 QuicTagVector options; |
| 1361 |
| 1362 options.push_back(kNTLP); |
| 1363 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); |
| 1364 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)); |
| 1365 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) |
| 1366 .WillOnce(Return(100 * kDefaultTCPMSS)); |
| 1367 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); |
| 1368 manager_.SetFromConfig(config); |
| 1369 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_)); |
| 1370 } |
| 1371 |
| 1372 TEST_F(QuicSentPacketManagerTest, NegotiateNoTLPFromOptionsAtClient) { |
| 1373 QuicConfig client_config; |
| 1374 QuicTagVector options; |
| 1375 |
| 1376 options.push_back(kNTLP); |
| 1377 QuicSentPacketManagerPeer::SetIsServer(&manager_, false); |
| 1378 client_config.SetConnectionOptionsToSend(options); |
| 1379 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)); |
| 1380 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) |
| 1381 .WillOnce(Return(100 * kDefaultTCPMSS)); |
| 1382 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); |
| 1383 manager_.SetFromConfig(client_config); |
| 1384 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_)); |
| 1385 } |
| 1386 |
| 1355 TEST_F(QuicSentPacketManagerTest, NegotiatePacingFromOptions) { | 1387 TEST_F(QuicSentPacketManagerTest, NegotiatePacingFromOptions) { |
| 1356 EXPECT_FALSE(manager_.using_pacing()); | 1388 EXPECT_FALSE(manager_.using_pacing()); |
| 1357 | 1389 |
| 1358 QuicConfig config; | 1390 QuicConfig config; |
| 1359 QuicTagVector options; | 1391 QuicTagVector options; |
| 1360 options.push_back(kPACE); | 1392 options.push_back(kPACE); |
| 1361 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); | 1393 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); |
| 1362 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)); | 1394 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)); |
| 1363 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) | 1395 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) |
| 1364 .WillOnce(Return(100 * kDefaultTCPMSS)); | 1396 .WillOnce(Return(100 * kDefaultTCPMSS)); |
| 1365 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | 1397 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); |
| 1366 manager_.SetFromConfig(config); | 1398 manager_.SetFromConfig(config); |
| 1367 | 1399 |
| 1368 EXPECT_TRUE(manager_.using_pacing()); | 1400 EXPECT_TRUE(manager_.using_pacing()); |
| 1369 } | 1401 } |
| 1370 | 1402 |
| 1403 TEST_F(QuicSentPacketManagerTest, NegotiateReceiveWindowFromOptions) { |
| 1404 EXPECT_EQ(kDefaultSocketReceiveBuffer, |
| 1405 QuicSentPacketManagerPeer::GetReceiveWindow(&manager_)); |
| 1406 |
| 1407 // Try to set a size below the minimum and ensure it gets set to the min. |
| 1408 QuicConfig client_config; |
| 1409 QuicConfigPeer::SetReceivedSocketReceiveBuffer(&client_config, 1024); |
| 1410 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); |
| 1411 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)); |
| 1412 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) |
| 1413 .WillOnce(Return(100 * kDefaultTCPMSS)); |
| 1414 manager_.SetFromConfig(client_config); |
| 1415 |
| 1416 EXPECT_EQ(kMinSocketReceiveBuffer, |
| 1417 QuicSentPacketManagerPeer::GetReceiveWindow(&manager_)); |
| 1418 |
| 1419 // Ensure the smaller send window only allows 16 packets to be sent. |
| 1420 for (QuicPacketSequenceNumber i = 1; i <= 16; ++i) { |
| 1421 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _)).WillOnce(Return( |
| 1422 QuicTime::Delta::Zero())); |
| 1423 EXPECT_EQ(QuicTime::Delta::Zero(), |
| 1424 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA)); |
| 1425 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, BytesInFlight(), i, |
| 1426 1024, HAS_RETRANSMITTABLE_DATA)) |
| 1427 .WillOnce(Return(true)); |
| 1428 SerializedPacket packet(CreatePacket(i, true)); |
| 1429 manager_.OnPacketSent(&packet, 0, clock_.Now(), 1024, |
| 1430 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA); |
| 1431 } |
| 1432 EXPECT_EQ(QuicTime::Delta::Infinite(), |
| 1433 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA)); |
| 1434 } |
| 1435 |
| 1371 TEST_F(QuicSentPacketManagerTest, UseInitialRoundTripTimeToSend) { | 1436 TEST_F(QuicSentPacketManagerTest, UseInitialRoundTripTimeToSend) { |
| 1372 uint32 initial_rtt_us = 325000; | 1437 uint32 initial_rtt_us = 325000; |
| 1373 EXPECT_NE(initial_rtt_us, | 1438 EXPECT_NE(initial_rtt_us, |
| 1374 manager_.GetRttStats()->SmoothedRtt().ToMicroseconds()); | 1439 manager_.GetRttStats()->SmoothedRtt().ToMicroseconds()); |
| 1375 | 1440 |
| 1376 QuicConfig config; | 1441 QuicConfig config; |
| 1377 config.SetInitialRoundTripTimeUsToSend(initial_rtt_us); | 1442 config.SetInitialRoundTripTimeUsToSend(initial_rtt_us); |
| 1378 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | 1443 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); |
| 1379 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)); | 1444 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)); |
| 1380 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) | 1445 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) |
| 1381 .WillOnce(Return(100 * kDefaultTCPMSS)); | 1446 .WillOnce(Return(100 * kDefaultTCPMSS)); |
| 1382 manager_.SetFromConfig(config); | 1447 manager_.SetFromConfig(config); |
| 1383 | 1448 |
| 1384 EXPECT_EQ(initial_rtt_us, | 1449 EXPECT_EQ(initial_rtt_us, |
| 1385 manager_.GetRttStats()->SmoothedRtt().ToMicroseconds()); | 1450 manager_.GetRttStats()->SmoothedRtt().ToMicroseconds()); |
| 1386 } | 1451 } |
| 1387 | 1452 |
| 1388 } // namespace | 1453 } // namespace |
| 1389 } // namespace test | 1454 } // namespace test |
| 1390 } // namespace net | 1455 } // namespace net |
| OLD | NEW |