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