media/mtransport/test/simpletokenbucket_unittest.cpp

branch
TOR_BUG_9701
changeset 8
97036ab72558
equal deleted inserted replaced
-1:000000000000 0:432b52fc57ba
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 #include "gtest_utils.h"
14
15 using mozilla::SimpleTokenBucket;
16
17 class TestSimpleTokenBucket : public SimpleTokenBucket {
18 public:
19 TestSimpleTokenBucket(size_t bucketSize, size_t tokensPerSecond) :
20 SimpleTokenBucket(bucketSize, tokensPerSecond) {
21 }
22
23 void fastForward(int32_t timeMilliSeconds) {
24 if (timeMilliSeconds >= 0) {
25 last_time_tokens_added_ -= PR_MillisecondsToInterval(timeMilliSeconds);
26 } else {
27 last_time_tokens_added_ += PR_MillisecondsToInterval(-timeMilliSeconds);
28 }
29 }
30 };
31
32 TEST(SimpleTokenBucketTest, TestConstruct) {
33 TestSimpleTokenBucket b(10, 1);
34 }
35
36 TEST(SimpleTokenBucketTest, TestGet) {
37 TestSimpleTokenBucket b(10, 1);
38 ASSERT_EQ(5U, b.getTokens(5));
39 }
40
41 TEST(SimpleTokenBucketTest, TestGetAll) {
42 TestSimpleTokenBucket b(10, 1);
43 ASSERT_EQ(10U, b.getTokens(10));
44 }
45
46 TEST(SimpleTokenBucketTest, TestGetInsufficient) {
47 TestSimpleTokenBucket b(10, 1);
48 ASSERT_EQ(5U, b.getTokens(5));
49 ASSERT_EQ(5U, b.getTokens(6));
50 }
51
52 TEST(SimpleTokenBucketTest, TestGetBucketCount) {
53 TestSimpleTokenBucket b(10, 1);
54 ASSERT_EQ(10U, b.getTokens(UINT32_MAX));
55 ASSERT_EQ(5U, b.getTokens(5));
56 ASSERT_EQ(5U, b.getTokens(UINT32_MAX));
57 }
58
59 TEST(SimpleTokenBucketTest, TestTokenRefill) {
60 TestSimpleTokenBucket b(10, 1);
61 ASSERT_EQ(5U, b.getTokens(5));
62 b.fastForward(1000);
63 ASSERT_EQ(6U, b.getTokens(6));
64 }
65
66 TEST(SimpleTokenBucketTest, TestNoTimeWasted) {
67 // Makes sure that when the time elapsed is insufficient to add any
68 // tokens to the bucket, the internal timestamp that is used in this
69 // calculation is not updated (ie; two subsequent 0.5 second elapsed times
70 // counts as a full second)
71 TestSimpleTokenBucket b(10, 1);
72 ASSERT_EQ(5U, b.getTokens(5));
73 b.fastForward(500);
74 ASSERT_EQ(5U, b.getTokens(6));
75 b.fastForward(500);
76 ASSERT_EQ(6U, b.getTokens(6));
77 }
78
79 TEST(SimpleTokenBucketTest, TestNegativeTime) {
80 TestSimpleTokenBucket b(10, 1);
81 b.fastForward(-1000);
82 // Make sure we don't end up with an invalid number of tokens, but otherwise
83 // permit anything.
84 ASSERT_GT(11U, b.getTokens(100));
85 }
86
87 TEST(SimpleTokenBucketTest, TestEmptyBucket) {
88 TestSimpleTokenBucket b(10, 1);
89 ASSERT_EQ(10U, b.getTokens(10));
90 ASSERT_EQ(0U, b.getTokens(10));
91 }
92
93 TEST(SimpleTokenBucketTest, TestEmptyThenFillBucket) {
94 TestSimpleTokenBucket b(10, 1);
95 ASSERT_EQ(10U, b.getTokens(10));
96 ASSERT_EQ(0U, b.getTokens(1));
97 b.fastForward(50000);
98 ASSERT_EQ(10U, b.getTokens(10));
99 }
100
101 TEST(SimpleTokenBucketTest, TestNoOverflow) {
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(11));
107 }
108
109 int main(int argc, char** argv) {
110 ::testing::InitGoogleTest(&argc, argv);
111
112 int rv = RUN_ALL_TESTS();
113 return rv;
114 }
115

mercurial