simpletokenbucket_unittest.cpp (3079B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this file, 5 * You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 /* Original author: bcampen@mozilla.com */ 8 9 #include "simpletokenbucket.h" 10 11 #define GTEST_HAS_RTTI 0 12 #include "gtest/gtest.h" 13 14 using mozilla::SimpleTokenBucket; 15 16 class TestSimpleTokenBucket : public SimpleTokenBucket { 17 public: 18 TestSimpleTokenBucket(size_t bucketSize, size_t tokensPerSecond) 19 : SimpleTokenBucket(bucketSize, tokensPerSecond) {} 20 21 void fastForward(int32_t timeMilliSeconds) { 22 if (timeMilliSeconds >= 0) { 23 last_time_tokens_added_ -= PR_MillisecondsToInterval(timeMilliSeconds); 24 } else { 25 last_time_tokens_added_ += PR_MillisecondsToInterval(-timeMilliSeconds); 26 } 27 } 28 }; 29 30 TEST(SimpleTokenBucketTest, TestConstruct) 31 { 32 TestSimpleTokenBucket b(10, 1); 33 } 34 35 TEST(SimpleTokenBucketTest, TestGet) 36 { 37 TestSimpleTokenBucket b(10, 1); 38 ASSERT_EQ(5U, b.getTokens(5)); 39 } 40 41 TEST(SimpleTokenBucketTest, TestGetAll) 42 { 43 TestSimpleTokenBucket b(10, 1); 44 ASSERT_EQ(10U, b.getTokens(10)); 45 } 46 47 TEST(SimpleTokenBucketTest, TestGetInsufficient) 48 { 49 TestSimpleTokenBucket b(10, 1); 50 ASSERT_EQ(5U, b.getTokens(5)); 51 ASSERT_EQ(5U, b.getTokens(6)); 52 } 53 54 TEST(SimpleTokenBucketTest, TestGetBucketCount) 55 { 56 TestSimpleTokenBucket b(10, 1); 57 ASSERT_EQ(10U, b.getTokens(UINT32_MAX)); 58 ASSERT_EQ(5U, b.getTokens(5)); 59 ASSERT_EQ(5U, b.getTokens(UINT32_MAX)); 60 } 61 62 TEST(SimpleTokenBucketTest, TestTokenRefill) 63 { 64 TestSimpleTokenBucket b(10, 1); 65 ASSERT_EQ(5U, b.getTokens(5)); 66 b.fastForward(1000); 67 ASSERT_EQ(6U, b.getTokens(6)); 68 } 69 70 TEST(SimpleTokenBucketTest, TestNoTimeWasted) 71 { 72 // Makes sure that when the time elapsed is insufficient to add any 73 // tokens to the bucket, the internal timestamp that is used in this 74 // calculation is not updated (ie; two subsequent 0.5 second elapsed times 75 // counts as a full second) 76 TestSimpleTokenBucket b(10, 1); 77 ASSERT_EQ(5U, b.getTokens(5)); 78 b.fastForward(500); 79 ASSERT_EQ(5U, b.getTokens(6)); 80 b.fastForward(500); 81 ASSERT_EQ(6U, b.getTokens(6)); 82 } 83 84 TEST(SimpleTokenBucketTest, TestNegativeTime) 85 { 86 TestSimpleTokenBucket b(10, 1); 87 b.fastForward(-1000); 88 // Make sure we don't end up with an invalid number of tokens, but otherwise 89 // permit anything. 90 ASSERT_GT(11U, b.getTokens(100)); 91 } 92 93 TEST(SimpleTokenBucketTest, TestEmptyBucket) 94 { 95 TestSimpleTokenBucket b(10, 1); 96 ASSERT_EQ(10U, b.getTokens(10)); 97 ASSERT_EQ(0U, b.getTokens(10)); 98 } 99 100 TEST(SimpleTokenBucketTest, TestEmptyThenFillBucket) 101 { 102 TestSimpleTokenBucket b(10, 1); 103 ASSERT_EQ(10U, b.getTokens(10)); 104 ASSERT_EQ(0U, b.getTokens(1)); 105 b.fastForward(50000); 106 ASSERT_EQ(10U, b.getTokens(10)); 107 } 108 109 TEST(SimpleTokenBucketTest, TestNoOverflow) 110 { 111 TestSimpleTokenBucket b(10, 1); 112 ASSERT_EQ(10U, b.getTokens(10)); 113 ASSERT_EQ(0U, b.getTokens(1)); 114 b.fastForward(50000); 115 ASSERT_EQ(10U, b.getTokens(11)); 116 }