Tue, 06 Jan 2015 21:39:09 +0100
Conditionally force memory storage according to privacy.thirdparty.isolate;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.
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/. */
7 /* Original author: bcampen@mozilla.com */
9 #include "simpletokenbucket.h"
11 #define GTEST_HAS_RTTI 0
12 #include "gtest/gtest.h"
13 #include "gtest_utils.h"
15 using mozilla::SimpleTokenBucket;
17 class TestSimpleTokenBucket : public SimpleTokenBucket {
18 public:
19 TestSimpleTokenBucket(size_t bucketSize, size_t tokensPerSecond) :
20 SimpleTokenBucket(bucketSize, tokensPerSecond) {
21 }
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 };
32 TEST(SimpleTokenBucketTest, TestConstruct) {
33 TestSimpleTokenBucket b(10, 1);
34 }
36 TEST(SimpleTokenBucketTest, TestGet) {
37 TestSimpleTokenBucket b(10, 1);
38 ASSERT_EQ(5U, b.getTokens(5));
39 }
41 TEST(SimpleTokenBucketTest, TestGetAll) {
42 TestSimpleTokenBucket b(10, 1);
43 ASSERT_EQ(10U, b.getTokens(10));
44 }
46 TEST(SimpleTokenBucketTest, TestGetInsufficient) {
47 TestSimpleTokenBucket b(10, 1);
48 ASSERT_EQ(5U, b.getTokens(5));
49 ASSERT_EQ(5U, b.getTokens(6));
50 }
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 }
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 }
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 }
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 }
87 TEST(SimpleTokenBucketTest, TestEmptyBucket) {
88 TestSimpleTokenBucket b(10, 1);
89 ASSERT_EQ(10U, b.getTokens(10));
90 ASSERT_EQ(0U, b.getTokens(10));
91 }
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 }
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 }
109 int main(int argc, char** argv) {
110 ::testing::InitGoogleTest(&argc, argv);
112 int rv = RUN_ALL_TESTS();
113 return rv;
114 }