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
3 // found in the LICENSE file.
5 #include "base/json/json_writer.h"
6 #include "base/memory/ref_counted.h"
7 #include "base/memory/scoped_ptr.h"
8 #include "base/values.h"
9 #include "chrome/browser/extensions/api/storage/settings_backend.h"
10 #include "chrome/browser/extensions/api/storage/settings_storage_quota_enforcer.h"
11 #include "chrome/browser/value_store/testing_value_store.h"
12 #include "testing/gtest/include/gtest/gtest.h"
14 using base::DictionaryValue;
15 using base::ListValue;
18 namespace extensions {
20 // To save typing ValueStore::DEFAULTS/IGNORE_QUOTA everywhere.
21 const ValueStore::WriteOptions DEFAULTS = ValueStore::DEFAULTS;
22 const ValueStore::WriteOptions IGNORE_QUOTA =
23 ValueStore::IGNORE_QUOTA;
25 class ExtensionSettingsQuotaTest : public testing::Test {
27 ExtensionSettingsQuotaTest()
28 : byte_value_1_(new base::FundamentalValue(1)),
29 byte_value_16_(new base::StringValue("sixteen bytes.")),
30 byte_value_256_(new ListValue()),
31 delegate_(new TestingValueStore()) {
32 for (int i = 1; i < 89; ++i) {
33 byte_value_256_->Append(new base::FundamentalValue(i));
38 void ValidateByteValues() {
39 std::string validate_sizes;
40 base::JSONWriter::Write(byte_value_1_.get(), &validate_sizes);
41 ASSERT_EQ(1u, validate_sizes.size());
42 base::JSONWriter::Write(byte_value_16_.get(), &validate_sizes);
43 ASSERT_EQ(16u, validate_sizes.size());
44 base::JSONWriter::Write(byte_value_256_.get(), &validate_sizes);
45 ASSERT_EQ(256u, validate_sizes.size());
48 virtual void TearDown() OVERRIDE {
49 ASSERT_TRUE(storage_.get() != NULL);
53 // Creates |storage_|. Must only be called once.
55 size_t quota_bytes, size_t quota_bytes_per_item, size_t max_items) {
56 ASSERT_TRUE(storage_.get() == NULL);
57 SettingsStorageQuotaEnforcer::Limits limits =
58 { quota_bytes, quota_bytes_per_item, max_items };
59 storage_.reset(new SettingsStorageQuotaEnforcer(limits, delegate_));
62 // Returns whether the settings in |storage_| and |delegate_| are the same as
64 bool SettingsEqual(const DictionaryValue& settings) {
65 return settings.Equals(&storage_->Get()->settings()) &&
66 settings.Equals(&delegate_->Get()->settings());
69 // Values with different serialized sizes.
70 scoped_ptr<Value> byte_value_1_;
71 scoped_ptr<Value> byte_value_16_;
72 scoped_ptr<ListValue> byte_value_256_;
74 // Quota enforcing storage area being tested.
75 scoped_ptr<SettingsStorageQuotaEnforcer> storage_;
77 // In-memory storage area being delegated to. Always owned by |storage_|.
78 TestingValueStore* delegate_;
81 TEST_F(ExtensionSettingsQuotaTest, ZeroQuotaBytes) {
82 DictionaryValue empty;
83 CreateStorage(0, UINT_MAX, UINT_MAX);
85 EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
86 EXPECT_FALSE(storage_->Remove("a")->HasError());
87 EXPECT_FALSE(storage_->Remove("b")->HasError());
88 EXPECT_TRUE(SettingsEqual(empty));
91 TEST_F(ExtensionSettingsQuotaTest, KeySizeTakenIntoAccount) {
92 DictionaryValue empty;
93 CreateStorage(8u, UINT_MAX, UINT_MAX);
95 storage_->Set(DEFAULTS, "Really long key", *byte_value_1_)->HasError());
96 EXPECT_TRUE(SettingsEqual(empty));
99 TEST_F(ExtensionSettingsQuotaTest, SmallByteQuota) {
100 DictionaryValue settings;
101 CreateStorage(8u, UINT_MAX, UINT_MAX);
103 EXPECT_FALSE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
104 settings.Set("a", byte_value_1_->DeepCopy());
105 EXPECT_TRUE(SettingsEqual(settings));
107 EXPECT_TRUE(storage_->Set(DEFAULTS, "b", *byte_value_16_)->HasError());
108 EXPECT_TRUE(storage_->Set(DEFAULTS, "c", *byte_value_256_)->HasError());
109 EXPECT_TRUE(SettingsEqual(settings));
112 TEST_F(ExtensionSettingsQuotaTest, MediumByteQuota) {
113 DictionaryValue settings;
114 CreateStorage(40, UINT_MAX, UINT_MAX);
116 DictionaryValue to_set;
117 to_set.Set("a", byte_value_1_->DeepCopy());
118 to_set.Set("b", byte_value_16_->DeepCopy());
119 EXPECT_FALSE(storage_->Set(DEFAULTS, to_set)->HasError());
120 settings.Set("a", byte_value_1_->DeepCopy());
121 settings.Set("b", byte_value_16_->DeepCopy());
122 EXPECT_TRUE(SettingsEqual(settings));
124 // Should be able to set value to other under-quota value.
125 to_set.Set("a", byte_value_16_->DeepCopy());
126 EXPECT_FALSE(storage_->Set(DEFAULTS, to_set)->HasError());
127 settings.Set("a", byte_value_16_->DeepCopy());
128 EXPECT_TRUE(SettingsEqual(settings));
130 EXPECT_TRUE(storage_->Set(DEFAULTS, "c", *byte_value_256_)->HasError());
131 EXPECT_TRUE(SettingsEqual(settings));
134 TEST_F(ExtensionSettingsQuotaTest, ZeroMaxKeys) {
135 DictionaryValue empty;
136 CreateStorage(UINT_MAX, UINT_MAX, 0);
138 EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
139 EXPECT_FALSE(storage_->Remove("a")->HasError());
140 EXPECT_FALSE(storage_->Remove("b")->HasError());
141 EXPECT_TRUE(SettingsEqual(empty));
144 TEST_F(ExtensionSettingsQuotaTest, SmallMaxKeys) {
145 DictionaryValue settings;
146 CreateStorage(UINT_MAX, UINT_MAX, 1);
148 EXPECT_FALSE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
149 settings.Set("a", byte_value_1_->DeepCopy());
150 EXPECT_TRUE(SettingsEqual(settings));
152 // Should be able to set existing key to other value without going over quota.
153 EXPECT_FALSE(storage_->Set(DEFAULTS, "a", *byte_value_16_)->HasError());
154 settings.Set("a", byte_value_16_->DeepCopy());
155 EXPECT_TRUE(SettingsEqual(settings));
157 EXPECT_TRUE(storage_->Set(DEFAULTS, "b", *byte_value_16_)->HasError());
158 EXPECT_TRUE(storage_->Set(DEFAULTS, "c", *byte_value_256_)->HasError());
159 EXPECT_TRUE(SettingsEqual(settings));
162 TEST_F(ExtensionSettingsQuotaTest, MediumMaxKeys) {
163 DictionaryValue settings;
164 CreateStorage(UINT_MAX, UINT_MAX, 2);
166 DictionaryValue to_set;
167 to_set.Set("a", byte_value_1_->DeepCopy());
168 to_set.Set("b", byte_value_16_->DeepCopy());
169 EXPECT_FALSE(storage_->Set(DEFAULTS, to_set)->HasError());
170 settings.Set("a", byte_value_1_->DeepCopy());
171 settings.Set("b", byte_value_16_->DeepCopy());
172 EXPECT_TRUE(SettingsEqual(settings));
174 // Should be able to set existing keys to other values without going over
176 to_set.Set("a", byte_value_16_->DeepCopy());
177 EXPECT_FALSE(storage_->Set(DEFAULTS, to_set)->HasError());
178 settings.Set("a", byte_value_16_->DeepCopy());
179 EXPECT_TRUE(SettingsEqual(settings));
181 EXPECT_TRUE(storage_->Set(DEFAULTS, "c", *byte_value_256_)->HasError());
182 EXPECT_TRUE(SettingsEqual(settings));
185 TEST_F(ExtensionSettingsQuotaTest, RemovingExistingSettings) {
186 DictionaryValue settings;
187 CreateStorage(266, UINT_MAX, 2);
189 storage_->Set(DEFAULTS, "b", *byte_value_16_);
190 settings.Set("b", byte_value_16_->DeepCopy());
192 storage_->Set(DEFAULTS, "c", *byte_value_256_);
193 EXPECT_TRUE(SettingsEqual(settings));
195 // Try again with "b" removed, enough quota.
196 EXPECT_FALSE(storage_->Remove("b")->HasError());
197 settings.Remove("b", NULL);
198 EXPECT_FALSE(storage_->Set(DEFAULTS, "c", *byte_value_256_)->HasError());
199 settings.Set("c", byte_value_256_->DeepCopy());
200 EXPECT_TRUE(SettingsEqual(settings));
202 // Enough byte quota but max keys not high enough.
203 EXPECT_FALSE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
204 settings.Set("a", byte_value_1_->DeepCopy());
205 EXPECT_TRUE(SettingsEqual(settings));
207 EXPECT_TRUE(storage_->Set(DEFAULTS, "b", *byte_value_1_)->HasError());
208 EXPECT_TRUE(SettingsEqual(settings));
210 // Back under max keys.
211 EXPECT_FALSE(storage_->Remove("a")->HasError());
212 settings.Remove("a", NULL);
213 EXPECT_FALSE(storage_->Set(DEFAULTS, "b", *byte_value_1_)->HasError());
214 settings.Set("b", byte_value_1_->DeepCopy());
215 EXPECT_TRUE(SettingsEqual(settings));
218 TEST_F(ExtensionSettingsQuotaTest, RemovingNonexistentSettings) {
219 DictionaryValue settings;
220 CreateStorage(36, UINT_MAX, 3);
223 DictionaryValue to_set;
224 to_set.Set("b1", byte_value_16_->DeepCopy());
225 to_set.Set("b2", byte_value_16_->DeepCopy());
226 storage_->Set(DEFAULTS, to_set);
227 settings.Set("b1", byte_value_16_->DeepCopy());
228 settings.Set("b2", byte_value_16_->DeepCopy());
229 EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
230 EXPECT_TRUE(SettingsEqual(settings));
232 // Remove some settings that don't exist.
233 std::vector<std::string> to_remove;
234 to_remove.push_back("a1");
235 to_remove.push_back("a2");
236 EXPECT_FALSE(storage_->Remove(to_remove)->HasError());
237 EXPECT_FALSE(storage_->Remove("b")->HasError());
238 EXPECT_TRUE(SettingsEqual(settings));
241 EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
242 EXPECT_TRUE(SettingsEqual(settings));
244 // Max out key count.
246 to_set.Set("b1", byte_value_1_->DeepCopy());
247 to_set.Set("b2", byte_value_1_->DeepCopy());
248 storage_->Set(DEFAULTS, to_set);
249 settings.Set("b1", byte_value_1_->DeepCopy());
250 settings.Set("b2", byte_value_1_->DeepCopy());
251 storage_->Set(DEFAULTS, "b3", *byte_value_1_);
252 settings.Set("b3", byte_value_1_->DeepCopy());
253 EXPECT_TRUE(SettingsEqual(settings));
255 // Remove some settings that don't exist.
257 to_remove.push_back("a1");
258 to_remove.push_back("a2");
259 EXPECT_FALSE(storage_->Remove(to_remove)->HasError());
260 EXPECT_FALSE(storage_->Remove("b")->HasError());
261 EXPECT_TRUE(SettingsEqual(settings));
264 EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
265 EXPECT_TRUE(SettingsEqual(settings));
268 TEST_F(ExtensionSettingsQuotaTest, Clear) {
269 DictionaryValue settings;
270 CreateStorage(40, UINT_MAX, 5);
272 // Test running out of byte quota.
274 DictionaryValue to_set;
275 to_set.Set("a", byte_value_16_->DeepCopy());
276 to_set.Set("b", byte_value_16_->DeepCopy());
277 EXPECT_FALSE(storage_->Set(DEFAULTS, to_set)->HasError());
278 EXPECT_TRUE(storage_->Set(DEFAULTS, "c", *byte_value_16_)->HasError());
280 EXPECT_FALSE(storage_->Clear()->HasError());
283 EXPECT_FALSE(storage_->Set(DEFAULTS, to_set)->HasError());
284 EXPECT_TRUE(storage_->Set(DEFAULTS, "c", *byte_value_16_)->HasError());
287 // Test reaching max keys.
290 DictionaryValue to_set;
291 to_set.Set("a", byte_value_1_->DeepCopy());
292 to_set.Set("b", byte_value_1_->DeepCopy());
293 to_set.Set("c", byte_value_1_->DeepCopy());
294 to_set.Set("d", byte_value_1_->DeepCopy());
295 to_set.Set("e", byte_value_1_->DeepCopy());
296 EXPECT_FALSE(storage_->Set(DEFAULTS, to_set)->HasError());
297 EXPECT_TRUE(storage_->Set(DEFAULTS, "f", *byte_value_1_)->HasError());
302 EXPECT_FALSE(storage_->Set(DEFAULTS, to_set)->HasError());
303 EXPECT_TRUE(storage_->Set(DEFAULTS, "f", *byte_value_1_)->HasError());
307 TEST_F(ExtensionSettingsQuotaTest, ChangingUsedBytesWithSet) {
308 DictionaryValue settings;
309 CreateStorage(20, UINT_MAX, UINT_MAX);
311 // Change a setting to make it go over quota.
312 storage_->Set(DEFAULTS, "a", *byte_value_16_);
313 settings.Set("a", byte_value_16_->DeepCopy());
314 EXPECT_TRUE(SettingsEqual(settings));
316 EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_256_)->HasError());
317 EXPECT_TRUE(SettingsEqual(settings));
319 // Change a setting to reduce usage and room for another setting.
320 EXPECT_TRUE(storage_->Set(DEFAULTS, "foobar", *byte_value_1_)->HasError());
321 storage_->Set(DEFAULTS, "a", *byte_value_1_);
322 settings.Set("a", byte_value_1_->DeepCopy());
324 EXPECT_FALSE(storage_->Set(DEFAULTS, "foobar", *byte_value_1_)->HasError());
325 settings.Set("foobar", byte_value_1_->DeepCopy());
326 EXPECT_TRUE(SettingsEqual(settings));
329 TEST_F(ExtensionSettingsQuotaTest, SetsOnlyEntirelyCompletedWithByteQuota) {
330 DictionaryValue settings;
331 CreateStorage(40, UINT_MAX, UINT_MAX);
333 storage_->Set(DEFAULTS, "a", *byte_value_16_);
334 settings.Set("a", byte_value_16_->DeepCopy());
336 // The entire change is over quota.
337 DictionaryValue to_set;
338 to_set.Set("b", byte_value_16_->DeepCopy());
339 to_set.Set("c", byte_value_16_->DeepCopy());
340 EXPECT_TRUE(storage_->Set(DEFAULTS, to_set)->HasError());
341 EXPECT_TRUE(SettingsEqual(settings));
343 // The entire change is over quota, but quota reduced in existing key.
344 to_set.Set("a", byte_value_1_->DeepCopy());
345 EXPECT_FALSE(storage_->Set(DEFAULTS, to_set)->HasError());
346 settings.Set("a", byte_value_1_->DeepCopy());
347 settings.Set("b", byte_value_16_->DeepCopy());
348 settings.Set("c", byte_value_16_->DeepCopy());
349 EXPECT_TRUE(SettingsEqual(settings));
352 TEST_F(ExtensionSettingsQuotaTest, SetsOnlyEntireCompletedWithMaxKeys) {
353 DictionaryValue settings;
354 CreateStorage(UINT_MAX, UINT_MAX, 2);
356 storage_->Set(DEFAULTS, "a", *byte_value_1_);
357 settings.Set("a", byte_value_1_->DeepCopy());
359 DictionaryValue to_set;
360 to_set.Set("b", byte_value_16_->DeepCopy());
361 to_set.Set("c", byte_value_16_->DeepCopy());
362 EXPECT_TRUE(storage_->Set(DEFAULTS, to_set)->HasError());
363 EXPECT_TRUE(SettingsEqual(settings));
366 TEST_F(ExtensionSettingsQuotaTest, WithInitialDataAndByteQuota) {
367 DictionaryValue settings;
368 delegate_->Set(DEFAULTS, "a", *byte_value_256_);
369 settings.Set("a", byte_value_256_->DeepCopy());
371 CreateStorage(280, UINT_MAX, UINT_MAX);
372 EXPECT_TRUE(SettingsEqual(settings));
375 EXPECT_FALSE(storage_->Set(DEFAULTS, "b", *byte_value_16_)->HasError());
376 settings.Set("b", byte_value_16_->DeepCopy());
377 EXPECT_TRUE(SettingsEqual(settings));
380 EXPECT_TRUE(storage_->Set(DEFAULTS, "c", *byte_value_16_)->HasError());
381 EXPECT_TRUE(SettingsEqual(settings));
383 // Reduce usage of original setting so that "c" can fit.
384 EXPECT_FALSE(storage_->Set(DEFAULTS, "a", *byte_value_16_)->HasError());
385 settings.Set("a", byte_value_16_->DeepCopy());
386 EXPECT_TRUE(SettingsEqual(settings));
388 EXPECT_FALSE(storage_->Set(DEFAULTS, "c", *byte_value_16_)->HasError());
389 settings.Set("c", byte_value_16_->DeepCopy());
390 EXPECT_TRUE(SettingsEqual(settings));
392 // Remove to free up some more data.
393 EXPECT_TRUE(storage_->Set(DEFAULTS, "d", *byte_value_256_)->HasError());
395 std::vector<std::string> to_remove;
396 to_remove.push_back("a");
397 to_remove.push_back("b");
398 storage_->Remove(to_remove);
399 settings.Remove("a", NULL);
400 settings.Remove("b", NULL);
401 EXPECT_TRUE(SettingsEqual(settings));
403 EXPECT_FALSE(storage_->Set(DEFAULTS, "d", *byte_value_256_)->HasError());
404 settings.Set("d", byte_value_256_->DeepCopy());
405 EXPECT_TRUE(SettingsEqual(settings));
408 TEST_F(ExtensionSettingsQuotaTest, WithInitialDataAndMaxKeys) {
409 DictionaryValue settings;
410 delegate_->Set(DEFAULTS, "a", *byte_value_1_);
411 settings.Set("a", byte_value_1_->DeepCopy());
412 CreateStorage(UINT_MAX, UINT_MAX, 2);
414 EXPECT_FALSE(storage_->Set(DEFAULTS, "b", *byte_value_1_)->HasError());
415 settings.Set("b", byte_value_1_->DeepCopy());
417 EXPECT_TRUE(storage_->Set(DEFAULTS, "c", *byte_value_1_)->HasError());
419 EXPECT_TRUE(SettingsEqual(settings));
422 TEST_F(ExtensionSettingsQuotaTest, InitiallyOverByteQuota) {
423 DictionaryValue settings;
424 settings.Set("a", byte_value_16_->DeepCopy());
425 settings.Set("b", byte_value_16_->DeepCopy());
426 settings.Set("c", byte_value_16_->DeepCopy());
427 delegate_->Set(DEFAULTS, settings);
429 CreateStorage(40, UINT_MAX, UINT_MAX);
430 EXPECT_TRUE(SettingsEqual(settings));
432 EXPECT_TRUE(storage_->Set(DEFAULTS, "d", *byte_value_16_)->HasError());
434 // Take under quota by reducing size of an existing setting
435 EXPECT_FALSE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
436 settings.Set("a", byte_value_1_->DeepCopy());
437 EXPECT_TRUE(SettingsEqual(settings));
439 // Should be able set another small setting.
440 EXPECT_FALSE(storage_->Set(DEFAULTS, "d", *byte_value_1_)->HasError());
441 settings.Set("d", byte_value_1_->DeepCopy());
442 EXPECT_TRUE(SettingsEqual(settings));
445 TEST_F(ExtensionSettingsQuotaTest, InitiallyOverMaxKeys) {
446 DictionaryValue settings;
447 settings.Set("a", byte_value_16_->DeepCopy());
448 settings.Set("b", byte_value_16_->DeepCopy());
449 settings.Set("c", byte_value_16_->DeepCopy());
450 delegate_->Set(DEFAULTS, settings);
452 CreateStorage(UINT_MAX, UINT_MAX, 2);
453 EXPECT_TRUE(SettingsEqual(settings));
455 // Can't set either an existing or new setting.
456 EXPECT_TRUE(storage_->Set(DEFAULTS, "d", *byte_value_16_)->HasError());
457 EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
458 EXPECT_TRUE(SettingsEqual(settings));
460 // Should be able after removing 2.
461 storage_->Remove("a");
462 settings.Remove("a", NULL);
463 storage_->Remove("b");
464 settings.Remove("b", NULL);
465 EXPECT_TRUE(SettingsEqual(settings));
467 EXPECT_FALSE(storage_->Set(DEFAULTS, "e", *byte_value_1_)->HasError());
468 settings.Set("e", byte_value_1_->DeepCopy());
469 EXPECT_TRUE(SettingsEqual(settings));
471 // Still can't set any.
472 EXPECT_TRUE(storage_->Set(DEFAULTS, "d", *byte_value_16_)->HasError());
473 EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
474 EXPECT_TRUE(SettingsEqual(settings));
477 TEST_F(ExtensionSettingsQuotaTest, ZeroQuotaBytesPerSetting) {
478 DictionaryValue empty;
479 CreateStorage(UINT_MAX, 0, UINT_MAX);
481 EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
482 EXPECT_FALSE(storage_->Remove("a")->HasError());
483 EXPECT_FALSE(storage_->Remove("b")->HasError());
484 EXPECT_TRUE(SettingsEqual(empty));
487 TEST_F(ExtensionSettingsQuotaTest, QuotaBytesPerSetting) {
488 DictionaryValue settings;
490 CreateStorage(UINT_MAX, 20, UINT_MAX);
492 EXPECT_FALSE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
493 EXPECT_FALSE(storage_->Set(DEFAULTS, "a", *byte_value_16_)->HasError());
494 settings.Set("a", byte_value_16_->DeepCopy());
495 EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_256_)->HasError());
497 EXPECT_FALSE(storage_->Set(DEFAULTS, "b", *byte_value_1_)->HasError());
498 EXPECT_FALSE(storage_->Set(DEFAULTS, "b", *byte_value_16_)->HasError());
499 settings.Set("b", byte_value_16_->DeepCopy());
500 EXPECT_TRUE(storage_->Set(DEFAULTS, "b", *byte_value_256_)->HasError());
502 EXPECT_TRUE(SettingsEqual(settings));
505 TEST_F(ExtensionSettingsQuotaTest, QuotaBytesPerSettingWithInitialSettings) {
506 DictionaryValue settings;
508 delegate_->Set(DEFAULTS, "a", *byte_value_1_);
509 delegate_->Set(DEFAULTS, "b", *byte_value_16_);
510 delegate_->Set(DEFAULTS, "c", *byte_value_256_);
511 CreateStorage(UINT_MAX, 20, UINT_MAX);
513 EXPECT_FALSE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
514 EXPECT_FALSE(storage_->Set(DEFAULTS, "a", *byte_value_16_)->HasError());
515 settings.Set("a", byte_value_16_->DeepCopy());
516 EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_256_)->HasError());
518 EXPECT_FALSE(storage_->Set(DEFAULTS, "b", *byte_value_1_)->HasError());
519 EXPECT_FALSE(storage_->Set(DEFAULTS, "b", *byte_value_16_)->HasError());
520 settings.Set("b", byte_value_16_->DeepCopy());
521 EXPECT_TRUE(storage_->Set(DEFAULTS, "b", *byte_value_256_)->HasError());
523 EXPECT_FALSE(storage_->Set(DEFAULTS, "c", *byte_value_1_)->HasError());
524 EXPECT_FALSE(storage_->Set(DEFAULTS, "c", *byte_value_16_)->HasError());
525 settings.Set("c", byte_value_16_->DeepCopy());
526 EXPECT_TRUE(storage_->Set(DEFAULTS, "c", *byte_value_256_)->HasError());
528 EXPECT_TRUE(SettingsEqual(settings));
531 TEST_F(ExtensionSettingsQuotaTest,
532 QuotaBytesPerSettingWithInitialSettingsForced) {
533 // This is a lazy test to make sure IGNORE_QUOTA lets through changes: the
534 // test above copied, but using IGNORE_QUOTA and asserting nothing is ever
536 DictionaryValue settings;
538 delegate_->Set(DEFAULTS, "a", *byte_value_1_);
539 delegate_->Set(DEFAULTS, "b", *byte_value_16_);
540 delegate_->Set(DEFAULTS, "c", *byte_value_256_);
541 CreateStorage(UINT_MAX, 20, UINT_MAX);
543 EXPECT_FALSE(storage_->Set(IGNORE_QUOTA, "a", *byte_value_1_)->HasError());
544 EXPECT_FALSE(storage_->Set(IGNORE_QUOTA, "a", *byte_value_16_)->HasError());
545 EXPECT_FALSE(storage_->Set(IGNORE_QUOTA, "a", *byte_value_256_)->HasError());
546 settings.Set("a", byte_value_256_->DeepCopy());
548 EXPECT_FALSE(storage_->Set(IGNORE_QUOTA, "b", *byte_value_1_)->HasError());
549 EXPECT_FALSE(storage_->Set(IGNORE_QUOTA, "b", *byte_value_16_)->HasError());
550 EXPECT_FALSE(storage_->Set(IGNORE_QUOTA, "b", *byte_value_256_)->HasError());
551 settings.Set("b", byte_value_256_->DeepCopy());
553 EXPECT_FALSE(storage_->Set(IGNORE_QUOTA, "c", *byte_value_1_)->HasError());
554 EXPECT_FALSE(storage_->Set(IGNORE_QUOTA, "c", *byte_value_16_)->HasError());
555 settings.Set("c", byte_value_16_->DeepCopy());
557 // ... except the last. Make sure it can still fail.
558 EXPECT_TRUE(storage_->Set(DEFAULTS, "c", *byte_value_256_)->HasError());
560 EXPECT_TRUE(SettingsEqual(settings));
563 TEST_F(ExtensionSettingsQuotaTest, GetBytesInUse) {
564 // Just testing GetBytesInUse, no need for a quota.
565 CreateStorage(UINT_MAX, UINT_MAX, UINT_MAX);
567 std::vector<std::string> ab;
571 EXPECT_EQ(0u, storage_->GetBytesInUse());
572 EXPECT_EQ(0u, storage_->GetBytesInUse("a"));
573 EXPECT_EQ(0u, storage_->GetBytesInUse("b"));
574 EXPECT_EQ(0u, storage_->GetBytesInUse(ab));
576 storage_->Set(DEFAULTS, "a", *byte_value_1_);
578 EXPECT_EQ(2u, storage_->GetBytesInUse());
579 EXPECT_EQ(2u, storage_->GetBytesInUse("a"));
580 EXPECT_EQ(0u, storage_->GetBytesInUse("b"));
581 EXPECT_EQ(2u, storage_->GetBytesInUse(ab));
583 storage_->Set(DEFAULTS, "b", *byte_value_1_);
585 EXPECT_EQ(4u, storage_->GetBytesInUse());
586 EXPECT_EQ(2u, storage_->GetBytesInUse("a"));
587 EXPECT_EQ(2u, storage_->GetBytesInUse("b"));
588 EXPECT_EQ(4u, storage_->GetBytesInUse(ab));
590 storage_->Set(DEFAULTS, "c", *byte_value_1_);
592 EXPECT_EQ(6u, storage_->GetBytesInUse());
593 EXPECT_EQ(2u, storage_->GetBytesInUse("a"));
594 EXPECT_EQ(2u, storage_->GetBytesInUse("b"));
595 EXPECT_EQ(4u, storage_->GetBytesInUse(ab));
598 } // namespace extensions