1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_writer.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h"
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/browser/api/storage/settings_storage_quota_enforcer.h"
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/browser/value_store/testing_value_store.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing base::DictionaryValue;
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing base::ListValue;
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing base::Value;
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To save typing ValueStore::DEFAULTS/IGNORE_QUOTA everywhere.
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ValueStore::WriteOptions DEFAULTS = ValueStore::DEFAULTS;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ValueStore::WriteOptions IGNORE_QUOTA =
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValueStore::IGNORE_QUOTA;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionSettingsQuotaTest : public testing::Test {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionSettingsQuotaTest()
273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      : byte_value_1_(new base::FundamentalValue(1)),
283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        byte_value_16_(new base::StringValue("sixteen bytes.")),
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        byte_value_256_(new base::ListValue()),
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        delegate_(new TestingValueStore()) {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int i = 1; i < 89; ++i) {
323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      byte_value_256_->Append(new base::FundamentalValue(i));
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValidateByteValues();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ValidateByteValues() {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string validate_sizes;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::JSONWriter::Write(byte_value_1_.get(), &validate_sizes);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(1u, validate_sizes.size());
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::JSONWriter::Write(byte_value_16_.get(), &validate_sizes);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(16u, validate_sizes.size());
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::JSONWriter::Write(byte_value_256_.get(), &validate_sizes);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(256u, validate_sizes.size());
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(storage_.get() != NULL);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates |storage_|.  Must only be called once.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CreateStorage(
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      size_t quota_bytes, size_t quota_bytes_per_item, size_t max_items) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(storage_.get() == NULL);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SettingsStorageQuotaEnforcer::Limits limits =
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        { quota_bytes, quota_bytes_per_item, max_items };
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    storage_.reset(new SettingsStorageQuotaEnforcer(limits, delegate_));
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns whether the settings in |storage_| and |delegate_| are the same as
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |settings|.
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool SettingsEqual(const base::DictionaryValue& settings) {
6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return settings.Equals(&storage_->Get()->settings()) &&
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)           settings.Equals(&delegate_->Get()->settings());
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Values with different serialized sizes.
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::Value> byte_value_1_;
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::Value> byte_value_16_;
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::ListValue> byte_value_256_;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Quota enforcing storage area being tested.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<SettingsStorageQuotaEnforcer> storage_;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In-memory storage area being delegated to.  Always owned by |storage_|.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingValueStore* delegate_;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSettingsQuotaTest, ZeroQuotaBytes) {
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue empty;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStorage(0, UINT_MAX, UINT_MAX);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Remove("a")->HasError());
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Remove("b")->HasError());
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(empty));
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSettingsQuotaTest, KeySizeTakenIntoAccount) {
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue empty;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStorage(8u, UINT_MAX, UINT_MAX);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      storage_->Set(DEFAULTS, "Really long key", *byte_value_1_)->HasError());
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(empty));
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSettingsQuotaTest, SmallByteQuota) {
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue settings;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStorage(8u, UINT_MAX, UINT_MAX);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("a", byte_value_1_->DeepCopy());
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(storage_->Set(DEFAULTS, "b", *byte_value_16_)->HasError());
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(storage_->Set(DEFAULTS, "c", *byte_value_256_)->HasError());
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSettingsQuotaTest, MediumByteQuota) {
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue settings;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStorage(40, UINT_MAX, UINT_MAX);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue to_set;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  to_set.Set("a", byte_value_1_->DeepCopy());
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  to_set.Set("b", byte_value_16_->DeepCopy());
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(DEFAULTS, to_set)->HasError());
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("a", byte_value_1_->DeepCopy());
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("b", byte_value_16_->DeepCopy());
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should be able to set value to other under-quota value.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  to_set.Set("a", byte_value_16_->DeepCopy());
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(DEFAULTS, to_set)->HasError());
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("a", byte_value_16_->DeepCopy());
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(storage_->Set(DEFAULTS, "c", *byte_value_256_)->HasError());
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSettingsQuotaTest, ZeroMaxKeys) {
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue empty;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStorage(UINT_MAX, UINT_MAX, 0);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Remove("a")->HasError());
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Remove("b")->HasError());
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(empty));
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSettingsQuotaTest, SmallMaxKeys) {
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue settings;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStorage(UINT_MAX, UINT_MAX, 1);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("a", byte_value_1_->DeepCopy());
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should be able to set existing key to other value without going over quota.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(DEFAULTS, "a", *byte_value_16_)->HasError());
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("a", byte_value_16_->DeepCopy());
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(storage_->Set(DEFAULTS, "b", *byte_value_16_)->HasError());
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(storage_->Set(DEFAULTS, "c", *byte_value_256_)->HasError());
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSettingsQuotaTest, MediumMaxKeys) {
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue settings;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStorage(UINT_MAX, UINT_MAX, 2);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue to_set;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  to_set.Set("a", byte_value_1_->DeepCopy());
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  to_set.Set("b", byte_value_16_->DeepCopy());
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(DEFAULTS, to_set)->HasError());
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("a", byte_value_1_->DeepCopy());
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("b", byte_value_16_->DeepCopy());
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should be able to set existing keys to other values without going over
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // quota.
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  to_set.Set("a", byte_value_16_->DeepCopy());
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(DEFAULTS, to_set)->HasError());
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("a", byte_value_16_->DeepCopy());
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(storage_->Set(DEFAULTS, "c", *byte_value_256_)->HasError());
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSettingsQuotaTest, RemovingExistingSettings) {
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue settings;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStorage(266, UINT_MAX, 2);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage_->Set(DEFAULTS, "b", *byte_value_16_);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("b", byte_value_16_->DeepCopy());
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Not enough quota.
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage_->Set(DEFAULTS, "c", *byte_value_256_);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try again with "b" removed, enough quota.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Remove("b")->HasError());
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Remove("b", NULL);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(DEFAULTS, "c", *byte_value_256_)->HasError());
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("c", byte_value_256_->DeepCopy());
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enough byte quota but max keys not high enough.
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("a", byte_value_1_->DeepCopy());
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(storage_->Set(DEFAULTS, "b", *byte_value_1_)->HasError());
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Back under max keys.
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Remove("a")->HasError());
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Remove("a", NULL);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(DEFAULTS, "b", *byte_value_1_)->HasError());
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("b", byte_value_1_->DeepCopy());
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSettingsQuotaTest, RemovingNonexistentSettings) {
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue settings;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStorage(36, UINT_MAX, 3);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Max out bytes.
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue to_set;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  to_set.Set("b1", byte_value_16_->DeepCopy());
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  to_set.Set("b2", byte_value_16_->DeepCopy());
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage_->Set(DEFAULTS, to_set);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("b1", byte_value_16_->DeepCopy());
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("b2", byte_value_16_->DeepCopy());
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove some settings that don't exist.
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> to_remove;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  to_remove.push_back("a1");
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  to_remove.push_back("a2");
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Remove(to_remove)->HasError());
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Remove("b")->HasError());
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Still no quota.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Max out key count.
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  to_set.Clear();
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  to_set.Set("b1", byte_value_1_->DeepCopy());
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  to_set.Set("b2", byte_value_1_->DeepCopy());
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage_->Set(DEFAULTS, to_set);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("b1", byte_value_1_->DeepCopy());
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("b2", byte_value_1_->DeepCopy());
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage_->Set(DEFAULTS, "b3", *byte_value_1_);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("b3", byte_value_1_->DeepCopy());
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove some settings that don't exist.
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  to_remove.clear();
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  to_remove.push_back("a1");
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  to_remove.push_back("a2");
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Remove(to_remove)->HasError());
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Remove("b")->HasError());
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Still no quota.
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSettingsQuotaTest, Clear) {
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue settings;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStorage(40, UINT_MAX, 5);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test running out of byte quota.
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue to_set;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to_set.Set("a", byte_value_16_->DeepCopy());
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to_set.Set("b", byte_value_16_->DeepCopy());
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(storage_->Set(DEFAULTS, to_set)->HasError());
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(storage_->Set(DEFAULTS, "c", *byte_value_16_)->HasError());
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(storage_->Clear()->HasError());
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // (repeat)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(storage_->Set(DEFAULTS, to_set)->HasError());
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(storage_->Set(DEFAULTS, "c", *byte_value_16_)->HasError());
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test reaching max keys.
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage_->Clear();
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue to_set;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to_set.Set("a", byte_value_1_->DeepCopy());
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to_set.Set("b", byte_value_1_->DeepCopy());
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to_set.Set("c", byte_value_1_->DeepCopy());
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to_set.Set("d", byte_value_1_->DeepCopy());
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to_set.Set("e", byte_value_1_->DeepCopy());
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(storage_->Set(DEFAULTS, to_set)->HasError());
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(storage_->Set(DEFAULTS, "f", *byte_value_1_)->HasError());
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    storage_->Clear();
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // (repeat)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(storage_->Set(DEFAULTS, to_set)->HasError());
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(storage_->Set(DEFAULTS, "f", *byte_value_1_)->HasError());
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSettingsQuotaTest, ChangingUsedBytesWithSet) {
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue settings;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStorage(20, UINT_MAX, UINT_MAX);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Change a setting to make it go over quota.
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage_->Set(DEFAULTS, "a", *byte_value_16_);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("a", byte_value_16_->DeepCopy());
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_256_)->HasError());
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Change a setting to reduce usage and room for another setting.
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(storage_->Set(DEFAULTS, "foobar", *byte_value_1_)->HasError());
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage_->Set(DEFAULTS, "a", *byte_value_1_);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("a", byte_value_1_->DeepCopy());
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(DEFAULTS, "foobar", *byte_value_1_)->HasError());
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("foobar", byte_value_1_->DeepCopy());
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSettingsQuotaTest, SetsOnlyEntirelyCompletedWithByteQuota) {
3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue settings;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStorage(40, UINT_MAX, UINT_MAX);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage_->Set(DEFAULTS, "a", *byte_value_16_);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("a", byte_value_16_->DeepCopy());
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The entire change is over quota.
3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue to_set;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  to_set.Set("b", byte_value_16_->DeepCopy());
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  to_set.Set("c", byte_value_16_->DeepCopy());
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(storage_->Set(DEFAULTS, to_set)->HasError());
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The entire change is over quota, but quota reduced in existing key.
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  to_set.Set("a", byte_value_1_->DeepCopy());
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(DEFAULTS, to_set)->HasError());
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("a", byte_value_1_->DeepCopy());
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("b", byte_value_16_->DeepCopy());
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("c", byte_value_16_->DeepCopy());
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSettingsQuotaTest, SetsOnlyEntireCompletedWithMaxKeys) {
3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue settings;
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStorage(UINT_MAX, UINT_MAX, 2);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage_->Set(DEFAULTS, "a", *byte_value_1_);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("a", byte_value_1_->DeepCopy());
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue to_set;
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  to_set.Set("b", byte_value_16_->DeepCopy());
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  to_set.Set("c", byte_value_16_->DeepCopy());
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(storage_->Set(DEFAULTS, to_set)->HasError());
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSettingsQuotaTest, WithInitialDataAndByteQuota) {
3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue settings;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->Set(DEFAULTS, "a", *byte_value_256_);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("a", byte_value_256_->DeepCopy());
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStorage(280, UINT_MAX, UINT_MAX);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add some data.
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(DEFAULTS, "b", *byte_value_16_)->HasError());
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("b", byte_value_16_->DeepCopy());
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Not enough quota.
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(storage_->Set(DEFAULTS, "c", *byte_value_16_)->HasError());
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reduce usage of original setting so that "c" can fit.
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(DEFAULTS, "a", *byte_value_16_)->HasError());
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("a", byte_value_16_->DeepCopy());
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(DEFAULTS, "c", *byte_value_16_)->HasError());
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("c", byte_value_16_->DeepCopy());
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove to free up some more data.
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(storage_->Set(DEFAULTS, "d", *byte_value_256_)->HasError());
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> to_remove;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  to_remove.push_back("a");
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  to_remove.push_back("b");
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage_->Remove(to_remove);
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Remove("a", NULL);
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Remove("b", NULL);
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(DEFAULTS, "d", *byte_value_256_)->HasError());
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("d", byte_value_256_->DeepCopy());
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSettingsQuotaTest, WithInitialDataAndMaxKeys) {
4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue settings;
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->Set(DEFAULTS, "a", *byte_value_1_);
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("a", byte_value_1_->DeepCopy());
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStorage(UINT_MAX, UINT_MAX, 2);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(DEFAULTS, "b", *byte_value_1_)->HasError());
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("b", byte_value_1_->DeepCopy());
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(storage_->Set(DEFAULTS, "c", *byte_value_1_)->HasError());
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSettingsQuotaTest, InitiallyOverByteQuota) {
4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue settings;
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("a", byte_value_16_->DeepCopy());
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("b", byte_value_16_->DeepCopy());
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("c", byte_value_16_->DeepCopy());
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->Set(DEFAULTS, settings);
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStorage(40, UINT_MAX, UINT_MAX);
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(storage_->Set(DEFAULTS, "d", *byte_value_16_)->HasError());
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Take under quota by reducing size of an existing setting
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("a", byte_value_1_->DeepCopy());
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should be able set another small setting.
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(DEFAULTS, "d", *byte_value_1_)->HasError());
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("d", byte_value_1_->DeepCopy());
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSettingsQuotaTest, InitiallyOverMaxKeys) {
4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue settings;
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("a", byte_value_16_->DeepCopy());
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("b", byte_value_16_->DeepCopy());
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("c", byte_value_16_->DeepCopy());
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->Set(DEFAULTS, settings);
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStorage(UINT_MAX, UINT_MAX, 2);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Can't set either an existing or new setting.
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(storage_->Set(DEFAULTS, "d", *byte_value_16_)->HasError());
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should be able after removing 2.
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage_->Remove("a");
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Remove("a", NULL);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage_->Remove("b");
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Remove("b", NULL);
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(DEFAULTS, "e", *byte_value_1_)->HasError());
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("e", byte_value_1_->DeepCopy());
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Still can't set any.
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(storage_->Set(DEFAULTS, "d", *byte_value_16_)->HasError());
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSettingsQuotaTest, ZeroQuotaBytesPerSetting) {
4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue empty;
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStorage(UINT_MAX, 0, UINT_MAX);
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Remove("a")->HasError());
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Remove("b")->HasError());
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(empty));
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSettingsQuotaTest, QuotaBytesPerSetting) {
4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue settings;
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStorage(UINT_MAX, 20, UINT_MAX);
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(DEFAULTS, "a", *byte_value_16_)->HasError());
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("a", byte_value_16_->DeepCopy());
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_256_)->HasError());
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(DEFAULTS, "b", *byte_value_1_)->HasError());
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(DEFAULTS, "b", *byte_value_16_)->HasError());
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("b", byte_value_16_->DeepCopy());
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(storage_->Set(DEFAULTS, "b", *byte_value_256_)->HasError());
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSettingsQuotaTest, QuotaBytesPerSettingWithInitialSettings) {
5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue settings;
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->Set(DEFAULTS, "a", *byte_value_1_);
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->Set(DEFAULTS, "b", *byte_value_16_);
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->Set(DEFAULTS, "c", *byte_value_256_);
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStorage(UINT_MAX, 20, UINT_MAX);
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(DEFAULTS, "a", *byte_value_1_)->HasError());
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(DEFAULTS, "a", *byte_value_16_)->HasError());
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("a", byte_value_16_->DeepCopy());
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(storage_->Set(DEFAULTS, "a", *byte_value_256_)->HasError());
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(DEFAULTS, "b", *byte_value_1_)->HasError());
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(DEFAULTS, "b", *byte_value_16_)->HasError());
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("b", byte_value_16_->DeepCopy());
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(storage_->Set(DEFAULTS, "b", *byte_value_256_)->HasError());
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(DEFAULTS, "c", *byte_value_1_)->HasError());
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(DEFAULTS, "c", *byte_value_16_)->HasError());
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("c", byte_value_16_->DeepCopy());
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(storage_->Set(DEFAULTS, "c", *byte_value_256_)->HasError());
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSettingsQuotaTest,
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuotaBytesPerSettingWithInitialSettingsForced) {
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is a lazy test to make sure IGNORE_QUOTA lets through changes: the
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // test above copied, but using IGNORE_QUOTA and asserting nothing is ever
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // rejected...
5355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue settings;
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->Set(DEFAULTS, "a", *byte_value_1_);
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->Set(DEFAULTS, "b", *byte_value_16_);
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->Set(DEFAULTS, "c", *byte_value_256_);
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStorage(UINT_MAX, 20, UINT_MAX);
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(IGNORE_QUOTA, "a", *byte_value_1_)->HasError());
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(IGNORE_QUOTA, "a", *byte_value_16_)->HasError());
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(IGNORE_QUOTA, "a", *byte_value_256_)->HasError());
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("a", byte_value_256_->DeepCopy());
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(IGNORE_QUOTA, "b", *byte_value_1_)->HasError());
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(IGNORE_QUOTA, "b", *byte_value_16_)->HasError());
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(IGNORE_QUOTA, "b", *byte_value_256_)->HasError());
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("b", byte_value_256_->DeepCopy());
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(IGNORE_QUOTA, "c", *byte_value_1_)->HasError());
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(storage_->Set(IGNORE_QUOTA, "c", *byte_value_16_)->HasError());
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("c", byte_value_16_->DeepCopy());
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ... except the last.  Make sure it can still fail.
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(storage_->Set(DEFAULTS, "c", *byte_value_256_)->HasError());
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SettingsEqual(settings));
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSettingsQuotaTest, GetBytesInUse) {
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Just testing GetBytesInUse, no need for a quota.
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStorage(UINT_MAX, UINT_MAX, UINT_MAX);
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> ab;
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ab.push_back("a");
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ab.push_back("b");
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, storage_->GetBytesInUse());
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, storage_->GetBytesInUse("a"));
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, storage_->GetBytesInUse("b"));
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, storage_->GetBytesInUse(ab));
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage_->Set(DEFAULTS, "a", *byte_value_1_);
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, storage_->GetBytesInUse());
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, storage_->GetBytesInUse("a"));
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, storage_->GetBytesInUse("b"));
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, storage_->GetBytesInUse(ab));
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage_->Set(DEFAULTS, "b", *byte_value_1_);
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4u, storage_->GetBytesInUse());
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, storage_->GetBytesInUse("a"));
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, storage_->GetBytesInUse("b"));
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4u, storage_->GetBytesInUse(ab));
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage_->Set(DEFAULTS, "c", *byte_value_1_);
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(6u, storage_->GetBytesInUse());
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, storage_->GetBytesInUse("a"));
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, storage_->GetBytesInUse("b"));
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4u, storage_->GetBytesInUse(ab));
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
598