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

Side by Side Diff: net/quic/core/congestion_control/pacing_sender_test.cc

Issue 2228783004: Fix memory corruption from SetMaxPacingRate by inlining PacingSender. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@129351671
Patch Set: git pull from upper stream Created 4 years, 4 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) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 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/core/congestion_control/pacing_sender.h" 5 #include "net/quic/core/congestion_control/pacing_sender.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "net/quic/core/quic_protocol.h" 10 #include "net/quic/core/quic_protocol.h"
(...skipping 11 matching lines...) Expand all
22 const QuicByteCount kBytesInFlight = 1024; 22 const QuicByteCount kBytesInFlight = 1024;
23 const int kInitialBurstPackets = 10; 23 const int kInitialBurstPackets = 10;
24 24
25 class PacingSenderTest : public ::testing::Test { 25 class PacingSenderTest : public ::testing::Test {
26 protected: 26 protected:
27 PacingSenderTest() 27 PacingSenderTest()
28 : zero_time_(QuicTime::Delta::Zero()), 28 : zero_time_(QuicTime::Delta::Zero()),
29 infinite_time_(QuicTime::Delta::Infinite()), 29 infinite_time_(QuicTime::Delta::Infinite()),
30 packet_number_(1), 30 packet_number_(1),
31 mock_sender_(new StrictMock<MockSendAlgorithm>()), 31 mock_sender_(new StrictMock<MockSendAlgorithm>()),
32 pacing_sender_(new PacingSender(mock_sender_, 32 pacing_sender_(new PacingSender) {
33 QuicTime::Delta::FromMilliseconds(1), 33 pacing_sender_->set_sender(mock_sender_.get());
34 0)) {
35 // Pick arbitrary time. 34 // Pick arbitrary time.
36 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(9)); 35 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(9));
37 } 36 }
38 37
39 ~PacingSenderTest() override {} 38 ~PacingSenderTest() override {}
40 39
41 void InitPacingRate(QuicPacketCount burst_size, QuicBandwidth bandwidth) { 40 void InitPacingRate(QuicPacketCount burst_size, QuicBandwidth bandwidth) {
42 pacing_sender_.reset(); 41 mock_sender_.reset(new StrictMock<MockSendAlgorithm>());
43 mock_sender_ = new StrictMock<MockSendAlgorithm>(); 42 pacing_sender_.reset(new PacingSender);
44 pacing_sender_.reset(new PacingSender( 43 pacing_sender_->set_sender(mock_sender_.get());
45 mock_sender_, QuicTime::Delta::FromMilliseconds(1), burst_size));
46 EXPECT_CALL(*mock_sender_, PacingRate(_)).WillRepeatedly(Return(bandwidth)); 44 EXPECT_CALL(*mock_sender_, PacingRate(_)).WillRepeatedly(Return(bandwidth));
45 if (burst_size == 0) {
46 EXPECT_CALL(*mock_sender_, OnCongestionEvent(_, _, _, _));
47 SendAlgorithmInterface::CongestionVector lost_packets;
48 lost_packets.push_back(std::make_pair(1, kMaxPacketSize));
49 SendAlgorithmInterface::CongestionVector empty;
50 pacing_sender_->OnCongestionEvent(true, 1234, empty, lost_packets);
51 } else if (burst_size != kInitialBurstPackets) {
52 LOG(FATAL) << "Unsupported burst_size " << burst_size
53 << " specificied, only 0 and " << kInitialBurstPackets
54 << " are supported.";
55 }
47 } 56 }
48 57
49 void CheckPacketIsSentImmediately(HasRetransmittableData retransmittable_data, 58 void CheckPacketIsSentImmediately(HasRetransmittableData retransmittable_data,
50 QuicByteCount bytes_in_flight, 59 QuicByteCount bytes_in_flight,
51 bool in_recovery) { 60 bool in_recovery) {
52 // In order for the packet to be sendable, the underlying sender must 61 // In order for the packet to be sendable, the underlying sender must
53 // permit it to be sent immediately. 62 // permit it to be sent immediately.
54 for (int i = 0; i < 2; ++i) { 63 for (int i = 0; i < 2; ++i) {
55 EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(), bytes_in_flight)) 64 EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(), bytes_in_flight))
56 .WillOnce(Return(zero_time_)); 65 .WillOnce(Return(zero_time_));
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 EXPECT_CALL(*mock_sender_, OnCongestionEvent(true, kBytesInFlight, _, _)); 102 EXPECT_CALL(*mock_sender_, OnCongestionEvent(true, kBytesInFlight, _, _));
94 SendAlgorithmInterface::CongestionVector empty_map; 103 SendAlgorithmInterface::CongestionVector empty_map;
95 pacing_sender_->OnCongestionEvent(true, kBytesInFlight, empty_map, 104 pacing_sender_->OnCongestionEvent(true, kBytesInFlight, empty_map,
96 empty_map); 105 empty_map);
97 } 106 }
98 107
99 const QuicTime::Delta zero_time_; 108 const QuicTime::Delta zero_time_;
100 const QuicTime::Delta infinite_time_; 109 const QuicTime::Delta infinite_time_;
101 MockClock clock_; 110 MockClock clock_;
102 QuicPacketNumber packet_number_; 111 QuicPacketNumber packet_number_;
103 StrictMock<MockSendAlgorithm>* mock_sender_; 112 std::unique_ptr<StrictMock<MockSendAlgorithm>> mock_sender_;
104 std::unique_ptr<PacingSender> pacing_sender_; 113 std::unique_ptr<PacingSender> pacing_sender_;
105 }; 114 };
106 115
107 TEST_F(PacingSenderTest, NoSend) { 116 TEST_F(PacingSenderTest, NoSend) {
108 for (int i = 0; i < 2; ++i) { 117 for (int i = 0; i < 2; ++i) {
109 EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(), kBytesInFlight)) 118 EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(), kBytesInFlight))
110 .WillOnce(Return(infinite_time_)); 119 .WillOnce(Return(infinite_time_));
111 EXPECT_EQ(infinite_time_, 120 EXPECT_EQ(infinite_time_,
112 pacing_sender_->TimeUntilSend(clock_.Now(), kBytesInFlight)); 121 pacing_sender_->TimeUntilSend(clock_.Now(), kBytesInFlight));
113 } 122 }
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
329 kMaxPacketSize, QuicTime::Delta::FromMilliseconds(1))); 338 kMaxPacketSize, QuicTime::Delta::FromMilliseconds(1)));
330 339
331 UpdateRtt(); 340 UpdateRtt();
332 341
333 // Ensure only one packet is sent immediately and the rest are paced. 342 // Ensure only one packet is sent immediately and the rest are paced.
334 CheckPacketIsSentImmediately(HAS_RETRANSMITTABLE_DATA, 0, true); 343 CheckPacketIsSentImmediately(HAS_RETRANSMITTABLE_DATA, 0, true);
335 CheckPacketIsSentImmediately(); 344 CheckPacketIsSentImmediately();
336 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2)); 345 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
337 } 346 }
338 347
339 TEST_F(PacingSenderTest, VerifyInnerSenderCalled) {
340 QuicBandwidth kBandwidth = QuicBandwidth::FromBitsPerSecond(1000);
341 QuicTime kTime = QuicTime::Infinite();
342 QuicTime::Delta kTimeDelta = QuicTime::Delta::Infinite();
343 QuicByteCount kBytes = 12345u;
344
345 EXPECT_CALL(*mock_sender_, SetFromConfig(_, Perspective::IS_SERVER));
346 QuicConfig config;
347 pacing_sender_->SetFromConfig(config, Perspective::IS_SERVER);
348
349 EXPECT_CALL(*mock_sender_, ResumeConnectionState(_, true));
350 CachedNetworkParameters cached_network_params;
351 pacing_sender_->ResumeConnectionState(cached_network_params, true);
352
353 EXPECT_CALL(*mock_sender_, SetNumEmulatedConnections(2));
354 pacing_sender_->SetNumEmulatedConnections(2);
355
356 SendAlgorithmInterface::CongestionVector packets;
357 EXPECT_CALL(*mock_sender_, OnCongestionEvent(true, kBytes, packets, packets));
358 pacing_sender_->OnCongestionEvent(true, kBytes, packets, packets);
359
360 EXPECT_CALL(*mock_sender_, OnPacketSent(kTime, kBytes, 123u, kBytes,
361 HAS_RETRANSMITTABLE_DATA));
362 EXPECT_CALL(*mock_sender_, PacingRate(_)).WillOnce(Return(kBandwidth));
363 pacing_sender_->OnPacketSent(kTime, kBytes, 123u, kBytes,
364 HAS_RETRANSMITTABLE_DATA);
365
366 EXPECT_CALL(*mock_sender_, OnRetransmissionTimeout(true));
367 pacing_sender_->OnRetransmissionTimeout(true);
368
369 EXPECT_CALL(*mock_sender_, OnConnectionMigration());
370 pacing_sender_->OnConnectionMigration();
371
372 EXPECT_CALL(*mock_sender_, TimeUntilSend(kTime, kBytes))
373 .WillOnce(Return(kTimeDelta));
374 pacing_sender_->TimeUntilSend(kTime, kBytes);
375
376 EXPECT_CALL(*mock_sender_, PacingRate(_)).WillOnce(Return(kBandwidth));
377 EXPECT_EQ(kBandwidth, pacing_sender_->PacingRate(0));
378
379 EXPECT_CALL(*mock_sender_, BandwidthEstimate()).WillOnce(Return(kBandwidth));
380 EXPECT_EQ(kBandwidth, pacing_sender_->BandwidthEstimate());
381
382 EXPECT_CALL(*mock_sender_, RetransmissionDelay())
383 .WillOnce(Return(kTimeDelta));
384 EXPECT_EQ(kTimeDelta, pacing_sender_->RetransmissionDelay());
385
386 EXPECT_CALL(*mock_sender_, GetCongestionWindow()).WillOnce(Return(kBytes));
387 EXPECT_EQ(kBytes, pacing_sender_->GetCongestionWindow());
388
389 EXPECT_CALL(*mock_sender_, InSlowStart()).WillOnce(Return(true));
390 EXPECT_TRUE(pacing_sender_->InSlowStart());
391
392 EXPECT_CALL(*mock_sender_, InRecovery()).WillOnce(Return(true));
393 EXPECT_TRUE(pacing_sender_->InRecovery());
394
395 EXPECT_CALL(*mock_sender_, GetSlowStartThreshold()).WillOnce(Return(kBytes));
396 EXPECT_EQ(kBytes, pacing_sender_->GetSlowStartThreshold());
397
398 EXPECT_CALL(*mock_sender_, GetCongestionControlType())
399 .WillOnce(Return(kReno));
400 EXPECT_EQ(kReno, pacing_sender_->GetCongestionControlType());
401 }
402
403 } // namespace test 348 } // namespace test
404 } // namespace net 349 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/core/congestion_control/pacing_sender.cc ('k') | net/quic/core/quic_sent_packet_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698