| Index: webkit/dom_storage/dom_storage_cached_area_unittest.cc
|
| ===================================================================
|
| --- webkit/dom_storage/dom_storage_cached_area_unittest.cc (revision 203766)
|
| +++ webkit/dom_storage/dom_storage_cached_area_unittest.cc (working copy)
|
| @@ -1,349 +0,0 @@
|
| -// Copyright (c) 2012 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 <list>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/utf_string_conversions.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -#include "webkit/dom_storage/dom_storage_cached_area.h"
|
| -#include "webkit/dom_storage/dom_storage_proxy.h"
|
| -
|
| -namespace dom_storage {
|
| -
|
| -namespace {
|
| -// A mock implementation of the DomStorageProxy interface.
|
| -class MockProxy : public DomStorageProxy {
|
| - public:
|
| - MockProxy() {
|
| - ResetObservations();
|
| - }
|
| -
|
| - // DomStorageProxy interface for use by DomStorageCachedArea.
|
| -
|
| - virtual void LoadArea(int connection_id, ValuesMap* values,
|
| - const CompletionCallback& callback) OVERRIDE {
|
| - pending_callbacks_.push_back(callback);
|
| - observed_load_area_ = true;
|
| - observed_connection_id_ = connection_id;
|
| - *values = load_area_return_values_;
|
| - }
|
| -
|
| - virtual void SetItem(int connection_id, const base::string16& key,
|
| - const base::string16& value, const GURL& page_url,
|
| - const CompletionCallback& callback) OVERRIDE {
|
| - pending_callbacks_.push_back(callback);
|
| - observed_set_item_ = true;
|
| - observed_connection_id_ = connection_id;
|
| - observed_key_ = key;
|
| - observed_value_ = value;
|
| - observed_page_url_ = page_url;
|
| - }
|
| -
|
| - virtual void RemoveItem(int connection_id, const base::string16& key,
|
| - const GURL& page_url,
|
| - const CompletionCallback& callback) OVERRIDE {
|
| - pending_callbacks_.push_back(callback);
|
| - observed_remove_item_ = true;
|
| - observed_connection_id_ = connection_id;
|
| - observed_key_ = key;
|
| - observed_page_url_ = page_url;
|
| - }
|
| -
|
| - virtual void ClearArea(int connection_id,
|
| - const GURL& page_url,
|
| - const CompletionCallback& callback) OVERRIDE {
|
| - pending_callbacks_.push_back(callback);
|
| - observed_clear_area_ = true;
|
| - observed_connection_id_ = connection_id;
|
| - observed_page_url_ = page_url;
|
| - }
|
| -
|
| - // Methods and members for use by test fixtures.
|
| -
|
| - void ResetObservations() {
|
| - observed_load_area_ = false;
|
| - observed_set_item_ = false;
|
| - observed_remove_item_ = false;
|
| - observed_clear_area_ = false;
|
| - observed_connection_id_ = 0;
|
| - observed_key_.clear();
|
| - observed_value_.clear();
|
| - observed_page_url_ = GURL();
|
| - }
|
| -
|
| - void CompleteAllPendingCallbacks() {
|
| - while (!pending_callbacks_.empty())
|
| - CompleteOnePendingCallback(true);
|
| - }
|
| -
|
| - void CompleteOnePendingCallback(bool success) {
|
| - ASSERT_TRUE(!pending_callbacks_.empty());
|
| - pending_callbacks_.front().Run(success);
|
| - pending_callbacks_.pop_front();
|
| - }
|
| -
|
| - typedef std::list<CompletionCallback> CallbackList;
|
| -
|
| - ValuesMap load_area_return_values_;
|
| - CallbackList pending_callbacks_;
|
| - bool observed_load_area_;
|
| - bool observed_set_item_;
|
| - bool observed_remove_item_;
|
| - bool observed_clear_area_;
|
| - int observed_connection_id_;
|
| - base::string16 observed_key_;
|
| - base::string16 observed_value_;
|
| - GURL observed_page_url_;
|
| -
|
| - private:
|
| - virtual ~MockProxy() {}
|
| -};
|
| -} // namespace
|
| -
|
| -class DomStorageCachedAreaTest : public testing::Test {
|
| - public:
|
| - DomStorageCachedAreaTest()
|
| - : kNamespaceId(10),
|
| - kOrigin("http://dom_storage/"),
|
| - kKey(ASCIIToUTF16("key")),
|
| - kValue(ASCIIToUTF16("value")),
|
| - kPageUrl("http://dom_storage/page") {
|
| - }
|
| -
|
| - const int64 kNamespaceId;
|
| - const GURL kOrigin;
|
| - const base::string16 kKey;
|
| - const base::string16 kValue;
|
| - const GURL kPageUrl;
|
| -
|
| - virtual void SetUp() {
|
| - mock_proxy_ = new MockProxy();
|
| - }
|
| -
|
| - bool IsPrimed(DomStorageCachedArea* cached_area) {
|
| - return cached_area->map_.get();
|
| - }
|
| -
|
| - bool IsIgnoringAllMutations(DomStorageCachedArea* cached_area) {
|
| - return cached_area->ignore_all_mutations_;
|
| - }
|
| -
|
| - bool IsIgnoringKeyMutations(DomStorageCachedArea* cached_area,
|
| - const base::string16& key) {
|
| - return cached_area->should_ignore_key_mutation(key);
|
| - }
|
| -
|
| - void ResetAll(DomStorageCachedArea* cached_area) {
|
| - cached_area->Reset();
|
| - mock_proxy_->ResetObservations();
|
| - mock_proxy_->pending_callbacks_.clear();
|
| - }
|
| -
|
| - void ResetCacheOnly(DomStorageCachedArea* cached_area) {
|
| - cached_area->Reset();
|
| - }
|
| -
|
| - protected:
|
| - scoped_refptr<MockProxy> mock_proxy_;
|
| -};
|
| -
|
| -TEST_F(DomStorageCachedAreaTest, Basics) {
|
| - EXPECT_TRUE(mock_proxy_->HasOneRef());
|
| - scoped_refptr<DomStorageCachedArea> cached_area =
|
| - new DomStorageCachedArea(kNamespaceId, kOrigin, mock_proxy_.get());
|
| - EXPECT_EQ(kNamespaceId, cached_area->namespace_id());
|
| - EXPECT_EQ(kOrigin, cached_area->origin());
|
| - EXPECT_FALSE(mock_proxy_->HasOneRef());
|
| - cached_area->ApplyMutation(NullableString16(kKey, false),
|
| - NullableString16(kValue, false));
|
| - EXPECT_FALSE(IsPrimed(cached_area.get()));
|
| -
|
| - ResetAll(cached_area.get());
|
| - EXPECT_EQ(kNamespaceId, cached_area->namespace_id());
|
| - EXPECT_EQ(kOrigin, cached_area->origin());
|
| -
|
| - const int kConnectionId = 1;
|
| - EXPECT_EQ(0u, cached_area->GetLength(kConnectionId));
|
| - EXPECT_TRUE(cached_area->SetItem(kConnectionId, kKey, kValue, kPageUrl));
|
| - EXPECT_EQ(1u, cached_area->GetLength(kConnectionId));
|
| - EXPECT_EQ(kKey, cached_area->GetKey(kConnectionId, 0).string());
|
| - EXPECT_EQ(kValue, cached_area->GetItem(kConnectionId, kKey).string());
|
| - cached_area->RemoveItem(kConnectionId, kKey, kPageUrl);
|
| - EXPECT_EQ(0u, cached_area->GetLength(kConnectionId));
|
| -}
|
| -
|
| -TEST_F(DomStorageCachedAreaTest, Getters) {
|
| - const int kConnectionId = 7;
|
| - scoped_refptr<DomStorageCachedArea> cached_area =
|
| - new DomStorageCachedArea(kNamespaceId, kOrigin, mock_proxy_.get());
|
| -
|
| - // GetLength, we expect to see one call to load in the proxy.
|
| - EXPECT_FALSE(IsPrimed(cached_area.get()));
|
| - EXPECT_EQ(0u, cached_area->GetLength(kConnectionId));
|
| - EXPECT_TRUE(IsPrimed(cached_area.get()));
|
| - EXPECT_TRUE(mock_proxy_->observed_load_area_);
|
| - EXPECT_EQ(kConnectionId, mock_proxy_->observed_connection_id_);
|
| - EXPECT_EQ(1u, mock_proxy_->pending_callbacks_.size());
|
| - EXPECT_TRUE(IsIgnoringAllMutations(cached_area.get()));
|
| - mock_proxy_->CompleteAllPendingCallbacks();
|
| - EXPECT_FALSE(IsIgnoringAllMutations(cached_area.get()));
|
| -
|
| - // GetKey, expect the one call to load.
|
| - ResetAll(cached_area.get());
|
| - EXPECT_FALSE(IsPrimed(cached_area.get()));
|
| - EXPECT_TRUE(cached_area->GetKey(kConnectionId, 2).is_null());
|
| - EXPECT_TRUE(IsPrimed(cached_area.get()));
|
| - EXPECT_TRUE(mock_proxy_->observed_load_area_);
|
| - EXPECT_EQ(kConnectionId, mock_proxy_->observed_connection_id_);
|
| - EXPECT_EQ(1u, mock_proxy_->pending_callbacks_.size());
|
| -
|
| - // GetItem, ditto.
|
| - ResetAll(cached_area.get());
|
| - EXPECT_FALSE(IsPrimed(cached_area.get()));
|
| - EXPECT_TRUE(cached_area->GetItem(kConnectionId, kKey).is_null());
|
| - EXPECT_TRUE(IsPrimed(cached_area.get()));
|
| - EXPECT_TRUE(mock_proxy_->observed_load_area_);
|
| - EXPECT_EQ(kConnectionId, mock_proxy_->observed_connection_id_);
|
| - EXPECT_EQ(1u, mock_proxy_->pending_callbacks_.size());
|
| -}
|
| -
|
| -TEST_F(DomStorageCachedAreaTest, Setters) {
|
| - const int kConnectionId = 7;
|
| - scoped_refptr<DomStorageCachedArea> cached_area =
|
| - new DomStorageCachedArea(kNamespaceId, kOrigin, mock_proxy_.get());
|
| -
|
| - // SetItem, we expect a call to load followed by a call to set item
|
| - // in the proxy.
|
| - EXPECT_FALSE(IsPrimed(cached_area.get()));
|
| - EXPECT_TRUE(cached_area->SetItem(kConnectionId, kKey, kValue, kPageUrl));
|
| - EXPECT_TRUE(IsPrimed(cached_area.get()));
|
| - EXPECT_TRUE(mock_proxy_->observed_load_area_);
|
| - EXPECT_TRUE(mock_proxy_->observed_set_item_);
|
| - EXPECT_EQ(kConnectionId, mock_proxy_->observed_connection_id_);
|
| - EXPECT_EQ(kPageUrl, mock_proxy_->observed_page_url_);
|
| - EXPECT_EQ(kKey, mock_proxy_->observed_key_);
|
| - EXPECT_EQ(kValue, mock_proxy_->observed_value_);
|
| - EXPECT_EQ(2u, mock_proxy_->pending_callbacks_.size());
|
| -
|
| - // Clear, we expect a just the one call to clear in the proxy since
|
| - // there's no need to load the data prior to deleting it.
|
| - ResetAll(cached_area.get());
|
| - EXPECT_FALSE(IsPrimed(cached_area.get()));
|
| - cached_area->Clear(kConnectionId, kPageUrl);
|
| - EXPECT_TRUE(IsPrimed(cached_area.get()));
|
| - EXPECT_TRUE(mock_proxy_->observed_clear_area_);
|
| - EXPECT_EQ(kConnectionId, mock_proxy_->observed_connection_id_);
|
| - EXPECT_EQ(kPageUrl, mock_proxy_->observed_page_url_);
|
| - EXPECT_EQ(1u, mock_proxy_->pending_callbacks_.size());
|
| -
|
| - // RemoveItem with nothing to remove, expect just one call to load.
|
| - ResetAll(cached_area.get());
|
| - EXPECT_FALSE(IsPrimed(cached_area.get()));
|
| - cached_area->RemoveItem(kConnectionId, kKey, kPageUrl);
|
| - EXPECT_TRUE(IsPrimed(cached_area.get()));
|
| - EXPECT_TRUE(mock_proxy_->observed_load_area_);
|
| - EXPECT_FALSE(mock_proxy_->observed_remove_item_);
|
| - EXPECT_EQ(kConnectionId, mock_proxy_->observed_connection_id_);
|
| - EXPECT_EQ(1u, mock_proxy_->pending_callbacks_.size());
|
| -
|
| - // RemoveItem with something to remove, expect a call to load followed
|
| - // by a call to remove.
|
| - ResetAll(cached_area.get());
|
| - mock_proxy_->load_area_return_values_[kKey] = NullableString16(kValue, false);
|
| - EXPECT_FALSE(IsPrimed(cached_area.get()));
|
| - cached_area->RemoveItem(kConnectionId, kKey, kPageUrl);
|
| - EXPECT_TRUE(IsPrimed(cached_area.get()));
|
| - EXPECT_TRUE(mock_proxy_->observed_load_area_);
|
| - EXPECT_TRUE(mock_proxy_->observed_remove_item_);
|
| - EXPECT_EQ(kConnectionId, mock_proxy_->observed_connection_id_);
|
| - EXPECT_EQ(kPageUrl, mock_proxy_->observed_page_url_);
|
| - EXPECT_EQ(kKey, mock_proxy_->observed_key_);
|
| - EXPECT_EQ(2u, mock_proxy_->pending_callbacks_.size());
|
| -}
|
| -
|
| -TEST_F(DomStorageCachedAreaTest, MutationsAreIgnoredUntilLoadCompletion) {
|
| - const int kConnectionId = 7;
|
| - scoped_refptr<DomStorageCachedArea> cached_area =
|
| - new DomStorageCachedArea(kNamespaceId, kOrigin, mock_proxy_.get());
|
| - EXPECT_TRUE(cached_area->GetItem(kConnectionId, kKey).is_null());
|
| - EXPECT_TRUE(IsPrimed(cached_area.get()));
|
| - EXPECT_TRUE(IsIgnoringAllMutations(cached_area.get()));
|
| -
|
| - // Before load completion, the mutation should be ignored.
|
| - cached_area->ApplyMutation(NullableString16(kKey, false),
|
| - NullableString16(kValue, false));
|
| - EXPECT_TRUE(cached_area->GetItem(kConnectionId, kKey).is_null());
|
| -
|
| - // Call the load completion callback.
|
| - mock_proxy_->CompleteOnePendingCallback(true);
|
| - EXPECT_FALSE(IsIgnoringAllMutations(cached_area.get()));
|
| -
|
| - // Verify that mutations are now applied.
|
| - cached_area->ApplyMutation(NullableString16(kKey, false),
|
| - NullableString16(kValue, false));
|
| - EXPECT_EQ(kValue, cached_area->GetItem(kConnectionId, kKey).string());
|
| -}
|
| -
|
| -TEST_F(DomStorageCachedAreaTest, MutationsAreIgnoredUntilClearCompletion) {
|
| - const int kConnectionId = 4;
|
| - scoped_refptr<DomStorageCachedArea> cached_area =
|
| - new DomStorageCachedArea(kNamespaceId, kOrigin, mock_proxy_.get());
|
| - cached_area->Clear(kConnectionId, kPageUrl);
|
| - EXPECT_TRUE(IsIgnoringAllMutations(cached_area.get()));
|
| - mock_proxy_->CompleteOnePendingCallback(true);
|
| - EXPECT_FALSE(IsIgnoringAllMutations(cached_area.get()));
|
| -
|
| - // Verify that calling Clear twice works as expected, the first
|
| - // completion callback should have been cancelled.
|
| - ResetCacheOnly(cached_area.get());
|
| - cached_area->Clear(kConnectionId, kPageUrl);
|
| - EXPECT_TRUE(IsIgnoringAllMutations(cached_area.get()));
|
| - cached_area->Clear(kConnectionId, kPageUrl);
|
| - EXPECT_TRUE(IsIgnoringAllMutations(cached_area.get()));
|
| - mock_proxy_->CompleteOnePendingCallback(true);
|
| - EXPECT_TRUE(IsIgnoringAllMutations(cached_area.get()));
|
| - mock_proxy_->CompleteOnePendingCallback(true);
|
| - EXPECT_FALSE(IsIgnoringAllMutations(cached_area.get()));
|
| -}
|
| -
|
| -TEST_F(DomStorageCachedAreaTest, KeyMutationsAreIgnoredUntilCompletion) {
|
| - const int kConnectionId = 8;
|
| - scoped_refptr<DomStorageCachedArea> cached_area =
|
| - new DomStorageCachedArea(kNamespaceId, kOrigin, mock_proxy_.get());
|
| -
|
| - // SetItem
|
| - EXPECT_TRUE(cached_area->SetItem(kConnectionId, kKey, kValue, kPageUrl));
|
| - mock_proxy_->CompleteOnePendingCallback(true); // load completion
|
| - EXPECT_FALSE(IsIgnoringAllMutations(cached_area.get()));
|
| - EXPECT_TRUE(IsIgnoringKeyMutations(cached_area.get(), kKey));
|
| - cached_area->ApplyMutation(NullableString16(kKey, false),
|
| - NullableString16(true));
|
| - EXPECT_EQ(kValue, cached_area->GetItem(kConnectionId, kKey).string());
|
| - mock_proxy_->CompleteOnePendingCallback(true); // set completion
|
| - EXPECT_FALSE(IsIgnoringKeyMutations(cached_area.get(), kKey));
|
| -
|
| - // RemoveItem
|
| - cached_area->RemoveItem(kConnectionId, kKey, kPageUrl);
|
| - EXPECT_TRUE(IsIgnoringKeyMutations(cached_area.get(), kKey));
|
| - mock_proxy_->CompleteOnePendingCallback(true); // remove completion
|
| - EXPECT_FALSE(IsIgnoringKeyMutations(cached_area.get(), kKey));
|
| -
|
| - // Multiple mutations to the same key.
|
| - EXPECT_TRUE(cached_area->SetItem(kConnectionId, kKey, kValue, kPageUrl));
|
| - cached_area->RemoveItem(kConnectionId, kKey, kPageUrl);
|
| - EXPECT_TRUE(IsIgnoringKeyMutations(cached_area.get(), kKey));
|
| - mock_proxy_->CompleteOnePendingCallback(true); // set completion
|
| - EXPECT_TRUE(IsIgnoringKeyMutations(cached_area.get(), kKey));
|
| - mock_proxy_->CompleteOnePendingCallback(true); // remove completion
|
| - EXPECT_FALSE(IsIgnoringKeyMutations(cached_area.get(), kKey));
|
| -
|
| - // A failed set item operation should Reset the cache.
|
| - EXPECT_TRUE(cached_area->SetItem(kConnectionId, kKey, kValue, kPageUrl));
|
| - EXPECT_TRUE(IsIgnoringKeyMutations(cached_area.get(), kKey));
|
| - mock_proxy_->CompleteOnePendingCallback(false);
|
| - EXPECT_FALSE(IsPrimed(cached_area.get()));
|
| -}
|
| -
|
| -} // namespace dom_storage
|
|
|