| Index: net/quic/congestion_control/pacing_sender_test.cc
|
| diff --git a/net/quic/congestion_control/pacing_sender_test.cc b/net/quic/congestion_control/pacing_sender_test.cc
|
| deleted file mode 100644
|
| index 3277cacd7a9b5fe69aa80bcf25976bd98cf10acd..0000000000000000000000000000000000000000
|
| --- a/net/quic/congestion_control/pacing_sender_test.cc
|
| +++ /dev/null
|
| @@ -1,404 +0,0 @@
|
| -// Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "net/quic/congestion_control/pacing_sender.h"
|
| -
|
| -#include <memory>
|
| -
|
| -#include "base/logging.h"
|
| -#include "net/quic/quic_protocol.h"
|
| -#include "net/quic/test_tools/mock_clock.h"
|
| -#include "net/quic/test_tools/quic_test_utils.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -using testing::Return;
|
| -using testing::StrictMock;
|
| -using testing::_;
|
| -
|
| -namespace net {
|
| -namespace test {
|
| -
|
| -const QuicByteCount kBytesInFlight = 1024;
|
| -const int kInitialBurstPackets = 10;
|
| -
|
| -class PacingSenderTest : public ::testing::Test {
|
| - protected:
|
| - PacingSenderTest()
|
| - : zero_time_(QuicTime::Delta::Zero()),
|
| - infinite_time_(QuicTime::Delta::Infinite()),
|
| - packet_number_(1),
|
| - mock_sender_(new StrictMock<MockSendAlgorithm>()),
|
| - pacing_sender_(new PacingSender(mock_sender_,
|
| - QuicTime::Delta::FromMilliseconds(1),
|
| - 0)) {
|
| - // Pick arbitrary time.
|
| - clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(9));
|
| - }
|
| -
|
| - ~PacingSenderTest() override {}
|
| -
|
| - void InitPacingRate(QuicPacketCount burst_size, QuicBandwidth bandwidth) {
|
| - pacing_sender_.reset();
|
| - mock_sender_ = new StrictMock<MockSendAlgorithm>();
|
| - pacing_sender_.reset(new PacingSender(
|
| - mock_sender_, QuicTime::Delta::FromMilliseconds(1), burst_size));
|
| - EXPECT_CALL(*mock_sender_, PacingRate(_)).WillRepeatedly(Return(bandwidth));
|
| - }
|
| -
|
| - void CheckPacketIsSentImmediately(HasRetransmittableData retransmittable_data,
|
| - QuicByteCount bytes_in_flight,
|
| - bool in_recovery) {
|
| - // In order for the packet to be sendable, the underlying sender must
|
| - // permit it to be sent immediately.
|
| - for (int i = 0; i < 2; ++i) {
|
| - EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(), bytes_in_flight))
|
| - .WillOnce(Return(zero_time_));
|
| - // Verify that the packet can be sent immediately.
|
| - EXPECT_EQ(zero_time_,
|
| - pacing_sender_->TimeUntilSend(clock_.Now(), bytes_in_flight));
|
| - }
|
| -
|
| - // Actually send the packet.
|
| - if (bytes_in_flight == 0) {
|
| - EXPECT_CALL(*mock_sender_, InRecovery()).WillOnce(Return(in_recovery));
|
| - }
|
| - EXPECT_CALL(*mock_sender_,
|
| - OnPacketSent(clock_.Now(), bytes_in_flight, packet_number_,
|
| - kMaxPacketSize, retransmittable_data));
|
| - pacing_sender_->OnPacketSent(clock_.Now(), bytes_in_flight,
|
| - packet_number_++, kMaxPacketSize,
|
| - retransmittable_data);
|
| - }
|
| -
|
| - void CheckPacketIsSentImmediately() {
|
| - CheckPacketIsSentImmediately(HAS_RETRANSMITTABLE_DATA, kBytesInFlight,
|
| - false);
|
| - }
|
| -
|
| - void CheckPacketIsDelayed(QuicTime::Delta delay) {
|
| - // In order for the packet to be sendable, the underlying sender must
|
| - // permit it to be sent immediately.
|
| - for (int i = 0; i < 2; ++i) {
|
| - EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(), kBytesInFlight))
|
| - .WillOnce(Return(zero_time_));
|
| - // Verify that the packet is delayed.
|
| - EXPECT_EQ(delay.ToMicroseconds(),
|
| - pacing_sender_->TimeUntilSend(clock_.Now(), kBytesInFlight)
|
| - .ToMicroseconds());
|
| - }
|
| - }
|
| -
|
| - void UpdateRtt() {
|
| - EXPECT_CALL(*mock_sender_, OnCongestionEvent(true, kBytesInFlight, _, _));
|
| - SendAlgorithmInterface::CongestionVector empty_map;
|
| - pacing_sender_->OnCongestionEvent(true, kBytesInFlight, empty_map,
|
| - empty_map);
|
| - }
|
| -
|
| - const QuicTime::Delta zero_time_;
|
| - const QuicTime::Delta infinite_time_;
|
| - MockClock clock_;
|
| - QuicPacketNumber packet_number_;
|
| - StrictMock<MockSendAlgorithm>* mock_sender_;
|
| - std::unique_ptr<PacingSender> pacing_sender_;
|
| -};
|
| -
|
| -TEST_F(PacingSenderTest, NoSend) {
|
| - for (int i = 0; i < 2; ++i) {
|
| - EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(), kBytesInFlight))
|
| - .WillOnce(Return(infinite_time_));
|
| - EXPECT_EQ(infinite_time_,
|
| - pacing_sender_->TimeUntilSend(clock_.Now(), kBytesInFlight));
|
| - }
|
| -}
|
| -
|
| -TEST_F(PacingSenderTest, SendNow) {
|
| - for (int i = 0; i < 2; ++i) {
|
| - EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(), kBytesInFlight))
|
| - .WillOnce(Return(zero_time_));
|
| - EXPECT_EQ(zero_time_,
|
| - pacing_sender_->TimeUntilSend(clock_.Now(), kBytesInFlight));
|
| - }
|
| -}
|
| -
|
| -TEST_F(PacingSenderTest, VariousSending) {
|
| - // Configure pacing rate of 1 packet per 1 ms, no initial burst.
|
| - InitPacingRate(0, QuicBandwidth::FromBytesAndTimeDelta(
|
| - kMaxPacketSize, QuicTime::Delta::FromMilliseconds(1)));
|
| -
|
| - // Now update the RTT and verify that packets are actually paced.
|
| - UpdateRtt();
|
| -
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsSentImmediately();
|
| -
|
| - // The first packet was a "make up", then we sent two packets "into the
|
| - // future", so the delay should be 2.
|
| - CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
|
| -
|
| - // Wake up on time.
|
| - clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(2));
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
|
| -
|
| - // Wake up late.
|
| - clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(4));
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
|
| -
|
| - // Wake up really late.
|
| - clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(8));
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
|
| -
|
| - // Wake up really late again, but application pause partway through.
|
| - clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(8));
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsSentImmediately();
|
| - clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(100));
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
|
| -
|
| - // Wake up too early.
|
| - CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
|
| -
|
| - // Wake up early, but after enough time has passed to permit a send.
|
| - clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1));
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
|
| -}
|
| -
|
| -TEST_F(PacingSenderTest, InitialBurst) {
|
| - // Configure pacing rate of 1 packet per 1 ms.
|
| - InitPacingRate(10, QuicBandwidth::FromBytesAndTimeDelta(
|
| - kMaxPacketSize, QuicTime::Delta::FromMilliseconds(1)));
|
| -
|
| - EXPECT_CALL(*mock_sender_, GetCongestionWindow())
|
| - .WillOnce(Return(10 * kDefaultTCPMSS));
|
| - // Update the RTT and verify that the first 10 packets aren't paced.
|
| - UpdateRtt();
|
| -
|
| - // Send 10 packets, and verify that they are not paced.
|
| - for (int i = 0; i < kInitialBurstPackets; ++i) {
|
| - CheckPacketIsSentImmediately();
|
| - }
|
| -
|
| - // The first packet was a "make up", then we sent two packets "into the
|
| - // future", so the delay should be 2ms.
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
|
| -
|
| - clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5));
|
| - CheckPacketIsSentImmediately();
|
| -
|
| - // Next time TimeUntilSend is called with no bytes in flight, pacing should
|
| - // allow a packet to be sent, and when it's sent, the tokens are refilled.
|
| - CheckPacketIsSentImmediately(HAS_RETRANSMITTABLE_DATA, 0, false);
|
| - for (int i = 0; i < kInitialBurstPackets - 1; ++i) {
|
| - CheckPacketIsSentImmediately();
|
| - }
|
| -
|
| - // The first packet was a "make up", then we sent two packets "into the
|
| - // future", so the delay should be 2ms.
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
|
| -}
|
| -
|
| -TEST_F(PacingSenderTest, InitialBurstNoRttMeasurement) {
|
| - // Configure pacing rate of 1 packet per 1 ms.
|
| - InitPacingRate(10, QuicBandwidth::FromBytesAndTimeDelta(
|
| - kMaxPacketSize, QuicTime::Delta::FromMilliseconds(1)));
|
| -
|
| - EXPECT_CALL(*mock_sender_, GetCongestionWindow())
|
| - .WillOnce(Return(10 * kDefaultTCPMSS));
|
| - // Send 10 packets, and verify that they are not paced.
|
| - for (int i = 0; i < kInitialBurstPackets; ++i) {
|
| - CheckPacketIsSentImmediately();
|
| - }
|
| -
|
| - // The first packet was a "make up", then we sent two packets "into the
|
| - // future", so the delay should be 2ms.
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
|
| -
|
| - clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5));
|
| - CheckPacketIsSentImmediately();
|
| -
|
| - // Next time TimeUntilSend is called with no bytes in flight, the tokens
|
| - // should be refilled and there should be no delay.
|
| - CheckPacketIsSentImmediately(HAS_RETRANSMITTABLE_DATA, 0, false);
|
| - // Send 10 packets, and verify that they are not paced.
|
| - for (int i = 0; i < kInitialBurstPackets - 1; ++i) {
|
| - CheckPacketIsSentImmediately();
|
| - }
|
| -
|
| - // The first packet was a "make up", then we sent two packets "into the
|
| - // future", so the delay should be 2ms.
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
|
| -}
|
| -
|
| -TEST_F(PacingSenderTest, FastSending) {
|
| - // Ensure the pacing sender paces, even when the inter-packet spacing is less
|
| - // than the pacing granularity.
|
| - InitPacingRate(10,
|
| - QuicBandwidth::FromBytesAndTimeDelta(
|
| - 2 * kMaxPacketSize, QuicTime::Delta::FromMilliseconds(1)));
|
| -
|
| - EXPECT_CALL(*mock_sender_, GetCongestionWindow())
|
| - .WillOnce(Return(10 * kDefaultTCPMSS));
|
| - // Update the RTT and verify that the first 10 packets aren't paced.
|
| - UpdateRtt();
|
| -
|
| - // Send 10 packets, and verify that they are not paced.
|
| - for (int i = 0; i < kInitialBurstPackets; ++i) {
|
| - CheckPacketIsSentImmediately();
|
| - }
|
| -
|
| - // The first packet was a "make up", then we sent two packets "into the
|
| - // future", since it's 2 packets/ms, so the delay should be 1.5ms.
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsDelayed(QuicTime::Delta::FromMicroseconds(1500));
|
| -
|
| - clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5));
|
| - CheckPacketIsSentImmediately();
|
| -
|
| - // Next time TimeUntilSend is called with no bytes in flight, the tokens
|
| - // should be refilled and there should be no delay.
|
| - CheckPacketIsSentImmediately(HAS_RETRANSMITTABLE_DATA, 0, false);
|
| - for (int i = 0; i < kInitialBurstPackets - 1; ++i) {
|
| - CheckPacketIsSentImmediately();
|
| - }
|
| -
|
| - // The first packet was a "make up", then we sent two packets "into the
|
| - // future", so the delay should be 1.5ms.
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsDelayed(QuicTime::Delta::FromMicroseconds(1500));
|
| -}
|
| -
|
| -TEST_F(PacingSenderTest, NoBurstEnteringRecovery) {
|
| - // Configure pacing rate of 1 packet per 1 ms with no burst tokens.
|
| - InitPacingRate(0, QuicBandwidth::FromBytesAndTimeDelta(
|
| - kMaxPacketSize, QuicTime::Delta::FromMilliseconds(1)));
|
| - // Sending a packet will set burst tokens.
|
| - CheckPacketIsSentImmediately();
|
| -
|
| - // Losing a packet will set clear burst tokens.
|
| - SendAlgorithmInterface::CongestionVector lost_packets;
|
| - lost_packets.push_back(std::make_pair(1, kMaxPacketSize));
|
| - SendAlgorithmInterface::CongestionVector empty;
|
| - EXPECT_CALL(*mock_sender_,
|
| - OnCongestionEvent(true, kMaxPacketSize, empty, lost_packets));
|
| - pacing_sender_->OnCongestionEvent(true, kMaxPacketSize, empty, lost_packets);
|
| - // One packet is sent immediately, because of 1ms pacing granularity.
|
| - CheckPacketIsSentImmediately();
|
| - // Ensure packets are immediately paced.
|
| - EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(), kDefaultTCPMSS))
|
| - .WillOnce(Return(zero_time_));
|
| - // Verify the next packet is paced and delayed 2ms due to granularity.
|
| - EXPECT_EQ(QuicTime::Delta::FromMilliseconds(2),
|
| - pacing_sender_->TimeUntilSend(clock_.Now(), kDefaultTCPMSS));
|
| - CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
|
| -}
|
| -
|
| -TEST_F(PacingSenderTest, NoBurstInRecovery) {
|
| - // Configure pacing rate of 1 packet per 1 ms with no burst tokens.
|
| - InitPacingRate(0, QuicBandwidth::FromBytesAndTimeDelta(
|
| - kMaxPacketSize, QuicTime::Delta::FromMilliseconds(1)));
|
| -
|
| - UpdateRtt();
|
| -
|
| - // Ensure only one packet is sent immediately and the rest are paced.
|
| - CheckPacketIsSentImmediately(HAS_RETRANSMITTABLE_DATA, 0, true);
|
| - CheckPacketIsSentImmediately();
|
| - CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2));
|
| -}
|
| -
|
| -TEST_F(PacingSenderTest, VerifyInnerSenderCalled) {
|
| - QuicBandwidth kBandwidth = QuicBandwidth::FromBitsPerSecond(1000);
|
| - QuicTime kTime = QuicTime::Infinite();
|
| - QuicTime::Delta kTimeDelta = QuicTime::Delta::Infinite();
|
| - QuicByteCount kBytes = 12345u;
|
| -
|
| - EXPECT_CALL(*mock_sender_, SetFromConfig(_, Perspective::IS_SERVER));
|
| - QuicConfig config;
|
| - pacing_sender_->SetFromConfig(config, Perspective::IS_SERVER);
|
| -
|
| - EXPECT_CALL(*mock_sender_, ResumeConnectionState(_, true));
|
| - CachedNetworkParameters cached_network_params;
|
| - pacing_sender_->ResumeConnectionState(cached_network_params, true);
|
| -
|
| - EXPECT_CALL(*mock_sender_, SetNumEmulatedConnections(2));
|
| - pacing_sender_->SetNumEmulatedConnections(2);
|
| -
|
| - SendAlgorithmInterface::CongestionVector packets;
|
| - EXPECT_CALL(*mock_sender_, OnCongestionEvent(true, kBytes, packets, packets));
|
| - pacing_sender_->OnCongestionEvent(true, kBytes, packets, packets);
|
| -
|
| - EXPECT_CALL(*mock_sender_, OnPacketSent(kTime, kBytes, 123u, kBytes,
|
| - HAS_RETRANSMITTABLE_DATA));
|
| - EXPECT_CALL(*mock_sender_, PacingRate(_)).WillOnce(Return(kBandwidth));
|
| - pacing_sender_->OnPacketSent(kTime, kBytes, 123u, kBytes,
|
| - HAS_RETRANSMITTABLE_DATA);
|
| -
|
| - EXPECT_CALL(*mock_sender_, OnRetransmissionTimeout(true));
|
| - pacing_sender_->OnRetransmissionTimeout(true);
|
| -
|
| - EXPECT_CALL(*mock_sender_, OnConnectionMigration());
|
| - pacing_sender_->OnConnectionMigration();
|
| -
|
| - EXPECT_CALL(*mock_sender_, TimeUntilSend(kTime, kBytes))
|
| - .WillOnce(Return(kTimeDelta));
|
| - pacing_sender_->TimeUntilSend(kTime, kBytes);
|
| -
|
| - EXPECT_CALL(*mock_sender_, PacingRate(_)).WillOnce(Return(kBandwidth));
|
| - EXPECT_EQ(kBandwidth, pacing_sender_->PacingRate(0));
|
| -
|
| - EXPECT_CALL(*mock_sender_, BandwidthEstimate()).WillOnce(Return(kBandwidth));
|
| - EXPECT_EQ(kBandwidth, pacing_sender_->BandwidthEstimate());
|
| -
|
| - EXPECT_CALL(*mock_sender_, RetransmissionDelay())
|
| - .WillOnce(Return(kTimeDelta));
|
| - EXPECT_EQ(kTimeDelta, pacing_sender_->RetransmissionDelay());
|
| -
|
| - EXPECT_CALL(*mock_sender_, GetCongestionWindow()).WillOnce(Return(kBytes));
|
| - EXPECT_EQ(kBytes, pacing_sender_->GetCongestionWindow());
|
| -
|
| - EXPECT_CALL(*mock_sender_, InSlowStart()).WillOnce(Return(true));
|
| - EXPECT_TRUE(pacing_sender_->InSlowStart());
|
| -
|
| - EXPECT_CALL(*mock_sender_, InRecovery()).WillOnce(Return(true));
|
| - EXPECT_TRUE(pacing_sender_->InRecovery());
|
| -
|
| - EXPECT_CALL(*mock_sender_, GetSlowStartThreshold()).WillOnce(Return(kBytes));
|
| - EXPECT_EQ(kBytes, pacing_sender_->GetSlowStartThreshold());
|
| -
|
| - EXPECT_CALL(*mock_sender_, GetCongestionControlType())
|
| - .WillOnce(Return(kReno));
|
| - EXPECT_EQ(kReno, pacing_sender_->GetCongestionControlType());
|
| -}
|
| -
|
| -} // namespace test
|
| -} // namespace net
|
|
|