diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/modules/storage/storage_area_map_test.cc')
-rw-r--r-- | chromium/third_party/blink/renderer/modules/storage/storage_area_map_test.cc | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/chromium/third_party/blink/renderer/modules/storage/storage_area_map_test.cc b/chromium/third_party/blink/renderer/modules/storage/storage_area_map_test.cc new file mode 100644 index 00000000000..671720b9cd2 --- /dev/null +++ b/chromium/third_party/blink/renderer/modules/storage/storage_area_map_test.cc @@ -0,0 +1,132 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/modules/storage/storage_area_map.h" + +#include "testing/gtest/include/gtest/gtest.h" + +namespace blink { + +TEST(StorageAreaMapTest, Basics) { + const String kKey("key"); + const String kValue("value"); + const size_t kValueQuota = kValue.length() * 2; + const size_t kItemQuota = (kKey.length() + kValue.length()) * 2; + const String kKey2("key2"); + const size_t kKey2Quota = kKey2.length() * 2; + const String kValue2("value2"); + const size_t kItem2Quota = (kKey2.length() + kValue2.length()) * 2; + const size_t kQuota = 1024; // 1K quota for this test. + + StorageAreaMap map(kQuota); + String old_value; + EXPECT_EQ(kQuota, map.quota()); + + // Check the behavior of an empty map. + EXPECT_EQ(0u, map.GetLength()); + EXPECT_TRUE(map.GetKey(0).IsNull()); + EXPECT_TRUE(map.GetKey(100).IsNull()); + EXPECT_TRUE(map.GetItem(kKey).IsNull()); + EXPECT_FALSE(map.RemoveItem(kKey, nullptr)); + EXPECT_EQ(0u, map.quota_used()); + + // Check the behavior of a map containing some values. + EXPECT_TRUE(map.SetItem(kKey, kValue, &old_value)); + EXPECT_TRUE(old_value.IsNull()); + EXPECT_EQ(1u, map.GetLength()); + EXPECT_EQ(kKey, map.GetKey(0)); + EXPECT_TRUE(map.GetKey(1).IsNull()); + EXPECT_EQ(kValue, map.GetItem(kKey)); + EXPECT_TRUE(map.GetItem(kKey2).IsNull()); + EXPECT_EQ(kItemQuota, map.quota_used()); + EXPECT_TRUE(map.RemoveItem(kKey, &old_value)); + EXPECT_EQ(kValue, old_value); + old_value = String(); + EXPECT_EQ(0u, map.quota_used()); + + EXPECT_TRUE(map.SetItem(kKey, kValue, nullptr)); + EXPECT_TRUE(map.SetItem(kKey2, kValue, nullptr)); + EXPECT_EQ(kItemQuota + kKey2Quota + kValueQuota, map.quota_used()); + EXPECT_TRUE(map.SetItem(kKey2, kValue2, &old_value)); + EXPECT_EQ(kValue, old_value); + EXPECT_EQ(kItemQuota + kItem2Quota, map.quota_used()); + EXPECT_EQ(2u, map.GetLength()); + String key1 = map.GetKey(0); + String key2 = map.GetKey(1); + EXPECT_TRUE((key1 == kKey && key2 == kKey2) || + (key1 == kKey2 && key2 == kKey)) + << key1 << ", " << key2; + EXPECT_EQ(key1, map.GetKey(0)); + EXPECT_EQ(key2, map.GetKey(1)); + EXPECT_EQ(kItemQuota + kItem2Quota, map.quota_used()); +} + +TEST(StorageAreaMapTest, EnforcesQuota) { + const String kKey("test_key"); + const String kValue("test_value"); + const String kKey2("test_key_2"); + String old_value; + + // A 50 byte quota is too small to hold both keys and values, so we + // should see the StorageAreaMap enforcing it. + const size_t kQuota = 50; + + StorageAreaMap map(kQuota); + EXPECT_TRUE(map.SetItem(kKey, kValue, nullptr)); + EXPECT_FALSE(map.SetItem(kKey2, kValue, nullptr)); + EXPECT_EQ(1u, map.GetLength()); + EXPECT_EQ(kValue, map.GetItem(kKey)); + EXPECT_TRUE(map.GetItem(kKey2).IsNull()); + + EXPECT_TRUE(map.RemoveItem(kKey, nullptr)); + EXPECT_EQ(0u, map.GetLength()); + EXPECT_TRUE(map.SetItem(kKey2, kValue, nullptr)); + EXPECT_EQ(1u, map.GetLength()); + + // Verify that the SetItemIgnoringQuota method does not do quota checking. + map.SetItemIgnoringQuota(kKey, kValue); + EXPECT_GT(map.quota_used(), kQuota); + EXPECT_EQ(2u, map.GetLength()); + EXPECT_EQ(kValue, map.GetItem(kKey)); + EXPECT_EQ(kValue, map.GetItem(kKey2)); + + // When overbudget, a new value of greater size than the existing value can + // not be set, but a new value of lesser or equal size can be set. + EXPECT_TRUE(map.SetItem(kKey, kValue, nullptr)); + EXPECT_FALSE(map.SetItem(kKey, kValue + kValue, nullptr)); + EXPECT_TRUE(map.SetItem(kKey, "", nullptr)); + EXPECT_EQ("", map.GetItem(kKey)); + EXPECT_EQ(kValue, map.GetItem(kKey2)); +} + +TEST(StorageAreaMapTest, Iteration) { + const int kNumTestItems = 100; + const size_t kQuota = 102400; // 100K quota for this test. + StorageAreaMap map(kQuota); + + // Fill the map with some data. + for (int i = 0; i < kNumTestItems; ++i) + EXPECT_TRUE(map.SetItem("key" + String::Number(i), "val", nullptr)); + EXPECT_EQ(unsigned{kNumTestItems}, map.GetLength()); + + Vector<String> keys(kNumTestItems); + // Iterate over all keys. + for (int i = 0; i < kNumTestItems; ++i) + keys[i] = map.GetKey(i); + + // Now iterate over some subsets, and make sure the right keys are returned. + for (int i = 5; i < 15; ++i) + EXPECT_EQ(keys[i], map.GetKey(i)); + for (int i = kNumTestItems - 5; i >= kNumTestItems - 15; --i) + EXPECT_EQ(keys[i], map.GetKey(i)); + for (int i = 20; i >= 10; --i) + EXPECT_EQ(keys[i], map.GetKey(i)); + for (int i = 15; i < 20; ++i) + EXPECT_EQ(keys[i], map.GetKey(i)); + for (int i = kNumTestItems - 1; i >= 0; --i) + EXPECT_EQ(keys[i], map.GetKey(i)); + EXPECT_TRUE(map.GetKey(kNumTestItems).IsNull()); +} + +} // namespace blink |