1 // Copyright 2014 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 "extensions/browser/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 598