1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/media/mtransport/test/simpletokenbucket_unittest.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,115 @@ 1.4 +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* vim: set ts=2 et sw=2 tw=80: */ 1.6 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.7 + * License, v. 2.0. If a copy of the MPL was not distributed with this file, 1.8 + * You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.9 + 1.10 +/* Original author: bcampen@mozilla.com */ 1.11 + 1.12 +#include "simpletokenbucket.h" 1.13 + 1.14 +#define GTEST_HAS_RTTI 0 1.15 +#include "gtest/gtest.h" 1.16 +#include "gtest_utils.h" 1.17 + 1.18 +using mozilla::SimpleTokenBucket; 1.19 + 1.20 +class TestSimpleTokenBucket : public SimpleTokenBucket { 1.21 + public: 1.22 + TestSimpleTokenBucket(size_t bucketSize, size_t tokensPerSecond) : 1.23 + SimpleTokenBucket(bucketSize, tokensPerSecond) { 1.24 + } 1.25 + 1.26 + void fastForward(int32_t timeMilliSeconds) { 1.27 + if (timeMilliSeconds >= 0) { 1.28 + last_time_tokens_added_ -= PR_MillisecondsToInterval(timeMilliSeconds); 1.29 + } else { 1.30 + last_time_tokens_added_ += PR_MillisecondsToInterval(-timeMilliSeconds); 1.31 + } 1.32 + } 1.33 +}; 1.34 + 1.35 +TEST(SimpleTokenBucketTest, TestConstruct) { 1.36 + TestSimpleTokenBucket b(10, 1); 1.37 +} 1.38 + 1.39 +TEST(SimpleTokenBucketTest, TestGet) { 1.40 + TestSimpleTokenBucket b(10, 1); 1.41 + ASSERT_EQ(5U, b.getTokens(5)); 1.42 +} 1.43 + 1.44 +TEST(SimpleTokenBucketTest, TestGetAll) { 1.45 + TestSimpleTokenBucket b(10, 1); 1.46 + ASSERT_EQ(10U, b.getTokens(10)); 1.47 +} 1.48 + 1.49 +TEST(SimpleTokenBucketTest, TestGetInsufficient) { 1.50 + TestSimpleTokenBucket b(10, 1); 1.51 + ASSERT_EQ(5U, b.getTokens(5)); 1.52 + ASSERT_EQ(5U, b.getTokens(6)); 1.53 +} 1.54 + 1.55 +TEST(SimpleTokenBucketTest, TestGetBucketCount) { 1.56 + TestSimpleTokenBucket b(10, 1); 1.57 + ASSERT_EQ(10U, b.getTokens(UINT32_MAX)); 1.58 + ASSERT_EQ(5U, b.getTokens(5)); 1.59 + ASSERT_EQ(5U, b.getTokens(UINT32_MAX)); 1.60 +} 1.61 + 1.62 +TEST(SimpleTokenBucketTest, TestTokenRefill) { 1.63 + TestSimpleTokenBucket b(10, 1); 1.64 + ASSERT_EQ(5U, b.getTokens(5)); 1.65 + b.fastForward(1000); 1.66 + ASSERT_EQ(6U, b.getTokens(6)); 1.67 +} 1.68 + 1.69 +TEST(SimpleTokenBucketTest, TestNoTimeWasted) { 1.70 + // Makes sure that when the time elapsed is insufficient to add any 1.71 + // tokens to the bucket, the internal timestamp that is used in this 1.72 + // calculation is not updated (ie; two subsequent 0.5 second elapsed times 1.73 + // counts as a full second) 1.74 + TestSimpleTokenBucket b(10, 1); 1.75 + ASSERT_EQ(5U, b.getTokens(5)); 1.76 + b.fastForward(500); 1.77 + ASSERT_EQ(5U, b.getTokens(6)); 1.78 + b.fastForward(500); 1.79 + ASSERT_EQ(6U, b.getTokens(6)); 1.80 +} 1.81 + 1.82 +TEST(SimpleTokenBucketTest, TestNegativeTime) { 1.83 + TestSimpleTokenBucket b(10, 1); 1.84 + b.fastForward(-1000); 1.85 + // Make sure we don't end up with an invalid number of tokens, but otherwise 1.86 + // permit anything. 1.87 + ASSERT_GT(11U, b.getTokens(100)); 1.88 +} 1.89 + 1.90 +TEST(SimpleTokenBucketTest, TestEmptyBucket) { 1.91 + TestSimpleTokenBucket b(10, 1); 1.92 + ASSERT_EQ(10U, b.getTokens(10)); 1.93 + ASSERT_EQ(0U, b.getTokens(10)); 1.94 +} 1.95 + 1.96 +TEST(SimpleTokenBucketTest, TestEmptyThenFillBucket) { 1.97 + TestSimpleTokenBucket b(10, 1); 1.98 + ASSERT_EQ(10U, b.getTokens(10)); 1.99 + ASSERT_EQ(0U, b.getTokens(1)); 1.100 + b.fastForward(50000); 1.101 + ASSERT_EQ(10U, b.getTokens(10)); 1.102 +} 1.103 + 1.104 +TEST(SimpleTokenBucketTest, TestNoOverflow) { 1.105 + TestSimpleTokenBucket b(10, 1); 1.106 + ASSERT_EQ(10U, b.getTokens(10)); 1.107 + ASSERT_EQ(0U, b.getTokens(1)); 1.108 + b.fastForward(50000); 1.109 + ASSERT_EQ(10U, b.getTokens(11)); 1.110 +} 1.111 + 1.112 +int main(int argc, char** argv) { 1.113 + ::testing::InitGoogleTest(&argc, argv); 1.114 + 1.115 + int rv = RUN_ALL_TESTS(); 1.116 + return rv; 1.117 +} 1.118 +