1// Copyright 2014 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.
4
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 "extensions/browser/api/storage/settings_storage_quota_enforcer.h"
10#include "extensions/browser/value_store/testing_value_store.h"
11#include "testing/gtest/include/gtest/gtest.h"
12
13using base::DictionaryValue;
14using base::ListValue;
15using base::Value;
16
17namespace extensions {
18
19// To save typing ValueStore::DEFAULTS/IGNORE_QUOTA everywhere.
20const ValueStore::WriteOptions DEFAULTS = ValueStore::DEFAULTS;
21const ValueStore::WriteOptions IGNORE_QUOTA =
22    ValueStore::IGNORE_QUOTA;
23
24class ExtensionSettingsQuotaTest : public testing::Test {
25 public:
26  ExtensionSettingsQuotaTest()
27      : byte_value_1_(new base::FundamentalValue(1)),
28        byte_value_16_(new base::StringValue("sixteen bytes.")),
29        byte_value_256_(new base::ListValue()),
30        delegate_(new TestingValueStore()) {
31    for (int i = 1; i < 89; ++i) {
32      byte_value_256_->Append(new base::FundamentalValue(i));
33    }
34    ValidateByteValues();
35  }
36
37  void ValidateByteValues() {
38    std::string validate_sizes;
39    base::JSONWriter::Write(byte_value_1_.get(), &validate_sizes);
40    ASSERT_EQ(1u, validate_sizes.size());
41    base::JSONWriter::Write(byte_value_16_.get(), &validate_sizes);
42    ASSERT_EQ(16u, validate_sizes.size());
43    base::JSONWriter::Write(byte_value_256_.get(), &validate_sizes);
44    ASSERT_EQ(256u, validate_sizes.size());
45  }
46
47  virtual void TearDown() OVERRIDE {
48    ASSERT_TRUE(storage_.get() != NULL);
49  }
50
51 protected:
52  // Creates |storage_|.  Must only be called once.
53  void CreateStorage(
54      size_t quota_bytes, size_t quota_bytes_per_item, size_t max_items) {
55    ASSERT_TRUE(storage_.get() == NULL);
56    SettingsStorageQuotaEnforcer::Limits limits =
57        { quota_bytes, quota_bytes_per_item, max_items };
58    storage_.reset(new SettingsStorageQuotaEnforcer(limits, delegate_));
59  }
60
61  // Returns whether the settings in |storage_| and |delegate_| are the same as
62  // |settings|.
63  bool SettingsEqual(const base::DictionaryValue& settings) {
64    return settings.Equals(&storage_->Get()->settings()) &&
65           settings.Equals(&delegate_->Get()->settings());
66  }
67
68  // Values with different serialized sizes.
69  scoped_ptr<base::Value> byte_value_1_;
70  scoped_ptr<base::Value> byte_value_16_;
71  scoped_ptr<base::ListValue> byte_value_256_;
72
73  // Quota enforcing storage area being tested.
74  scoped_ptr<SettingsStorageQuotaEnforcer> storage_;
75
76  // In-memory storage area being delegated to.  Always owned by |storage_|.
77  TestingValueStore* delegate_;
78};
79
80TEST_F(ExtensionSettingsQuotaTest, ZeroQuotaBytes) {
81  base::DictionaryValue empty;
82  CreateStorage(0, UINT_MAX, UINT_MAX);
83
84  EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
85  EXPECT_FALSE(storage_->Remove("a")->HasError());
86  EXPECT_FALSE(storage_->Remove("b")->HasError());
87  EXPECT_TRUE(SettingsEqual(empty));
88}
89
90TEST_F(ExtensionSettingsQuotaTest, KeySizeTakenIntoAccount) {
91  base::DictionaryValue empty;
92  CreateStorage(8u, UINT_MAX, UINT_MAX);
93  EXPECT_TRUE(
94      storage_->Set(DEFAULTS, "Really long key", *byte_value_1_)->HasError());
95  EXPECT_TRUE(SettingsEqual(empty));
96}
97
98TEST_F(ExtensionSettingsQuotaTest, SmallByteQuota) {
99  base::DictionaryValue settings;
100  CreateStorage(8u, UINT_MAX, UINT_MAX);
101
102  EXPECT_FALSE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
103  settings.Set("a", byte_value_1_->DeepCopy());
104  EXPECT_TRUE(SettingsEqual(settings));
105
106  EXPECT_TRUE(storage_->Set(DEFAULTS, "b", *byte_value_16_)->HasError());
107  EXPECT_TRUE(storage_->Set(DEFAULTS, "c", *byte_value_256_)->HasError());
108  EXPECT_TRUE(SettingsEqual(settings));
109}
110
111TEST_F(ExtensionSettingsQuotaTest, MediumByteQuota) {
112  base::DictionaryValue settings;
113  CreateStorage(40, UINT_MAX, UINT_MAX);
114
115  base::DictionaryValue to_set;
116  to_set.Set("a", byte_value_1_->DeepCopy());
117  to_set.Set("b", byte_value_16_->DeepCopy());
118  EXPECT_FALSE(storage_->Set(DEFAULTS, to_set)->HasError());
119  settings.Set("a", byte_value_1_->DeepCopy());
120  settings.Set("b", byte_value_16_->DeepCopy());
121  EXPECT_TRUE(SettingsEqual(settings));
122
123  // Should be able to set value to other under-quota value.
124  to_set.Set("a", byte_value_16_->DeepCopy());
125  EXPECT_FALSE(storage_->Set(DEFAULTS, to_set)->HasError());
126  settings.Set("a", byte_value_16_->DeepCopy());
127  EXPECT_TRUE(SettingsEqual(settings));
128
129  EXPECT_TRUE(storage_->Set(DEFAULTS, "c", *byte_value_256_)->HasError());
130  EXPECT_TRUE(SettingsEqual(settings));
131}
132
133TEST_F(ExtensionSettingsQuotaTest, ZeroMaxKeys) {
134  base::DictionaryValue empty;
135  CreateStorage(UINT_MAX, UINT_MAX, 0);
136
137  EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
138  EXPECT_FALSE(storage_->Remove("a")->HasError());
139  EXPECT_FALSE(storage_->Remove("b")->HasError());
140  EXPECT_TRUE(SettingsEqual(empty));
141}
142
143TEST_F(ExtensionSettingsQuotaTest, SmallMaxKeys) {
144  base::DictionaryValue settings;
145  CreateStorage(UINT_MAX, UINT_MAX, 1);
146
147  EXPECT_FALSE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
148  settings.Set("a", byte_value_1_->DeepCopy());
149  EXPECT_TRUE(SettingsEqual(settings));
150
151  // Should be able to set existing key to other value without going over quota.
152  EXPECT_FALSE(storage_->Set(DEFAULTS, "a", *byte_value_16_)->HasError());
153  settings.Set("a", byte_value_16_->DeepCopy());
154  EXPECT_TRUE(SettingsEqual(settings));
155
156  EXPECT_TRUE(storage_->Set(DEFAULTS, "b", *byte_value_16_)->HasError());
157  EXPECT_TRUE(storage_->Set(DEFAULTS, "c", *byte_value_256_)->HasError());
158  EXPECT_TRUE(SettingsEqual(settings));
159}
160
161TEST_F(ExtensionSettingsQuotaTest, MediumMaxKeys) {
162  base::DictionaryValue settings;
163  CreateStorage(UINT_MAX, UINT_MAX, 2);
164
165  base::DictionaryValue to_set;
166  to_set.Set("a", byte_value_1_->DeepCopy());
167  to_set.Set("b", byte_value_16_->DeepCopy());
168  EXPECT_FALSE(storage_->Set(DEFAULTS, to_set)->HasError());
169  settings.Set("a", byte_value_1_->DeepCopy());
170  settings.Set("b", byte_value_16_->DeepCopy());
171  EXPECT_TRUE(SettingsEqual(settings));
172
173  // Should be able to set existing keys to other values without going over
174  // quota.
175  to_set.Set("a", byte_value_16_->DeepCopy());
176  EXPECT_FALSE(storage_->Set(DEFAULTS, to_set)->HasError());
177  settings.Set("a", byte_value_16_->DeepCopy());
178  EXPECT_TRUE(SettingsEqual(settings));
179
180  EXPECT_TRUE(storage_->Set(DEFAULTS, "c", *byte_value_256_)->HasError());
181  EXPECT_TRUE(SettingsEqual(settings));
182}
183
184TEST_F(ExtensionSettingsQuotaTest, RemovingExistingSettings) {
185  base::DictionaryValue settings;
186  CreateStorage(266, UINT_MAX, 2);
187
188  storage_->Set(DEFAULTS, "b", *byte_value_16_);
189  settings.Set("b", byte_value_16_->DeepCopy());
190  // Not enough quota.
191  storage_->Set(DEFAULTS, "c", *byte_value_256_);
192  EXPECT_TRUE(SettingsEqual(settings));
193
194  // Try again with "b" removed, enough quota.
195  EXPECT_FALSE(storage_->Remove("b")->HasError());
196  settings.Remove("b", NULL);
197  EXPECT_FALSE(storage_->Set(DEFAULTS, "c", *byte_value_256_)->HasError());
198  settings.Set("c", byte_value_256_->DeepCopy());
199  EXPECT_TRUE(SettingsEqual(settings));
200
201  // Enough byte quota but max keys not high enough.
202  EXPECT_FALSE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
203  settings.Set("a", byte_value_1_->DeepCopy());
204  EXPECT_TRUE(SettingsEqual(settings));
205
206  EXPECT_TRUE(storage_->Set(DEFAULTS, "b", *byte_value_1_)->HasError());
207  EXPECT_TRUE(SettingsEqual(settings));
208
209  // Back under max keys.
210  EXPECT_FALSE(storage_->Remove("a")->HasError());
211  settings.Remove("a", NULL);
212  EXPECT_FALSE(storage_->Set(DEFAULTS, "b", *byte_value_1_)->HasError());
213  settings.Set("b", byte_value_1_->DeepCopy());
214  EXPECT_TRUE(SettingsEqual(settings));
215}
216
217TEST_F(ExtensionSettingsQuotaTest, RemovingNonexistentSettings) {
218  base::DictionaryValue settings;
219  CreateStorage(36, UINT_MAX, 3);
220
221  // Max out bytes.
222  base::DictionaryValue to_set;
223  to_set.Set("b1", byte_value_16_->DeepCopy());
224  to_set.Set("b2", byte_value_16_->DeepCopy());
225  storage_->Set(DEFAULTS, to_set);
226  settings.Set("b1", byte_value_16_->DeepCopy());
227  settings.Set("b2", byte_value_16_->DeepCopy());
228  EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
229  EXPECT_TRUE(SettingsEqual(settings));
230
231  // Remove some settings that don't exist.
232  std::vector<std::string> to_remove;
233  to_remove.push_back("a1");
234  to_remove.push_back("a2");
235  EXPECT_FALSE(storage_->Remove(to_remove)->HasError());
236  EXPECT_FALSE(storage_->Remove("b")->HasError());
237  EXPECT_TRUE(SettingsEqual(settings));
238
239  // Still no quota.
240  EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
241  EXPECT_TRUE(SettingsEqual(settings));
242
243  // Max out key count.
244  to_set.Clear();
245  to_set.Set("b1", byte_value_1_->DeepCopy());
246  to_set.Set("b2", byte_value_1_->DeepCopy());
247  storage_->Set(DEFAULTS, to_set);
248  settings.Set("b1", byte_value_1_->DeepCopy());
249  settings.Set("b2", byte_value_1_->DeepCopy());
250  storage_->Set(DEFAULTS, "b3", *byte_value_1_);
251  settings.Set("b3", byte_value_1_->DeepCopy());
252  EXPECT_TRUE(SettingsEqual(settings));
253
254  // Remove some settings that don't exist.
255  to_remove.clear();
256  to_remove.push_back("a1");
257  to_remove.push_back("a2");
258  EXPECT_FALSE(storage_->Remove(to_remove)->HasError());
259  EXPECT_FALSE(storage_->Remove("b")->HasError());
260  EXPECT_TRUE(SettingsEqual(settings));
261
262  // Still no quota.
263  EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
264  EXPECT_TRUE(SettingsEqual(settings));
265}
266
267TEST_F(ExtensionSettingsQuotaTest, Clear) {
268  base::DictionaryValue settings;
269  CreateStorage(40, UINT_MAX, 5);
270
271  // Test running out of byte quota.
272  {
273    base::DictionaryValue to_set;
274    to_set.Set("a", byte_value_16_->DeepCopy());
275    to_set.Set("b", byte_value_16_->DeepCopy());
276    EXPECT_FALSE(storage_->Set(DEFAULTS, to_set)->HasError());
277    EXPECT_TRUE(storage_->Set(DEFAULTS, "c", *byte_value_16_)->HasError());
278
279    EXPECT_FALSE(storage_->Clear()->HasError());
280
281    // (repeat)
282    EXPECT_FALSE(storage_->Set(DEFAULTS, to_set)->HasError());
283    EXPECT_TRUE(storage_->Set(DEFAULTS, "c", *byte_value_16_)->HasError());
284  }
285
286  // Test reaching max keys.
287  storage_->Clear();
288  {
289    base::DictionaryValue to_set;
290    to_set.Set("a", byte_value_1_->DeepCopy());
291    to_set.Set("b", byte_value_1_->DeepCopy());
292    to_set.Set("c", byte_value_1_->DeepCopy());
293    to_set.Set("d", byte_value_1_->DeepCopy());
294    to_set.Set("e", byte_value_1_->DeepCopy());
295    EXPECT_FALSE(storage_->Set(DEFAULTS, to_set)->HasError());
296    EXPECT_TRUE(storage_->Set(DEFAULTS, "f", *byte_value_1_)->HasError());
297
298    storage_->Clear();
299
300    // (repeat)
301    EXPECT_FALSE(storage_->Set(DEFAULTS, to_set)->HasError());
302    EXPECT_TRUE(storage_->Set(DEFAULTS, "f", *byte_value_1_)->HasError());
303  }
304}
305
306TEST_F(ExtensionSettingsQuotaTest, ChangingUsedBytesWithSet) {
307  base::DictionaryValue settings;
308  CreateStorage(20, UINT_MAX, UINT_MAX);
309
310  // Change a setting to make it go over quota.
311  storage_->Set(DEFAULTS, "a", *byte_value_16_);
312  settings.Set("a", byte_value_16_->DeepCopy());
313  EXPECT_TRUE(SettingsEqual(settings));
314
315  EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_256_)->HasError());
316  EXPECT_TRUE(SettingsEqual(settings));
317
318  // Change a setting to reduce usage and room for another setting.
319  EXPECT_TRUE(storage_->Set(DEFAULTS, "foobar", *byte_value_1_)->HasError());
320  storage_->Set(DEFAULTS, "a", *byte_value_1_);
321  settings.Set("a", byte_value_1_->DeepCopy());
322
323  EXPECT_FALSE(storage_->Set(DEFAULTS, "foobar", *byte_value_1_)->HasError());
324  settings.Set("foobar", byte_value_1_->DeepCopy());
325  EXPECT_TRUE(SettingsEqual(settings));
326}
327
328TEST_F(ExtensionSettingsQuotaTest, SetsOnlyEntirelyCompletedWithByteQuota) {
329  base::DictionaryValue settings;
330  CreateStorage(40, UINT_MAX, UINT_MAX);
331
332  storage_->Set(DEFAULTS, "a", *byte_value_16_);
333  settings.Set("a", byte_value_16_->DeepCopy());
334
335  // The entire change is over quota.
336  base::DictionaryValue to_set;
337  to_set.Set("b", byte_value_16_->DeepCopy());
338  to_set.Set("c", byte_value_16_->DeepCopy());
339  EXPECT_TRUE(storage_->Set(DEFAULTS, to_set)->HasError());
340  EXPECT_TRUE(SettingsEqual(settings));
341
342  // The entire change is over quota, but quota reduced in existing key.
343  to_set.Set("a", byte_value_1_->DeepCopy());
344  EXPECT_FALSE(storage_->Set(DEFAULTS, to_set)->HasError());
345  settings.Set("a", byte_value_1_->DeepCopy());
346  settings.Set("b", byte_value_16_->DeepCopy());
347  settings.Set("c", byte_value_16_->DeepCopy());
348  EXPECT_TRUE(SettingsEqual(settings));
349}
350
351TEST_F(ExtensionSettingsQuotaTest, SetsOnlyEntireCompletedWithMaxKeys) {
352  base::DictionaryValue settings;
353  CreateStorage(UINT_MAX, UINT_MAX, 2);
354
355  storage_->Set(DEFAULTS, "a", *byte_value_1_);
356  settings.Set("a", byte_value_1_->DeepCopy());
357
358  base::DictionaryValue to_set;
359  to_set.Set("b", byte_value_16_->DeepCopy());
360  to_set.Set("c", byte_value_16_->DeepCopy());
361  EXPECT_TRUE(storage_->Set(DEFAULTS, to_set)->HasError());
362  EXPECT_TRUE(SettingsEqual(settings));
363}
364
365TEST_F(ExtensionSettingsQuotaTest, WithInitialDataAndByteQuota) {
366  base::DictionaryValue settings;
367  delegate_->Set(DEFAULTS, "a", *byte_value_256_);
368  settings.Set("a", byte_value_256_->DeepCopy());
369
370  CreateStorage(280, UINT_MAX, UINT_MAX);
371  EXPECT_TRUE(SettingsEqual(settings));
372
373  // Add some data.
374  EXPECT_FALSE(storage_->Set(DEFAULTS, "b", *byte_value_16_)->HasError());
375  settings.Set("b", byte_value_16_->DeepCopy());
376  EXPECT_TRUE(SettingsEqual(settings));
377
378  // Not enough quota.
379  EXPECT_TRUE(storage_->Set(DEFAULTS, "c", *byte_value_16_)->HasError());
380  EXPECT_TRUE(SettingsEqual(settings));
381
382  // Reduce usage of original setting so that "c" can fit.
383  EXPECT_FALSE(storage_->Set(DEFAULTS, "a", *byte_value_16_)->HasError());
384  settings.Set("a", byte_value_16_->DeepCopy());
385  EXPECT_TRUE(SettingsEqual(settings));
386
387  EXPECT_FALSE(storage_->Set(DEFAULTS, "c", *byte_value_16_)->HasError());
388  settings.Set("c", byte_value_16_->DeepCopy());
389  EXPECT_TRUE(SettingsEqual(settings));
390
391  // Remove to free up some more data.
392  EXPECT_TRUE(storage_->Set(DEFAULTS, "d", *byte_value_256_)->HasError());
393
394  std::vector<std::string> to_remove;
395  to_remove.push_back("a");
396  to_remove.push_back("b");
397  storage_->Remove(to_remove);
398  settings.Remove("a", NULL);
399  settings.Remove("b", NULL);
400  EXPECT_TRUE(SettingsEqual(settings));
401
402  EXPECT_FALSE(storage_->Set(DEFAULTS, "d", *byte_value_256_)->HasError());
403  settings.Set("d", byte_value_256_->DeepCopy());
404  EXPECT_TRUE(SettingsEqual(settings));
405}
406
407TEST_F(ExtensionSettingsQuotaTest, WithInitialDataAndMaxKeys) {
408  base::DictionaryValue settings;
409  delegate_->Set(DEFAULTS, "a", *byte_value_1_);
410  settings.Set("a", byte_value_1_->DeepCopy());
411  CreateStorage(UINT_MAX, UINT_MAX, 2);
412
413  EXPECT_FALSE(storage_->Set(DEFAULTS, "b", *byte_value_1_)->HasError());
414  settings.Set("b", byte_value_1_->DeepCopy());
415
416  EXPECT_TRUE(storage_->Set(DEFAULTS, "c", *byte_value_1_)->HasError());
417
418  EXPECT_TRUE(SettingsEqual(settings));
419}
420
421TEST_F(ExtensionSettingsQuotaTest, InitiallyOverByteQuota) {
422  base::DictionaryValue settings;
423  settings.Set("a", byte_value_16_->DeepCopy());
424  settings.Set("b", byte_value_16_->DeepCopy());
425  settings.Set("c", byte_value_16_->DeepCopy());
426  delegate_->Set(DEFAULTS, settings);
427
428  CreateStorage(40, UINT_MAX, UINT_MAX);
429  EXPECT_TRUE(SettingsEqual(settings));
430
431  EXPECT_TRUE(storage_->Set(DEFAULTS, "d", *byte_value_16_)->HasError());
432
433  // Take under quota by reducing size of an existing setting
434  EXPECT_FALSE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
435  settings.Set("a", byte_value_1_->DeepCopy());
436  EXPECT_TRUE(SettingsEqual(settings));
437
438  // Should be able set another small setting.
439  EXPECT_FALSE(storage_->Set(DEFAULTS, "d", *byte_value_1_)->HasError());
440  settings.Set("d", byte_value_1_->DeepCopy());
441  EXPECT_TRUE(SettingsEqual(settings));
442}
443
444TEST_F(ExtensionSettingsQuotaTest, InitiallyOverMaxKeys) {
445  base::DictionaryValue settings;
446  settings.Set("a", byte_value_16_->DeepCopy());
447  settings.Set("b", byte_value_16_->DeepCopy());
448  settings.Set("c", byte_value_16_->DeepCopy());
449  delegate_->Set(DEFAULTS, settings);
450
451  CreateStorage(UINT_MAX, UINT_MAX, 2);
452  EXPECT_TRUE(SettingsEqual(settings));
453
454  // Can't set either an existing or new setting.
455  EXPECT_TRUE(storage_->Set(DEFAULTS, "d", *byte_value_16_)->HasError());
456  EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
457  EXPECT_TRUE(SettingsEqual(settings));
458
459  // Should be able after removing 2.
460  storage_->Remove("a");
461  settings.Remove("a", NULL);
462  storage_->Remove("b");
463  settings.Remove("b", NULL);
464  EXPECT_TRUE(SettingsEqual(settings));
465
466  EXPECT_FALSE(storage_->Set(DEFAULTS, "e", *byte_value_1_)->HasError());
467  settings.Set("e", byte_value_1_->DeepCopy());
468  EXPECT_TRUE(SettingsEqual(settings));
469
470  // Still can't set any.
471  EXPECT_TRUE(storage_->Set(DEFAULTS, "d", *byte_value_16_)->HasError());
472  EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
473  EXPECT_TRUE(SettingsEqual(settings));
474}
475
476TEST_F(ExtensionSettingsQuotaTest, ZeroQuotaBytesPerSetting) {
477  base::DictionaryValue empty;
478  CreateStorage(UINT_MAX, 0, UINT_MAX);
479
480  EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
481  EXPECT_FALSE(storage_->Remove("a")->HasError());
482  EXPECT_FALSE(storage_->Remove("b")->HasError());
483  EXPECT_TRUE(SettingsEqual(empty));
484}
485
486TEST_F(ExtensionSettingsQuotaTest, QuotaBytesPerSetting) {
487  base::DictionaryValue settings;
488
489  CreateStorage(UINT_MAX, 20, UINT_MAX);
490
491  EXPECT_FALSE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
492  EXPECT_FALSE(storage_->Set(DEFAULTS, "a", *byte_value_16_)->HasError());
493  settings.Set("a", byte_value_16_->DeepCopy());
494  EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_256_)->HasError());
495
496  EXPECT_FALSE(storage_->Set(DEFAULTS, "b", *byte_value_1_)->HasError());
497  EXPECT_FALSE(storage_->Set(DEFAULTS, "b", *byte_value_16_)->HasError());
498  settings.Set("b", byte_value_16_->DeepCopy());
499  EXPECT_TRUE(storage_->Set(DEFAULTS, "b", *byte_value_256_)->HasError());
500
501  EXPECT_TRUE(SettingsEqual(settings));
502}
503
504TEST_F(ExtensionSettingsQuotaTest, QuotaBytesPerSettingWithInitialSettings) {
505  base::DictionaryValue settings;
506
507  delegate_->Set(DEFAULTS, "a", *byte_value_1_);
508  delegate_->Set(DEFAULTS, "b", *byte_value_16_);
509  delegate_->Set(DEFAULTS, "c", *byte_value_256_);
510  CreateStorage(UINT_MAX, 20, UINT_MAX);
511
512  EXPECT_FALSE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
513  EXPECT_FALSE(storage_->Set(DEFAULTS, "a", *byte_value_16_)->HasError());
514  settings.Set("a", byte_value_16_->DeepCopy());
515  EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_256_)->HasError());
516
517  EXPECT_FALSE(storage_->Set(DEFAULTS, "b", *byte_value_1_)->HasError());
518  EXPECT_FALSE(storage_->Set(DEFAULTS, "b", *byte_value_16_)->HasError());
519  settings.Set("b", byte_value_16_->DeepCopy());
520  EXPECT_TRUE(storage_->Set(DEFAULTS, "b", *byte_value_256_)->HasError());
521
522  EXPECT_FALSE(storage_->Set(DEFAULTS, "c", *byte_value_1_)->HasError());
523  EXPECT_FALSE(storage_->Set(DEFAULTS, "c", *byte_value_16_)->HasError());
524  settings.Set("c", byte_value_16_->DeepCopy());
525  EXPECT_TRUE(storage_->Set(DEFAULTS, "c", *byte_value_256_)->HasError());
526
527  EXPECT_TRUE(SettingsEqual(settings));
528}
529
530TEST_F(ExtensionSettingsQuotaTest,
531    QuotaBytesPerSettingWithInitialSettingsForced) {
532  // This is a lazy test to make sure IGNORE_QUOTA lets through changes: the
533  // test above copied, but using IGNORE_QUOTA and asserting nothing is ever
534  // rejected...
535  base::DictionaryValue settings;
536
537  delegate_->Set(DEFAULTS, "a", *byte_value_1_);
538  delegate_->Set(DEFAULTS, "b", *byte_value_16_);
539  delegate_->Set(DEFAULTS, "c", *byte_value_256_);
540  CreateStorage(UINT_MAX, 20, UINT_MAX);
541
542  EXPECT_FALSE(storage_->Set(IGNORE_QUOTA, "a", *byte_value_1_)->HasError());
543  EXPECT_FALSE(storage_->Set(IGNORE_QUOTA, "a", *byte_value_16_)->HasError());
544  EXPECT_FALSE(storage_->Set(IGNORE_QUOTA, "a", *byte_value_256_)->HasError());
545  settings.Set("a", byte_value_256_->DeepCopy());
546
547  EXPECT_FALSE(storage_->Set(IGNORE_QUOTA, "b", *byte_value_1_)->HasError());
548  EXPECT_FALSE(storage_->Set(IGNORE_QUOTA, "b", *byte_value_16_)->HasError());
549  EXPECT_FALSE(storage_->Set(IGNORE_QUOTA, "b", *byte_value_256_)->HasError());
550  settings.Set("b", byte_value_256_->DeepCopy());
551
552  EXPECT_FALSE(storage_->Set(IGNORE_QUOTA, "c", *byte_value_1_)->HasError());
553  EXPECT_FALSE(storage_->Set(IGNORE_QUOTA, "c", *byte_value_16_)->HasError());
554  settings.Set("c", byte_value_16_->DeepCopy());
555
556  // ... except the last.  Make sure it can still fail.
557  EXPECT_TRUE(storage_->Set(DEFAULTS, "c", *byte_value_256_)->HasError());
558
559  EXPECT_TRUE(SettingsEqual(settings));
560}
561
562TEST_F(ExtensionSettingsQuotaTest, GetBytesInUse) {
563  // Just testing GetBytesInUse, no need for a quota.
564  CreateStorage(UINT_MAX, UINT_MAX, UINT_MAX);
565
566  std::vector<std::string> ab;
567  ab.push_back("a");
568  ab.push_back("b");
569
570  EXPECT_EQ(0u, storage_->GetBytesInUse());
571  EXPECT_EQ(0u, storage_->GetBytesInUse("a"));
572  EXPECT_EQ(0u, storage_->GetBytesInUse("b"));
573  EXPECT_EQ(0u, storage_->GetBytesInUse(ab));
574
575  storage_->Set(DEFAULTS, "a", *byte_value_1_);
576
577  EXPECT_EQ(2u, storage_->GetBytesInUse());
578  EXPECT_EQ(2u, storage_->GetBytesInUse("a"));
579  EXPECT_EQ(0u, storage_->GetBytesInUse("b"));
580  EXPECT_EQ(2u, storage_->GetBytesInUse(ab));
581
582  storage_->Set(DEFAULTS, "b", *byte_value_1_);
583
584  EXPECT_EQ(4u, storage_->GetBytesInUse());
585  EXPECT_EQ(2u, storage_->GetBytesInUse("a"));
586  EXPECT_EQ(2u, storage_->GetBytesInUse("b"));
587  EXPECT_EQ(4u, storage_->GetBytesInUse(ab));
588
589  storage_->Set(DEFAULTS, "c", *byte_value_1_);
590
591  EXPECT_EQ(6u, storage_->GetBytesInUse());
592  EXPECT_EQ(2u, storage_->GetBytesInUse("a"));
593  EXPECT_EQ(2u, storage_->GetBytesInUse("b"));
594  EXPECT_EQ(4u, storage_->GetBytesInUse(ab));
595}
596
597}  // namespace extensions
598