1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/logging.h"
6 #include "base/memory/scoped_ptr.h"
7 #include "net/quic/congestion_control/paced_sender.h"
8 #include "net/quic/quic_protocol.h"
9 #include "net/quic/test_tools/mock_clock.h"
10 #include "testing/gmock/include/gmock/gmock.h"
11 #include "testing/gtest/include/gtest/gtest.h"
16 const int kHundredKBytesPerS = 100;
18 class PacedSenderTest : public ::testing::Test {
21 : zero_time_(QuicTime::Delta::Zero()),
22 paced_sender_(new PacedSender(
23 QuicBandwidth::FromKBytesPerSecond(kHundredKBytesPerS),
24 kDefaultMaxPacketSize)) {
27 const QuicTime::Delta zero_time_;
29 scoped_ptr<PacedSender> paced_sender_;
32 TEST_F(PacedSenderTest, Basic) {
33 paced_sender_->UpdateBandwidthEstimate(clock_.Now(),
34 QuicBandwidth::FromKBytesPerSecond(kHundredKBytesPerS * 10));
35 EXPECT_TRUE(paced_sender_->TimeUntilSend(clock_.Now(), zero_time_).IsZero());
36 paced_sender_->OnPacketSent(clock_.Now(), kDefaultMaxPacketSize);
37 EXPECT_TRUE(paced_sender_->TimeUntilSend(clock_.Now(), zero_time_).IsZero());
38 paced_sender_->OnPacketSent(clock_.Now(), kDefaultMaxPacketSize);
39 EXPECT_EQ(static_cast<int64>(kDefaultMaxPacketSize * 2),
40 paced_sender_->TimeUntilSend(
41 clock_.Now(), zero_time_).ToMicroseconds());
42 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(24));
43 EXPECT_TRUE(paced_sender_->TimeUntilSend(clock_.Now(), zero_time_).IsZero());
46 TEST_F(PacedSenderTest, LowRate) {
47 paced_sender_->UpdateBandwidthEstimate(clock_.Now(),
48 QuicBandwidth::FromKBytesPerSecond(kHundredKBytesPerS));
49 EXPECT_TRUE(paced_sender_->TimeUntilSend(clock_.Now(), zero_time_).IsZero());
50 paced_sender_->OnPacketSent(clock_.Now(), kDefaultMaxPacketSize);
51 EXPECT_TRUE(paced_sender_->TimeUntilSend(clock_.Now(), zero_time_).IsZero());
52 paced_sender_->OnPacketSent(clock_.Now(), kDefaultMaxPacketSize);
53 EXPECT_EQ(static_cast<int64>(kDefaultMaxPacketSize * 20),
54 paced_sender_->TimeUntilSend(
55 clock_.Now(), zero_time_).ToMicroseconds());
56 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(24));
57 EXPECT_TRUE(paced_sender_->TimeUntilSend(clock_.Now(), zero_time_).IsZero());
60 TEST_F(PacedSenderTest, HighRate) {
61 QuicBandwidth bandwidth_estimate = QuicBandwidth::FromKBytesPerSecond(
62 kHundredKBytesPerS * 100);
63 paced_sender_->UpdateBandwidthEstimate(clock_.Now(), bandwidth_estimate);
64 EXPECT_TRUE(paced_sender_->TimeUntilSend(clock_.Now(), zero_time_).IsZero());
65 for (int i = 0; i < 16; ++i) {
66 paced_sender_->OnPacketSent(clock_.Now(), kDefaultMaxPacketSize);
67 EXPECT_TRUE(paced_sender_->TimeUntilSend(
68 clock_.Now(), zero_time_).IsZero());
70 paced_sender_->OnPacketSent(clock_.Now(), kDefaultMaxPacketSize);
71 EXPECT_EQ(2040, paced_sender_->TimeUntilSend(
72 clock_.Now(), zero_time_).ToMicroseconds());
73 clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(20400));
74 EXPECT_TRUE(paced_sender_->TimeUntilSend(clock_.Now(), zero_time_).IsZero());