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