15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/congestion_control/leaky_bucket.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/test_tools/mock_clock.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace test { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LeakyBucketTest : public ::testing::Test { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUp() { 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) leaky_bucket_.reset(new LeakyBucket(QuicBandwidth::Zero())); 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockClock clock_; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<LeakyBucket> leaky_bucket_; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LeakyBucketTest, Basic) { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuicBandwidth draining_rate = QuicBandwidth::FromBytesPerSecond(200000); 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) leaky_bucket_->SetDrainingRate(clock_.Now(), draining_rate); 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) leaky_bucket_->Add(clock_.Now(), 2000); 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2000u, leaky_bucket_->BytesPending(clock_.Now())); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) leaky_bucket_->TimeRemaining(clock_.Now())); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5)); 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1000u, leaky_bucket_->BytesPending(clock_.Now())); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(QuicTime::Delta::FromMilliseconds(5), 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) leaky_bucket_->TimeRemaining(clock_.Now())); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5)); 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, leaky_bucket_->BytesPending(clock_.Now())); 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(leaky_bucket_->TimeRemaining(clock_.Now()).IsZero()); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5)); 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, leaky_bucket_->BytesPending(clock_.Now())); 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(leaky_bucket_->TimeRemaining(clock_.Now()).IsZero()); 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) leaky_bucket_->Add(clock_.Now(), 2000); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(11)); 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, leaky_bucket_->BytesPending(clock_.Now())); 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(leaky_bucket_->TimeRemaining(clock_.Now()).IsZero()); 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) leaky_bucket_->Add(clock_.Now(), 2000); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5)); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) leaky_bucket_->Add(clock_.Now(), 2000); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5)); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2000u, leaky_bucket_->BytesPending(clock_.Now())); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) leaky_bucket_->TimeRemaining(clock_.Now())); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10)); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, leaky_bucket_->BytesPending(clock_.Now())); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(leaky_bucket_->TimeRemaining(clock_.Now()).IsZero()); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LeakyBucketTest, ChangeDrainRate) { 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuicBandwidth draining_rate = QuicBandwidth::FromBytesPerSecond(200000); 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) leaky_bucket_->SetDrainingRate(clock_.Now(), draining_rate); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) leaky_bucket_->Add(clock_.Now(), 2000); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2000u, leaky_bucket_->BytesPending(clock_.Now())); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) leaky_bucket_->TimeRemaining(clock_.Now())); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5)); 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1000u, leaky_bucket_->BytesPending(clock_.Now())); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(QuicTime::Delta::FromMilliseconds(5), 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) leaky_bucket_->TimeRemaining(clock_.Now())); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) draining_rate = draining_rate.Scale(0.5f); // Cut drain rate in half. 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) leaky_bucket_->SetDrainingRate(clock_.Now(), draining_rate); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1000u, leaky_bucket_->BytesPending(clock_.Now())); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) leaky_bucket_->TimeRemaining(clock_.Now())); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace test 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 76