| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/message_loop.h" | 5 #include "base/message_loop.h" |
| 6 #include "base/process.h" | 6 #include "base/process.h" |
| 7 #include "base/stl_util.h" | 7 #include "base/stl_util.h" |
| 8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
| 9 #include "chrome/browser/extensions/extension_function.h" | 9 #include "chrome/browser/extensions/extension_function.h" |
| 10 #include "chrome/browser/extensions/extensions_quota_service.h" | 10 #include "chrome/browser/extensions/extensions_quota_service.h" |
| 11 #include "content/public/test/test_browser_thread.h" | 11 #include "content/public/test/test_browser_thread.h" |
| 12 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
| 13 | 13 |
| 14 using base::TimeDelta; | 14 using base::TimeDelta; |
| 15 using base::TimeTicks; | 15 using base::TimeTicks; |
| 16 using content::BrowserThread; | 16 using content::BrowserThread; |
| 17 | 17 |
| 18 typedef QuotaLimitHeuristic::Bucket Bucket; | 18 typedef QuotaLimitHeuristic::Bucket Bucket; |
| 19 typedef QuotaLimitHeuristic::Config Config; | 19 typedef QuotaLimitHeuristic::Config Config; |
| 20 typedef QuotaLimitHeuristic::BucketList BucketList; | 20 typedef QuotaLimitHeuristic::BucketList BucketList; |
| 21 typedef ExtensionsQuotaService::TimedLimit TimedLimit; | 21 typedef ExtensionsQuotaService::TimedLimit TimedLimit; |
| 22 typedef ExtensionsQuotaService::SustainedLimit SustainedLimit; | 22 typedef ExtensionsQuotaService::SustainedLimit SustainedLimit; |
| 23 | 23 |
| 24 static const Config kFrozenConfig = { 0, TimeDelta::FromDays(0) }; | 24 namespace { |
| 25 static const Config k2PerMinute = { 2, TimeDelta::FromMinutes(1) }; | |
| 26 static const Config k20PerHour = { 20, TimeDelta::FromHours(1) }; | |
| 27 static const TimeTicks kStartTime = TimeTicks(); | |
| 28 static const TimeTicks k1MinuteAfterStart = | |
| 29 kStartTime + TimeDelta::FromMinutes(1); | |
| 30 | 25 |
| 31 namespace { | 26 const char kGenericName[] = "name"; |
| 27 const Config kFrozenConfig = { 0, TimeDelta::FromDays(0) }; |
| 28 const Config k2PerMinute = { 2, TimeDelta::FromMinutes(1) }; |
| 29 const Config k20PerHour = { 20, TimeDelta::FromHours(1) }; |
| 30 const TimeTicks kStartTime = TimeTicks(); |
| 31 const TimeTicks k1MinuteAfterStart = kStartTime + TimeDelta::FromMinutes(1); |
| 32 |
| 32 class Mapper : public QuotaLimitHeuristic::BucketMapper { | 33 class Mapper : public QuotaLimitHeuristic::BucketMapper { |
| 33 public: | 34 public: |
| 34 Mapper() {} | 35 Mapper() {} |
| 35 virtual ~Mapper() { STLDeleteValues(&buckets_); } | 36 virtual ~Mapper() { STLDeleteValues(&buckets_); } |
| 36 virtual void GetBucketsForArgs(const ListValue* args, BucketList* buckets) { | 37 virtual void GetBucketsForArgs(const ListValue* args, BucketList* buckets) { |
| 37 for (size_t i = 0; i < args->GetSize(); i++) { | 38 for (size_t i = 0; i < args->GetSize(); i++) { |
| 38 int id; | 39 int id; |
| 39 ASSERT_TRUE(args->GetInteger(i, &id)); | 40 ASSERT_TRUE(args->GetInteger(i, &id)); |
| 40 if (buckets_.find(id) == buckets_.end()) | 41 if (buckets_.find(id) == buckets_.end()) |
| 41 buckets_[id] = new Bucket(); | 42 buckets_[id] = new Bucket(); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 68 protected: | 69 protected: |
| 69 virtual ~MockFunction() {} | 70 virtual ~MockFunction() {} |
| 70 }; | 71 }; |
| 71 | 72 |
| 72 class TimedLimitMockFunction : public MockFunction { | 73 class TimedLimitMockFunction : public MockFunction { |
| 73 public: | 74 public: |
| 74 explicit TimedLimitMockFunction(const std::string& name) | 75 explicit TimedLimitMockFunction(const std::string& name) |
| 75 : MockFunction(name) {} | 76 : MockFunction(name) {} |
| 76 virtual void GetQuotaLimitHeuristics( | 77 virtual void GetQuotaLimitHeuristics( |
| 77 QuotaLimitHeuristics* heuristics) const { | 78 QuotaLimitHeuristics* heuristics) const { |
| 78 heuristics->push_back(new TimedLimit(k2PerMinute, new Mapper())); | 79 heuristics->push_back( |
| 80 new TimedLimit(k2PerMinute, new Mapper(), kGenericName)); |
| 79 } | 81 } |
| 80 | 82 |
| 81 private: | 83 private: |
| 82 virtual ~TimedLimitMockFunction() {} | 84 virtual ~TimedLimitMockFunction() {} |
| 83 }; | 85 }; |
| 84 | 86 |
| 85 class ChainedLimitsMockFunction : public MockFunction { | 87 class ChainedLimitsMockFunction : public MockFunction { |
| 86 public: | 88 public: |
| 87 explicit ChainedLimitsMockFunction(const std::string& name) | 89 explicit ChainedLimitsMockFunction(const std::string& name) |
| 88 : MockFunction(name) {} | 90 : MockFunction(name) {} |
| 89 virtual void GetQuotaLimitHeuristics( | 91 virtual void GetQuotaLimitHeuristics( |
| 90 QuotaLimitHeuristics* heuristics) const { | 92 QuotaLimitHeuristics* heuristics) const { |
| 91 // No more than 2 per minute sustained over 5 minutes. | 93 // No more than 2 per minute sustained over 5 minutes. |
| 92 heuristics->push_back(new SustainedLimit(TimeDelta::FromMinutes(5), | 94 heuristics->push_back(new SustainedLimit( |
| 93 k2PerMinute, new Mapper())); | 95 TimeDelta::FromMinutes(5), k2PerMinute, new Mapper(), kGenericName)); |
| 94 // No more than 20 per hour. | 96 // No more than 20 per hour. |
| 95 heuristics->push_back(new TimedLimit(k20PerHour, new Mapper())); | 97 heuristics->push_back( |
| 98 new TimedLimit(k20PerHour, new Mapper(), kGenericName)); |
| 96 } | 99 } |
| 97 | 100 |
| 98 private: | 101 private: |
| 99 virtual ~ChainedLimitsMockFunction() {} | 102 virtual ~ChainedLimitsMockFunction() {} |
| 100 }; | 103 }; |
| 101 | 104 |
| 102 class FrozenMockFunction : public MockFunction { | 105 class FrozenMockFunction : public MockFunction { |
| 103 public: | 106 public: |
| 104 explicit FrozenMockFunction(const std::string& name) : MockFunction(name) {} | 107 explicit FrozenMockFunction(const std::string& name) : MockFunction(name) {} |
| 105 virtual void GetQuotaLimitHeuristics( | 108 virtual void GetQuotaLimitHeuristics( |
| 106 QuotaLimitHeuristics* heuristics) const { | 109 QuotaLimitHeuristics* heuristics) const { |
| 107 heuristics->push_back(new TimedLimit(kFrozenConfig, new Mapper())); | 110 heuristics->push_back( |
| 111 new TimedLimit(kFrozenConfig, new Mapper(), kGenericName)); |
| 108 } | 112 } |
| 109 | 113 |
| 110 private: | 114 private: |
| 111 virtual ~FrozenMockFunction() {} | 115 virtual ~FrozenMockFunction() {} |
| 112 }; | 116 }; |
| 113 } // namespace | 117 } // namespace |
| 114 | 118 |
| 115 class ExtensionsQuotaServiceTest : public testing::Test { | 119 class ExtensionsQuotaServiceTest : public testing::Test { |
| 116 public: | 120 public: |
| 117 ExtensionsQuotaServiceTest() | 121 ExtensionsQuotaServiceTest() |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 158 // These are OK because we haven't exhausted all buckets. | 162 // These are OK because we haven't exhausted all buckets. |
| 159 EXPECT_TRUE(lim->Apply(b, start_time + TimeDelta::FromSeconds(20 + m))); | 163 EXPECT_TRUE(lim->Apply(b, start_time + TimeDelta::FromSeconds(20 + m))); |
| 160 EXPECT_FALSE(b->has_tokens()); | 164 EXPECT_FALSE(b->has_tokens()); |
| 161 EXPECT_TRUE(lim->Apply(b, start_time + TimeDelta::FromSeconds(50 + m))); | 165 EXPECT_TRUE(lim->Apply(b, start_time + TimeDelta::FromSeconds(50 + m))); |
| 162 EXPECT_FALSE(b->has_tokens()); | 166 EXPECT_FALSE(b->has_tokens()); |
| 163 } | 167 } |
| 164 } | 168 } |
| 165 }; | 169 }; |
| 166 | 170 |
| 167 TEST_F(QuotaLimitHeuristicTest, Timed) { | 171 TEST_F(QuotaLimitHeuristicTest, Timed) { |
| 168 TimedLimit lim(k2PerMinute, new MockMapper()); | 172 TimedLimit lim(k2PerMinute, new MockMapper(), kGenericName); |
| 169 Bucket b; | 173 Bucket b; |
| 170 | 174 |
| 171 b.Reset(k2PerMinute, kStartTime); | 175 b.Reset(k2PerMinute, kStartTime); |
| 172 EXPECT_TRUE(lim.Apply(&b, kStartTime)); | 176 EXPECT_TRUE(lim.Apply(&b, kStartTime)); |
| 173 EXPECT_TRUE(b.has_tokens()); | 177 EXPECT_TRUE(b.has_tokens()); |
| 174 EXPECT_TRUE(lim.Apply(&b, kStartTime + TimeDelta::FromSeconds(30))); | 178 EXPECT_TRUE(lim.Apply(&b, kStartTime + TimeDelta::FromSeconds(30))); |
| 175 EXPECT_FALSE(b.has_tokens()); | 179 EXPECT_FALSE(b.has_tokens()); |
| 176 EXPECT_FALSE(lim.Apply(&b, k1MinuteAfterStart)); | 180 EXPECT_FALSE(lim.Apply(&b, k1MinuteAfterStart)); |
| 177 | 181 |
| 178 b.Reset(k2PerMinute, kStartTime); | 182 b.Reset(k2PerMinute, kStartTime); |
| 179 EXPECT_TRUE(lim.Apply(&b, k1MinuteAfterStart - TimeDelta::FromSeconds(1))); | 183 EXPECT_TRUE(lim.Apply(&b, k1MinuteAfterStart - TimeDelta::FromSeconds(1))); |
| 180 EXPECT_TRUE(lim.Apply(&b, k1MinuteAfterStart)); | 184 EXPECT_TRUE(lim.Apply(&b, k1MinuteAfterStart)); |
| 181 EXPECT_TRUE(lim.Apply(&b, k1MinuteAfterStart + TimeDelta::FromSeconds(1))); | 185 EXPECT_TRUE(lim.Apply(&b, k1MinuteAfterStart + TimeDelta::FromSeconds(1))); |
| 182 EXPECT_TRUE(lim.Apply(&b, k1MinuteAfterStart + TimeDelta::FromSeconds(2))); | 186 EXPECT_TRUE(lim.Apply(&b, k1MinuteAfterStart + TimeDelta::FromSeconds(2))); |
| 183 EXPECT_FALSE(lim.Apply(&b, k1MinuteAfterStart + TimeDelta::FromSeconds(3))); | 187 EXPECT_FALSE(lim.Apply(&b, k1MinuteAfterStart + TimeDelta::FromSeconds(3))); |
| 184 } | 188 } |
| 185 | 189 |
| 186 TEST_F(QuotaLimitHeuristicTest, Sustained) { | 190 TEST_F(QuotaLimitHeuristicTest, Sustained) { |
| 187 SustainedLimit lim(TimeDelta::FromMinutes(5), k2PerMinute, new MockMapper()); | 191 SustainedLimit lim( |
| 192 TimeDelta::FromMinutes(5), k2PerMinute, new MockMapper(), kGenericName); |
| 188 Bucket bucket; | 193 Bucket bucket; |
| 189 | 194 |
| 190 bucket.Reset(k2PerMinute, kStartTime); | 195 bucket.Reset(k2PerMinute, kStartTime); |
| 191 DoMoreThan2PerMinuteFor5Minutes(kStartTime, &lim, &bucket, -1); | 196 DoMoreThan2PerMinuteFor5Minutes(kStartTime, &lim, &bucket, -1); |
| 192 // This straw breaks the camel's back. | 197 // This straw breaks the camel's back. |
| 193 EXPECT_FALSE(lim.Apply(&bucket, kStartTime + TimeDelta::FromMinutes(6))); | 198 EXPECT_FALSE(lim.Apply(&bucket, kStartTime + TimeDelta::FromMinutes(6))); |
| 194 | 199 |
| 195 // The heuristic resets itself on a safe request. | 200 // The heuristic resets itself on a safe request. |
| 196 EXPECT_TRUE(lim.Apply(&bucket, kStartTime + TimeDelta::FromDays(1))); | 201 EXPECT_TRUE(lim.Apply(&bucket, kStartTime + TimeDelta::FromDays(1))); |
| 197 | 202 |
| 198 // Do the same as above except don't exhaust final bucket. | 203 // Do the same as above except don't exhaust final bucket. |
| 199 bucket.Reset(k2PerMinute, kStartTime); | 204 bucket.Reset(k2PerMinute, kStartTime); |
| 200 DoMoreThan2PerMinuteFor5Minutes(kStartTime, &lim, &bucket, -1); | 205 DoMoreThan2PerMinuteFor5Minutes(kStartTime, &lim, &bucket, -1); |
| 201 EXPECT_TRUE(lim.Apply(&bucket, kStartTime + TimeDelta::FromMinutes(7))); | 206 EXPECT_TRUE(lim.Apply(&bucket, kStartTime + TimeDelta::FromMinutes(7))); |
| 202 | 207 |
| 203 // Do the same as above except don't exhaust the 3rd (w.l.o.g) bucket. | 208 // Do the same as above except don't exhaust the 3rd (w.l.o.g) bucket. |
| 204 bucket.Reset(k2PerMinute, kStartTime); | 209 bucket.Reset(k2PerMinute, kStartTime); |
| 205 DoMoreThan2PerMinuteFor5Minutes(kStartTime, &lim, &bucket, 3); | 210 DoMoreThan2PerMinuteFor5Minutes(kStartTime, &lim, &bucket, 3); |
| 206 // If the 3rd bucket were exhausted, this would fail (see first test). | 211 // If the 3rd bucket were exhausted, this would fail (see first test). |
| 207 EXPECT_TRUE(lim.Apply(&bucket, kStartTime + TimeDelta::FromMinutes(6))); | 212 EXPECT_TRUE(lim.Apply(&bucket, kStartTime + TimeDelta::FromMinutes(6))); |
| 208 } | 213 } |
| 209 | 214 |
| 210 TEST_F(ExtensionsQuotaServiceTest, NoHeuristic) { | 215 TEST_F(ExtensionsQuotaServiceTest, NoHeuristic) { |
| 211 scoped_refptr<MockFunction> f(new MockFunction("foo")); | 216 scoped_refptr<MockFunction> f(new MockFunction("foo")); |
| 212 ListValue args; | 217 ListValue args; |
| 213 EXPECT_TRUE(service_->Assess(extension_a_, f, &args, kStartTime)); | 218 EXPECT_EQ("", service_->Assess(extension_a_, f, &args, kStartTime)); |
| 214 } | 219 } |
| 215 | 220 |
| 216 TEST_F(ExtensionsQuotaServiceTest, FrozenHeuristic) { | 221 TEST_F(ExtensionsQuotaServiceTest, FrozenHeuristic) { |
| 217 scoped_refptr<MockFunction> f(new FrozenMockFunction("foo")); | 222 scoped_refptr<MockFunction> f(new FrozenMockFunction("foo")); |
| 218 ListValue args; | 223 ListValue args; |
| 219 args.Append(new base::FundamentalValue(1)); | 224 args.Append(new base::FundamentalValue(1)); |
| 220 EXPECT_FALSE(service_->Assess(extension_a_, f, &args, kStartTime)); | 225 EXPECT_NE("", service_->Assess(extension_a_, f, &args, kStartTime)); |
| 221 } | 226 } |
| 222 | 227 |
| 223 TEST_F(ExtensionsQuotaServiceTest, SingleHeuristic) { | 228 TEST_F(ExtensionsQuotaServiceTest, SingleHeuristic) { |
| 224 scoped_refptr<MockFunction> f(new TimedLimitMockFunction("foo")); | 229 scoped_refptr<MockFunction> f(new TimedLimitMockFunction("foo")); |
| 225 ListValue args; | 230 ListValue args; |
| 226 args.Append(new base::FundamentalValue(1)); | 231 args.Append(new base::FundamentalValue(1)); |
| 227 EXPECT_TRUE(service_->Assess(extension_a_, f, &args, kStartTime)); | 232 EXPECT_EQ("", service_->Assess(extension_a_, f, &args, kStartTime)); |
| 228 EXPECT_TRUE(service_->Assess(extension_a_, f, &args, | 233 EXPECT_EQ("", service_->Assess(extension_a_, f, &args, |
| 229 kStartTime + TimeDelta::FromSeconds(10))); | 234 kStartTime + TimeDelta::FromSeconds(10))); |
| 230 EXPECT_FALSE(service_->Assess(extension_a_, f, &args, | 235 EXPECT_NE("", service_->Assess(extension_a_, f, &args, |
| 231 kStartTime + TimeDelta::FromSeconds(15))); | 236 kStartTime + TimeDelta::FromSeconds(15))); |
| 232 | 237 |
| 233 ListValue args2; | 238 ListValue args2; |
| 234 args2.Append(new base::FundamentalValue(1)); | 239 args2.Append(new base::FundamentalValue(1)); |
| 235 args2.Append(new base::FundamentalValue(2)); | 240 args2.Append(new base::FundamentalValue(2)); |
| 236 EXPECT_TRUE(service_->Assess(extension_b_, f, &args2, kStartTime)); | 241 EXPECT_EQ("", service_->Assess(extension_b_, f, &args2, kStartTime)); |
| 237 EXPECT_TRUE(service_->Assess(extension_b_, f, &args2, | 242 EXPECT_EQ("", service_->Assess(extension_b_, f, &args2, |
| 238 kStartTime + TimeDelta::FromSeconds(10))); | 243 kStartTime + TimeDelta::FromSeconds(10))); |
| 239 | 244 |
| 240 TimeDelta peace = TimeDelta::FromMinutes(30); | 245 TimeDelta peace = TimeDelta::FromMinutes(30); |
| 241 EXPECT_TRUE(service_->Assess(extension_b_, f, &args, kStartTime + peace)); | 246 EXPECT_EQ("", service_->Assess(extension_b_, f, &args, kStartTime + peace)); |
| 242 EXPECT_TRUE(service_->Assess(extension_b_, f, &args, | 247 EXPECT_EQ("", service_->Assess( |
| 243 kStartTime + peace + TimeDelta::FromSeconds(10))); | 248 extension_b_, f, &args, |
| 244 EXPECT_FALSE(service_->Assess(extension_b_, f, &args2, | 249 kStartTime + peace + TimeDelta::FromSeconds(10))); |
| 250 EXPECT_NE("", service_->Assess(extension_b_, f, &args2, |
| 245 kStartTime + peace + TimeDelta::FromSeconds(15))); | 251 kStartTime + peace + TimeDelta::FromSeconds(15))); |
| 246 | 252 |
| 247 // Test that items are independent. | 253 // Test that items are independent. |
| 248 ListValue args3; | 254 ListValue args3; |
| 249 args3.Append(new base::FundamentalValue(3)); | 255 args3.Append(new base::FundamentalValue(3)); |
| 250 EXPECT_TRUE(service_->Assess(extension_c_, f, &args, kStartTime)); | 256 EXPECT_EQ("", service_->Assess(extension_c_, f, &args, kStartTime)); |
| 251 EXPECT_TRUE(service_->Assess(extension_c_, f, &args3, | 257 EXPECT_EQ("", service_->Assess(extension_c_, f, &args3, |
| 252 kStartTime + TimeDelta::FromSeconds(10))); | 258 kStartTime + TimeDelta::FromSeconds(10))); |
| 253 EXPECT_TRUE(service_->Assess(extension_c_, f, &args, | 259 EXPECT_EQ("", service_->Assess(extension_c_, f, &args, |
| 254 kStartTime + TimeDelta::FromSeconds(15))); | 260 kStartTime + TimeDelta::FromSeconds(15))); |
| 255 EXPECT_TRUE(service_->Assess(extension_c_, f, &args3, | 261 EXPECT_EQ("", service_->Assess(extension_c_, f, &args3, |
| 256 kStartTime + TimeDelta::FromSeconds(20))); | 262 kStartTime + TimeDelta::FromSeconds(20))); |
| 257 EXPECT_FALSE(service_->Assess(extension_c_, f, &args, | 263 EXPECT_NE("", service_->Assess(extension_c_, f, &args, |
| 258 kStartTime + TimeDelta::FromSeconds(25))); | 264 kStartTime + TimeDelta::FromSeconds(25))); |
| 259 EXPECT_FALSE(service_->Assess(extension_c_, f, &args3, | 265 EXPECT_NE("", service_->Assess(extension_c_, f, &args3, |
| 260 kStartTime + TimeDelta::FromSeconds(30))); | 266 kStartTime + TimeDelta::FromSeconds(30))); |
| 261 } | 267 } |
| 262 | 268 |
| 263 TEST_F(ExtensionsQuotaServiceTest, ChainedHeuristics) { | 269 TEST_F(ExtensionsQuotaServiceTest, ChainedHeuristics) { |
| 264 scoped_refptr<MockFunction> f(new ChainedLimitsMockFunction("foo")); | 270 scoped_refptr<MockFunction> f(new ChainedLimitsMockFunction("foo")); |
| 265 ListValue args; | 271 ListValue args; |
| 266 args.Append(new base::FundamentalValue(1)); | 272 args.Append(new base::FundamentalValue(1)); |
| 267 | 273 |
| 268 // First, test that the low limit can be avoided but the higher one is hit. | 274 // First, test that the low limit can be avoided but the higher one is hit. |
| 269 // One event per minute for 20 minutes comes in under the sustained limit, | 275 // One event per minute for 20 minutes comes in under the sustained limit, |
| 270 // but is equal to the timed limit. | 276 // but is equal to the timed limit. |
| 271 for (int i = 0; i < 20; i++) { | 277 for (int i = 0; i < 20; i++) { |
| 272 EXPECT_TRUE(service_->Assess(extension_a_, f, &args, | 278 EXPECT_EQ("", service_->Assess( |
| 273 kStartTime + TimeDelta::FromSeconds(10 + i * 60))); | 279 extension_a_, f, &args, |
| 280 kStartTime + TimeDelta::FromSeconds(10 + i * 60))); |
| 274 } | 281 } |
| 275 | 282 |
| 276 // This will bring us to 21 events in an hour, which is a violation. | 283 // This will bring us to 21 events in an hour, which is a violation. |
| 277 EXPECT_FALSE(service_->Assess(extension_a_, f, &args, | 284 EXPECT_NE("", service_->Assess(extension_a_, f, &args, |
| 278 kStartTime + TimeDelta::FromMinutes(30))); | 285 kStartTime + TimeDelta::FromMinutes(30))); |
| 279 | 286 |
| 280 // Now, check that we can still hit the lower limit. | 287 // Now, check that we can still hit the lower limit. |
| 281 for (int i = 0; i < 5; i++) { | 288 for (int i = 0; i < 5; i++) { |
| 282 EXPECT_TRUE(service_->Assess(extension_b_, f, &args, | 289 EXPECT_EQ("", service_->Assess( |
| 283 kStartTime + TimeDelta::FromSeconds(10 + i * 60))); | 290 extension_b_, f, &args, |
| 284 EXPECT_TRUE(service_->Assess(extension_b_, f, &args, | 291 kStartTime + TimeDelta::FromSeconds(10 + i * 60))); |
| 285 kStartTime + TimeDelta::FromSeconds(15 + i * 60))); | 292 EXPECT_EQ("", service_->Assess( |
| 286 EXPECT_TRUE(service_->Assess(extension_b_, f, &args, | 293 extension_b_, f, &args, |
| 287 kStartTime + TimeDelta::FromSeconds(20 + i * 60))); | 294 kStartTime + TimeDelta::FromSeconds(15 + i * 60))); |
| 295 EXPECT_EQ("", service_->Assess( |
| 296 extension_b_, f, &args, |
| 297 kStartTime + TimeDelta::FromSeconds(20 + i * 60))); |
| 288 } | 298 } |
| 289 | 299 |
| 290 EXPECT_FALSE(service_->Assess(extension_b_, f, &args, | 300 EXPECT_NE("", service_->Assess(extension_b_, f, &args, |
| 291 kStartTime + TimeDelta::FromMinutes(6))); | 301 kStartTime + TimeDelta::FromMinutes(6))); |
| 292 } | 302 } |
| 293 | 303 |
| 294 TEST_F(ExtensionsQuotaServiceTest, MultipleFunctionsDontInterfere) { | 304 TEST_F(ExtensionsQuotaServiceTest, MultipleFunctionsDontInterfere) { |
| 295 scoped_refptr<MockFunction> f(new TimedLimitMockFunction("foo")); | 305 scoped_refptr<MockFunction> f(new TimedLimitMockFunction("foo")); |
| 296 scoped_refptr<MockFunction> g(new TimedLimitMockFunction("bar")); | 306 scoped_refptr<MockFunction> g(new TimedLimitMockFunction("bar")); |
| 297 | 307 |
| 298 ListValue args_f; | 308 ListValue args_f; |
| 299 ListValue args_g; | 309 ListValue args_g; |
| 300 args_f.Append(new base::FundamentalValue(1)); | 310 args_f.Append(new base::FundamentalValue(1)); |
| 301 args_g.Append(new base::FundamentalValue(2)); | 311 args_g.Append(new base::FundamentalValue(2)); |
| 302 | 312 |
| 303 EXPECT_TRUE(service_->Assess(extension_a_, f, &args_f, kStartTime)); | 313 EXPECT_EQ("", service_->Assess(extension_a_, f, &args_f, kStartTime)); |
| 304 EXPECT_TRUE(service_->Assess(extension_a_, g, &args_g, kStartTime)); | 314 EXPECT_EQ("", service_->Assess(extension_a_, g, &args_g, kStartTime)); |
| 305 EXPECT_TRUE(service_->Assess(extension_a_, f, &args_f, | 315 EXPECT_EQ("", service_->Assess(extension_a_, f, &args_f, |
| 306 kStartTime + TimeDelta::FromSeconds(10))); | 316 kStartTime + TimeDelta::FromSeconds(10))); |
| 307 EXPECT_TRUE(service_->Assess(extension_a_, g, &args_g, | 317 EXPECT_EQ("", service_->Assess(extension_a_, g, &args_g, |
| 308 kStartTime + TimeDelta::FromSeconds(10))); | 318 kStartTime + TimeDelta::FromSeconds(10))); |
| 309 EXPECT_FALSE(service_->Assess(extension_a_, f, &args_f, | 319 EXPECT_NE("", service_->Assess(extension_a_, f, &args_f, |
| 310 kStartTime + TimeDelta::FromSeconds(15))); | 320 kStartTime + TimeDelta::FromSeconds(15))); |
| 311 EXPECT_FALSE(service_->Assess(extension_a_, g, &args_g, | 321 EXPECT_NE("", service_->Assess(extension_a_, g, &args_g, |
| 312 kStartTime + TimeDelta::FromSeconds(15))); | 322 kStartTime + TimeDelta::FromSeconds(15))); |
| 313 } | 323 } |
| 314 | 324 |
| 315 TEST_F(ExtensionsQuotaServiceTest, ViolatorsWillBeViolators) { | 325 TEST_F(ExtensionsQuotaServiceTest, ViolatorsWillBeViolators) { |
| 316 scoped_refptr<MockFunction> f(new TimedLimitMockFunction("foo")); | 326 scoped_refptr<MockFunction> f(new TimedLimitMockFunction("foo")); |
| 317 scoped_refptr<MockFunction> g(new TimedLimitMockFunction("bar")); | 327 scoped_refptr<MockFunction> g(new TimedLimitMockFunction("bar")); |
| 318 ListValue arg; | 328 ListValue arg; |
| 319 arg.Append(new base::FundamentalValue(1)); | 329 arg.Append(new base::FundamentalValue(1)); |
| 320 EXPECT_TRUE(service_->Assess(extension_a_, f, &arg, kStartTime)); | 330 EXPECT_EQ("", service_->Assess(extension_a_, f, &arg, kStartTime)); |
| 321 EXPECT_TRUE(service_->Assess(extension_a_, f, &arg, | 331 EXPECT_EQ("", service_->Assess(extension_a_, f, &arg, |
| 322 kStartTime + TimeDelta::FromSeconds(10))); | 332 kStartTime + TimeDelta::FromSeconds(10))); |
| 323 EXPECT_FALSE(service_->Assess(extension_a_, f, &arg, | 333 EXPECT_NE("", service_->Assess(extension_a_, f, &arg, |
| 324 kStartTime + TimeDelta::FromSeconds(15))); | 334 kStartTime + TimeDelta::FromSeconds(15))); |
| 325 | 335 |
| 326 // We don't allow this extension to use quota limited functions even if they | 336 // We don't allow this extension to use quota limited functions even if they |
| 327 // wait a while. | 337 // wait a while. |
| 328 EXPECT_FALSE(service_->Assess(extension_a_, f, &arg, | 338 EXPECT_NE("", service_->Assess(extension_a_, f, &arg, |
| 329 kStartTime + TimeDelta::FromDays(1))); | 339 kStartTime + TimeDelta::FromDays(1))); |
| 330 EXPECT_FALSE(service_->Assess(extension_a_, g, &arg, | 340 EXPECT_NE("", service_->Assess(extension_a_, g, &arg, |
| 331 kStartTime + TimeDelta::FromDays(1))); | 341 kStartTime + TimeDelta::FromDays(1))); |
| 332 } | 342 } |
| OLD | NEW |