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