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