Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(653)

Unified Diff: webkit/appcache/mock_appcache_storage_unittest.cc

Issue 300043: MockAppCacheStorage implemenation (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webkit/appcache/mock_appcache_storage_unittest.cc
===================================================================
--- webkit/appcache/mock_appcache_storage_unittest.cc (revision 0)
+++ webkit/appcache/mock_appcache_storage_unittest.cc (revision 0)
@@ -0,0 +1,358 @@
+// Copyright (c) 2009 The Chromium Authos. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/message_loop.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "webkit/appcache/appcache.h"
+#include "webkit/appcache/appcache_group.h"
+#include "webkit/appcache/appcache_response.h"
+#include "webkit/appcache/appcache_storage.h"
+#include "webkit/appcache/mock_appcache_service.h"
+
+namespace appcache {
+
+class MockAppCacheStorageTest : public testing::Test {
+ public:
+ class MockStorageDelegate : public AppCacheStorage::Delegate {
+ public:
+ explicit MockStorageDelegate()
+ : loaded_cache_id_(0), stored_group_success_(false),
+ obsoleted_success_(false), found_cache_id_(kNoCacheId) {
+ }
+
+ void OnCacheLoaded(AppCache* cache, int64 cache_id) {
+ loaded_cache_ = cache;
+ loaded_cache_id_ = cache_id;
+ }
+
+ void OnGroupLoaded(AppCacheGroup* group, const GURL& manifest_url) {
+ loaded_group_ = group;
+ loaded_manifest_url_ = manifest_url;
+ }
+
+ void OnGroupAndNewestCacheStored(AppCacheGroup* group, bool success) {
+ stored_group_ = group;
+ stored_group_success_ = success;
+ }
+
+ void OnGroupMadeObsolete(AppCacheGroup* group, bool success) {
+ obsoleted_group_ = group;
+ obsoleted_success_ = success;
+ }
+
+ void OnMainResponseFound(const GURL& url, const AppCacheEntry& entry,
+ int64 cache_id, const GURL& manifest_url) {
+ found_url_ = url;
+ found_entry_ = entry;
+ found_cache_id_ = cache_id;
+ found_manifest_url_ = manifest_url;
+ }
+
+ scoped_refptr<AppCache> loaded_cache_;
+ int64 loaded_cache_id_;
+ scoped_refptr<AppCacheGroup> loaded_group_;
+ GURL loaded_manifest_url_;
+ scoped_refptr<AppCacheGroup> stored_group_;
+ bool stored_group_success_;
+ scoped_refptr<AppCacheGroup> obsoleted_group_;
+ bool obsoleted_success_;
+ GURL found_url_;
+ AppCacheEntry found_entry_;
+ int64 found_cache_id_;
+ GURL found_manifest_url_;
+ };
+};
+
+
+TEST_F(MockAppCacheStorageTest, LoadCache_Miss) {
+ // Attempt to load a cache that doesn't exist. Should
+ // complete asyncly.
+ MockAppCacheService service;
+ MockStorageDelegate delegate;
+ service.storage()->LoadCache(111, &delegate);
+ EXPECT_NE(111, delegate.loaded_cache_id_);
+ MessageLoop::current()->RunAllPending(); // Do async task execution.
+ EXPECT_EQ(111, delegate.loaded_cache_id_);
+ EXPECT_FALSE(delegate.loaded_cache_);
+}
+
+TEST_F(MockAppCacheStorageTest, LoadCache_NearHit) {
+ // Attempt to load a cache that is currently in use
+ // and does not require loading from disk. This
+ // load should complete syncly.
+ MockAppCacheService service;
+
+ // Setup some preconditions. Make an 'unstored' cache for
+ // us to load. The ctor should put it in the working set.
+ int64 cache_id = service.storage()->NewCacheId();
+ scoped_refptr<AppCache> cache = new AppCache(&service, cache_id);
+
+ // Conduct the test.
+ MockStorageDelegate delegate;
+ service.storage()->LoadCache(cache_id, &delegate);
+ EXPECT_EQ(cache_id, delegate.loaded_cache_id_);
+ EXPECT_EQ(cache.get(), delegate.loaded_cache_.get());
+}
+
+TEST_F(MockAppCacheStorageTest, CreateGroup) {
+ // Attempt to load/create a group that doesn't exist.
+ // Should complete asyncly.
+ MockAppCacheService service;
+ MockAppCacheStorage* storage =
+ reinterpret_cast<MockAppCacheStorage*>(service.storage());
+ MockStorageDelegate delegate;
+ GURL manifest_url("http://blah/");
+ service.storage()->LoadOrCreateGroup(manifest_url, &delegate);
+ EXPECT_NE(manifest_url, delegate.loaded_manifest_url_);
+ EXPECT_FALSE(delegate.loaded_group_.get());
+ MessageLoop::current()->RunAllPending(); // Do async task execution.
+ EXPECT_EQ(manifest_url, delegate.loaded_manifest_url_);
+ EXPECT_TRUE(delegate.loaded_group_.get());
+ EXPECT_TRUE(delegate.loaded_group_->HasOneRef());
+ EXPECT_FALSE(delegate.loaded_group_->newest_complete_cache());
+ EXPECT_TRUE(storage->stored_groups_.empty());
+}
+
+TEST_F(MockAppCacheStorageTest, LoadGroup_NearHit) {
+ // Attempt to load a group that is currently in use
+ // and does not require loading from disk. This
+ // load should complete syncly.
+ MockAppCacheService service;
+ MockStorageDelegate delegate;
+
+ // Setup some preconditions. Create a group that appears
+ // to be "unstored" and "currently in use".
+ GURL manifest_url("http://blah/");
+ service.storage()->LoadOrCreateGroup(manifest_url, &delegate);
+ MessageLoop::current()->RunAllPending(); // Do async task execution.
+ EXPECT_EQ(manifest_url, delegate.loaded_manifest_url_);
+ EXPECT_TRUE(delegate.loaded_group_.get());
+
+ // Reset our delegate, and take a reference to the new group.
+ scoped_refptr<AppCacheGroup> group;
+ group.swap(delegate.loaded_group_);
+ delegate.loaded_manifest_url_ = GURL();
+
+ // Conduct the test.
+ service.storage()->LoadOrCreateGroup(manifest_url, &delegate);
+ EXPECT_EQ(manifest_url, delegate.loaded_manifest_url_);
+ EXPECT_EQ(group.get(), delegate.loaded_group_.get());
+}
+
+TEST_F(MockAppCacheStorageTest, LoadGroupAndCache_FarHit) {
+ // Attempt to load a cache that is not currently in use
+ // and does require loading from disk. This
+ // load should complete asyncly.
+ MockAppCacheService service;
+ MockAppCacheStorage* storage =
+ reinterpret_cast<MockAppCacheStorage*>(service.storage());
+
+ // Setup some preconditions. Create a group and newest cache that
+ // appears to be "stored" and "not currently in use".
+ GURL manifest_url("http://blah/");
+ scoped_refptr<AppCacheGroup> group =
+ new AppCacheGroup(&service, manifest_url);
+ int64 cache_id = storage->NewCacheId();
+ scoped_refptr<AppCache> cache = new AppCache(&service, cache_id);
+ cache->set_complete(true);
+ group->AddCache(cache);
+ storage->AddStoredGroup(group);
+ storage->AddStoredCache(cache);
+
+ // Drop the references from above so the only refs to these
+ // objects are from within the storage class. This is to make
+ // these objects appear as "not currently in use".
+ AppCache* cache_ptr = cache.get();
+ AppCacheGroup* group_ptr = group.get();
+ cache = NULL;
+ group = NULL;
+
+ // Setup a delegate to receive completion callbacks.
+ MockStorageDelegate delegate;
+
+ // Conduct the cache load test.
+ EXPECT_NE(cache_id, delegate.loaded_cache_id_);
+ EXPECT_NE(cache_ptr, delegate.loaded_cache_.get());
+ storage->LoadCache(cache_id, &delegate);
+ EXPECT_NE(cache_id, delegate.loaded_cache_id_);
+ EXPECT_NE(cache_ptr, delegate.loaded_cache_.get());
+ MessageLoop::current()->RunAllPending(); // Do async task execution.
+ EXPECT_EQ(cache_id, delegate.loaded_cache_id_);
+ EXPECT_EQ(cache_ptr, delegate.loaded_cache_.get());
+ delegate.loaded_cache_ = NULL;
+
+ // Conduct the group load test.
+ EXPECT_NE(manifest_url, delegate.loaded_manifest_url_);
+ EXPECT_FALSE(delegate.loaded_group_.get());
+ storage->LoadOrCreateGroup(manifest_url, &delegate);
+ EXPECT_NE(manifest_url, delegate.loaded_manifest_url_);
+ EXPECT_FALSE(delegate.loaded_group_.get());
+ MessageLoop::current()->RunAllPending(); // Do async task execution.
+ EXPECT_EQ(manifest_url, delegate.loaded_manifest_url_);
+ EXPECT_EQ(group_ptr, delegate.loaded_group_.get());
+}
+
+TEST_F(MockAppCacheStorageTest, StoreNewGroup) {
+ // Store a group and its newest cache. Should complete asyncly.
+ MockAppCacheService service;
+ MockAppCacheStorage* storage =
+ reinterpret_cast<MockAppCacheStorage*>(service.storage());
+
+ // Setup some preconditions. Create a group and newest cache that
+ // appears to be "unstored".
+ GURL manifest_url("http://blah/");
+ scoped_refptr<AppCacheGroup> group =
+ new AppCacheGroup(&service, manifest_url);
+ int64 cache_id = storage->NewCacheId();
+ scoped_refptr<AppCache> cache = new AppCache(&service, cache_id);
+ cache->set_complete(true);
+ group->AddCache(cache);
+ // Hold a ref to the cache simulate the UpdateJob holding that ref,
+ // and hold a ref to the group to simulate the CacheHost holding that ref.
+
+ // Conduct the store test.
+ MockStorageDelegate delegate;
+ EXPECT_TRUE(storage->stored_caches_.empty());
+ EXPECT_TRUE(storage->stored_groups_.empty());
+ storage->StoreGroupAndNewestCache(group, &delegate);
+ EXPECT_FALSE(delegate.stored_group_success_);
+ EXPECT_TRUE(storage->stored_caches_.empty());
+ EXPECT_TRUE(storage->stored_groups_.empty());
+ MessageLoop::current()->RunAllPending(); // Do async task execution.
+ EXPECT_TRUE(delegate.stored_group_success_);
+ EXPECT_FALSE(storage->stored_caches_.empty());
+ EXPECT_FALSE(storage->stored_groups_.empty());
+}
+
+TEST_F(MockAppCacheStorageTest, StoreExistingGroup) {
+ // Store a group and its newest cache. Should complete asyncly.
+ MockAppCacheService service;
+ MockAppCacheStorage* storage =
+ reinterpret_cast<MockAppCacheStorage*>(service.storage());
+
+ // Setup some preconditions. Create a group and old complete cache
+ // that appear to be "stored", and a newest unstored complete cache.
+ GURL manifest_url("http://blah/");
+ scoped_refptr<AppCacheGroup> group =
+ new AppCacheGroup(&service, manifest_url);
+ int64 old_cache_id = storage->NewCacheId();
+ scoped_refptr<AppCache> old_cache = new AppCache(&service, old_cache_id);
+ old_cache->set_complete(true);
+ group->AddCache(old_cache);
+ storage->AddStoredGroup(group);
+ storage->AddStoredCache(old_cache);
+ int64 new_cache_id = storage->NewCacheId();
+ scoped_refptr<AppCache> new_cache = new AppCache(&service, new_cache_id);
+ new_cache->set_complete(true);
+ group->AddCache(new_cache);
+ EXPECT_EQ(new_cache.get(), group->newest_complete_cache());
+ // Hold our refs to simulate the UpdateJob holding these refs.
+
+ // Conduct the test.
+ MockStorageDelegate delegate;
+ EXPECT_EQ(size_t(1), storage->stored_caches_.size());
+ EXPECT_EQ(size_t(1), storage->stored_groups_.size());
+ EXPECT_TRUE(storage->IsCacheStored(old_cache));
+ EXPECT_FALSE(storage->IsCacheStored(new_cache));
+ storage->StoreGroupAndNewestCache(group, &delegate);
+ EXPECT_FALSE(delegate.stored_group_success_);
+ EXPECT_EQ(size_t(1), storage->stored_caches_.size());
+ EXPECT_EQ(size_t(1), storage->stored_groups_.size());
+ EXPECT_TRUE(storage->IsCacheStored(old_cache));
+ EXPECT_FALSE(storage->IsCacheStored(new_cache));
+ MessageLoop::current()->RunAllPending(); // Do async task execution.
+ EXPECT_TRUE(delegate.stored_group_success_);
+ EXPECT_EQ(size_t(1), storage->stored_caches_.size());
+ EXPECT_EQ(size_t(1), storage->stored_groups_.size());
+ EXPECT_FALSE(storage->IsCacheStored(old_cache));
+ EXPECT_TRUE(storage->IsCacheStored(new_cache));
+}
+
+TEST_F(MockAppCacheStorageTest, MakeGroupObsolete) {
+ // Make a group obsolete, should complete asyncly.
+ MockAppCacheService service;
+ MockAppCacheStorage* storage =
+ reinterpret_cast<MockAppCacheStorage*>(service.storage());
+
+ // Setup some preconditions. Create a group and newest cache that
+ // appears to be "stored" and "currently in use".
+ GURL manifest_url("http://blah/");
+ scoped_refptr<AppCacheGroup> group =
+ new AppCacheGroup(&service, manifest_url);
+ int64 cache_id = storage->NewCacheId();
+ scoped_refptr<AppCache> cache = new AppCache(&service, cache_id);
+ cache->set_complete(true);
+ group->AddCache(cache);
+ storage->AddStoredGroup(group);
+ storage->AddStoredCache(cache);
+ // Hold our refs to simulate the UpdateJob holding these refs.
+
+ // Conduct the test.
+ MockStorageDelegate delegate;
+ EXPECT_FALSE(group->is_obsolete());
+ EXPECT_EQ(size_t(1), storage->stored_caches_.size());
+ EXPECT_EQ(size_t(1), storage->stored_groups_.size());
+ EXPECT_FALSE(cache->HasOneRef());
+ EXPECT_FALSE(group->HasOneRef());
+ storage->MakeGroupObsolete(group, &delegate);
+ EXPECT_FALSE(group->is_obsolete());
+ EXPECT_EQ(size_t(1), storage->stored_caches_.size());
+ EXPECT_EQ(size_t(1), storage->stored_groups_.size());
+ EXPECT_FALSE(cache->HasOneRef());
+ EXPECT_FALSE(group->HasOneRef());
+ MessageLoop::current()->RunAllPending(); // Do async task execution.
+ EXPECT_TRUE(delegate.obsoleted_success_);
+ EXPECT_EQ(group.get(), delegate.obsoleted_group_.get());
+ EXPECT_TRUE(group->is_obsolete());
+ EXPECT_TRUE(storage->stored_caches_.empty());
+ EXPECT_TRUE(storage->stored_groups_.empty());
+ EXPECT_TRUE(cache->HasOneRef());
+ EXPECT_FALSE(group->HasOneRef());
+ delegate.obsoleted_group_ = NULL;
+ cache = NULL;
+ EXPECT_TRUE(group->HasOneRef());
+}
+
+TEST_F(MockAppCacheStorageTest, MarkEntryAsForeign) {
+ // Should complete syncly.
+ MockAppCacheService service;
+ MockAppCacheStorage* storage =
+ reinterpret_cast<MockAppCacheStorage*>(service.storage());
+
+ // Setup some preconditions. Create a cache with an entry.
+ GURL entry_url("http://blan/entry");
+ int64 cache_id = storage->NewCacheId();
+ scoped_refptr<AppCache> cache = new AppCache(&service, cache_id);
+ cache->AddEntry(entry_url, AppCacheEntry(AppCacheEntry::EXPLICIT));
+
+ // Conduct the test.
+ MockStorageDelegate delegate;
+ EXPECT_FALSE(cache->GetEntry(entry_url)->IsForeign());
+ storage->MarkEntryAsForeign(entry_url, cache_id);
+ EXPECT_TRUE(cache->GetEntry(entry_url)->IsForeign());
+ EXPECT_TRUE(cache->GetEntry(entry_url)->IsExplicit());
+}
+
+TEST_F(MockAppCacheStorageTest, FindNoMainResponse) {
+ // Should complete asyncly.
+ MockAppCacheService service;
+ MockAppCacheStorage* storage =
+ reinterpret_cast<MockAppCacheStorage*>(service.storage());
+
+ // Conduct the test.
+ MockStorageDelegate delegate;
+ GURL url("http://blah/some_url");
+ EXPECT_NE(url, delegate.found_url_);
+ storage->FindResponseForMainRequest(url, &delegate);
+ EXPECT_NE(url, delegate.found_url_);
+ MessageLoop::current()->RunAllPending(); // Do async task execution.
+ EXPECT_EQ(url, delegate.found_url_);
+ EXPECT_TRUE(delegate.found_manifest_url_.is_empty());
+ EXPECT_EQ(kNoCacheId, delegate.found_cache_id_);
+ EXPECT_EQ(kNoResponseId, delegate.found_entry_.response_id());
+ EXPECT_EQ(0, delegate.found_entry_.types());
+}
+
+} // namespace appcache
+
Property changes on: webkit\appcache\mock_appcache_storage_unittest.cc
___________________________________________________________________
Added: svn:eol-style
+ LF

Powered by Google App Engine
This is Rietveld 408576698