Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(125)

Side by Side Diff: net/quic/congestion_control/tcp_cubic_sender_bytes_test.cc

Issue 1918953003: Landing Recent QUIC changes until 4/22/2016 14:55 UTC (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Deleted SpdyFramerTests missed while mergeing 120451808 Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2015 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/congestion_control/tcp_cubic_sender_bytes.h" 5 #include "net/quic/congestion_control/tcp_cubic_sender_bytes.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cstdint> 8 #include <cstdint>
9 #include <memory> 9 #include <memory>
10 10
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
224 expected_send_window += kDefaultTCPMSS; 224 expected_send_window += kDefaultTCPMSS;
225 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); 225 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow());
226 226
227 // Now RTO and ensure slow start gets reset. 227 // Now RTO and ensure slow start gets reset.
228 EXPECT_TRUE(sender_->hybrid_slow_start().started()); 228 EXPECT_TRUE(sender_->hybrid_slow_start().started());
229 sender_->OnRetransmissionTimeout(true); 229 sender_->OnRetransmissionTimeout(true);
230 EXPECT_FALSE(sender_->hybrid_slow_start().started()); 230 EXPECT_FALSE(sender_->hybrid_slow_start().started());
231 } 231 }
232 232
233 TEST_F(TcpCubicSenderBytesTest, SlowStartPacketLossWithLargeReduction) { 233 TEST_F(TcpCubicSenderBytesTest, SlowStartPacketLossWithLargeReduction) {
234 FLAGS_quic_sslr_limit_reduction = true;
234 QuicConfig config; 235 QuicConfig config;
235 QuicTagVector options; 236 QuicTagVector options;
236 options.push_back(kSSLR); 237 options.push_back(kSSLR);
237 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); 238 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
238 sender_->SetFromConfig(config, Perspective::IS_SERVER); 239 sender_->SetFromConfig(config, Perspective::IS_SERVER);
239 240
240 sender_->SetNumEmulatedConnections(1); 241 sender_->SetNumEmulatedConnections(1);
241 const int kNumberOfAcks = 10; 242 const int kNumberOfAcks = (kDefaultWindowTCP / (2 * kDefaultTCPMSS)) - 1;
242 for (int i = 0; i < kNumberOfAcks; ++i) { 243 for (int i = 0; i < kNumberOfAcks; ++i) {
243 // Send our full send window. 244 // Send our full send window.
244 SendAvailableSendWindow(); 245 SendAvailableSendWindow();
245 AckNPackets(2); 246 AckNPackets(2);
246 } 247 }
247 SendAvailableSendWindow(); 248 SendAvailableSendWindow();
248 QuicByteCount expected_send_window = 249 QuicByteCount expected_send_window =
249 kDefaultWindowTCP + (kDefaultTCPMSS * 2 * kNumberOfAcks); 250 kDefaultWindowTCP + (kDefaultTCPMSS * 2 * kNumberOfAcks);
250 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); 251 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow());
251 252
252 // Lose a packet to exit slow start. We should now have fallen out of 253 // Lose a packet to exit slow start. We should now have fallen out of
253 // slow start with a window reduced by 1. 254 // slow start with a window reduced by 1.
254 LoseNPackets(1); 255 LoseNPackets(1);
255 expected_send_window -= kDefaultTCPMSS; 256 expected_send_window -= kDefaultTCPMSS;
256 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); 257 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow());
257 258
258 // Lose 5 packets in recovery and verify that congestion window is reduced 259 // Lose 5 packets in recovery and verify that congestion window is reduced
259 // further. 260 // further.
260 LoseNPackets(5); 261 LoseNPackets(5);
261 expected_send_window -= 5 * kDefaultTCPMSS; 262 expected_send_window -= 5 * kDefaultTCPMSS;
262 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); 263 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow());
264 // Lose another 10 packets and ensure it reduces below half the peak CWND,
265 // because we never acked the full IW.
266 LoseNPackets(10);
267 expected_send_window -= 10 * kDefaultTCPMSS;
268 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow());
263 269
264 size_t packets_in_recovery_window = expected_send_window / kDefaultTCPMSS; 270 size_t packets_in_recovery_window = expected_send_window / kDefaultTCPMSS;
265 271
266 // Recovery phase. We need to ack every packet in the recovery window before 272 // Recovery phase. We need to ack every packet in the recovery window before
267 // we exit recovery. 273 // we exit recovery.
268 size_t number_of_packets_in_window = expected_send_window / kDefaultTCPMSS; 274 size_t number_of_packets_in_window = expected_send_window / kDefaultTCPMSS;
269 DVLOG(1) << "number_packets: " << number_of_packets_in_window; 275 DVLOG(1) << "number_packets: " << number_of_packets_in_window;
270 AckNPackets(packets_in_recovery_window); 276 AckNPackets(packets_in_recovery_window);
271 SendAvailableSendWindow(); 277 SendAvailableSendWindow();
272 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); 278 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow());
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
312 expected_send_window -= kDefaultTCPMSS; 318 expected_send_window -= kDefaultTCPMSS;
313 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); 319 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow());
314 320
315 // Lose 10 packets in recovery and verify that congestion window is reduced 321 // Lose 10 packets in recovery and verify that congestion window is reduced
316 // by 5 packets. 322 // by 5 packets.
317 LoseNPackets(10, kDefaultTCPMSS / 2); 323 LoseNPackets(10, kDefaultTCPMSS / 2);
318 expected_send_window -= 5 * kDefaultTCPMSS; 324 expected_send_window -= 5 * kDefaultTCPMSS;
319 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); 325 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow());
320 } 326 }
321 327
328 TEST_F(TcpCubicSenderBytesTest, SlowStartPacketLossWithMaxHalfReduction) {
329 FLAGS_quic_sslr_limit_reduction = true;
330 QuicConfig config;
331 QuicTagVector options;
332 options.push_back(kSSLR);
333 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
334 sender_->SetFromConfig(config, Perspective::IS_SERVER);
335
336 sender_->SetNumEmulatedConnections(1);
337 const int kNumberOfAcks = kInitialCongestionWindowPackets / 2;
338 for (int i = 0; i < kNumberOfAcks; ++i) {
339 // Send our full send window.
340 SendAvailableSendWindow();
341 AckNPackets(2);
342 }
343 SendAvailableSendWindow();
344 QuicByteCount expected_send_window =
345 kDefaultWindowTCP + (kDefaultTCPMSS * 2 * kNumberOfAcks);
346 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow());
347
348 // Lose a packet to exit slow start. We should now have fallen out of
349 // slow start with a window reduced by 1.
350 LoseNPackets(1);
351 expected_send_window -= kDefaultTCPMSS;
352 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow());
353
354 // Lose half the outstanding packets in recovery and verify the congestion
355 // window is only reduced by a max of half.
356 LoseNPackets(kNumberOfAcks * 2);
357 expected_send_window -= (kNumberOfAcks * 2 - 1) * kDefaultTCPMSS;
358 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow());
359 LoseNPackets(5);
360 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow());
361 }
362
322 TEST_F(TcpCubicSenderBytesTest, NoPRRWhenLessThanOnePacketInFlight) { 363 TEST_F(TcpCubicSenderBytesTest, NoPRRWhenLessThanOnePacketInFlight) {
323 SendAvailableSendWindow(); 364 SendAvailableSendWindow();
324 LoseNPackets(kInitialCongestionWindowPackets - 1); 365 LoseNPackets(kInitialCongestionWindowPackets - 1);
325 AckNPackets(1); 366 AckNPackets(1);
326 // PRR will allow 2 packets for every ack during recovery. 367 // PRR will allow 2 packets for every ack during recovery.
327 EXPECT_EQ(2, SendAvailableSendWindow()); 368 EXPECT_EQ(2, SendAvailableSendWindow());
328 // Simulate abandoning all packets by supplying a bytes_in_flight of 0. 369 // Simulate abandoning all packets by supplying a bytes_in_flight of 0.
329 // PRR should now allow a packet to be sent, even though prr's state variables 370 // PRR should now allow a packet to be sent, even though prr's state variables
330 // believe it has sent enough packets. 371 // believe it has sent enough packets.
331 EXPECT_EQ(QuicTime::Delta::Zero(), sender_->TimeUntilSend(clock_.Now(), 0)); 372 EXPECT_EQ(QuicTime::Delta::Zero(), sender_->TimeUntilSend(clock_.Now(), 0));
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after
689 sender_->ResumeConnectionState(cached_network_params, false); 730 sender_->ResumeConnectionState(cached_network_params, false);
690 EXPECT_EQ(kNumberOfPackets * kDefaultTCPMSS, sender_->GetCongestionWindow()); 731 EXPECT_EQ(kNumberOfPackets * kDefaultTCPMSS, sender_->GetCongestionWindow());
691 732
692 // Resumed CWND is limited to be in a sensible range. 733 // Resumed CWND is limited to be in a sensible range.
693 cached_network_params.set_bandwidth_estimate_bytes_per_second( 734 cached_network_params.set_bandwidth_estimate_bytes_per_second(
694 (kMaxCongestionWindow + 1) * kDefaultTCPMSS); 735 (kMaxCongestionWindow + 1) * kDefaultTCPMSS);
695 sender_->ResumeConnectionState(cached_network_params, false); 736 sender_->ResumeConnectionState(cached_network_params, false);
696 EXPECT_EQ(kMaxCongestionWindow * kDefaultTCPMSS, 737 EXPECT_EQ(kMaxCongestionWindow * kDefaultTCPMSS,
697 sender_->GetCongestionWindow()); 738 sender_->GetCongestionWindow());
698 739
699 cached_network_params.set_bandwidth_estimate_bytes_per_second( 740 if (FLAGS_quic_no_lower_bw_resumption_limit) {
700 (kMinCongestionWindowForBandwidthResumption - 1) * kDefaultTCPMSS); 741 // Resume with an illegal value of 0 and verify the server uses 1 instead.
701 sender_->ResumeConnectionState(cached_network_params, false); 742 cached_network_params.set_bandwidth_estimate_bytes_per_second(0);
702 EXPECT_EQ(kMinCongestionWindowForBandwidthResumption * kDefaultTCPMSS, 743 sender_->ResumeConnectionState(cached_network_params, false);
703 sender_->GetCongestionWindow()); 744 EXPECT_EQ(sender_->min_congestion_window(), sender_->GetCongestionWindow());
745 } else {
746 cached_network_params.set_bandwidth_estimate_bytes_per_second(
747 (kMinCongestionWindowForBandwidthResumption - 1) * kDefaultTCPMSS);
748 sender_->ResumeConnectionState(cached_network_params, false);
749 EXPECT_EQ(kMinCongestionWindowForBandwidthResumption * kDefaultTCPMSS,
750 sender_->GetCongestionWindow());
751 }
704 752
705 // Resume to the max value. 753 // Resume to the max value.
706 cached_network_params.set_max_bandwidth_estimate_bytes_per_second( 754 cached_network_params.set_max_bandwidth_estimate_bytes_per_second(
707 (kMinCongestionWindowForBandwidthResumption + 10) * kDefaultTCPMSS); 755 kMaxCongestionWindow * kDefaultTCPMSS);
708 sender_->ResumeConnectionState(cached_network_params, true); 756 sender_->ResumeConnectionState(cached_network_params, true);
709 EXPECT_EQ((kMinCongestionWindowForBandwidthResumption + 10) * kDefaultTCPMSS, 757 EXPECT_EQ(kMaxCongestionWindow * kDefaultTCPMSS,
710 sender_->GetCongestionWindow()); 758 sender_->GetCongestionWindow());
711 } 759 }
712 760
713 TEST_F(TcpCubicSenderBytesTest, PaceBelowCWND) { 761 TEST_F(TcpCubicSenderBytesTest, PaceBelowCWND) {
714 QuicConfig config; 762 QuicConfig config;
715 763
716 // Verify that kCOPT: kMIN4 forces the min CWND to 1 packet, but allows up 764 // Verify that kCOPT: kMIN4 forces the min CWND to 1 packet, but allows up
717 // to 4 to be sent. 765 // to 4 to be sent.
718 QuicTagVector options; 766 QuicTagVector options;
719 options.push_back(kMIN4); 767 options.push_back(kMIN4);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
757 // Resets cwnd and slow start threshold on connection migrations. 805 // Resets cwnd and slow start threshold on connection migrations.
758 sender_->OnConnectionMigration(); 806 sender_->OnConnectionMigration();
759 EXPECT_EQ(kDefaultWindowTCP, sender_->GetCongestionWindow()); 807 EXPECT_EQ(kDefaultWindowTCP, sender_->GetCongestionWindow());
760 EXPECT_EQ(kMaxCongestionWindow * kDefaultTCPMSS, 808 EXPECT_EQ(kMaxCongestionWindow * kDefaultTCPMSS,
761 sender_->GetSlowStartThreshold()); 809 sender_->GetSlowStartThreshold());
762 EXPECT_FALSE(sender_->hybrid_slow_start().started()); 810 EXPECT_FALSE(sender_->hybrid_slow_start().started());
763 } 811 }
764 812
765 } // namespace test 813 } // namespace test
766 } // namespace net 814 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/congestion_control/tcp_cubic_sender_bytes.cc ('k') | net/quic/congestion_control/tcp_cubic_sender_packets.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698