| Index: webkit/appcache/appcache_update_job_unittest.cc
|
| ===================================================================
|
| --- webkit/appcache/appcache_update_job_unittest.cc (revision 30060)
|
| +++ webkit/appcache/appcache_update_job_unittest.cc (working copy)
|
| @@ -673,7 +673,7 @@
|
| // Give the newest cache a master entry that is also one of the explicit
|
| // entries in the manifest.
|
| cache->AddEntry(http_server_->TestServerPage("files/explicit1"),
|
| - AppCacheEntry(AppCacheEntry::MASTER));
|
| + AppCacheEntry(AppCacheEntry::MASTER, 111));
|
|
|
| // TODO(jennb): simulate this by mocking storage behavior instead
|
| update->SimulateManifestChanged(true); // changed
|
| @@ -795,13 +795,13 @@
|
| // Give the newest cache some master entries; one will fail with a 404.
|
| cache->AddEntry(
|
| http_server_->TestServerPage("files/notfound"),
|
| - AppCacheEntry(AppCacheEntry::MASTER));
|
| + AppCacheEntry(AppCacheEntry::MASTER, 222));
|
| cache->AddEntry(
|
| http_server_->TestServerPage("files/explicit2"),
|
| - AppCacheEntry(AppCacheEntry::MASTER | AppCacheEntry::FOREIGN));
|
| + AppCacheEntry(AppCacheEntry::MASTER | AppCacheEntry::FOREIGN, 333));
|
| cache->AddEntry(
|
| http_server_->TestServerPage("files/servererror"),
|
| - AppCacheEntry(AppCacheEntry::MASTER));
|
| + AppCacheEntry(AppCacheEntry::MASTER, 444));
|
|
|
| // TODO(jennb): simulate this by mocking storage behavior instead
|
| update->SimulateManifestChanged(true); // changed
|
| @@ -820,7 +820,7 @@
|
| AppCacheEntry(AppCacheEntry::MASTER))); // foreign flag is dropped
|
| expect_extra_entries_.insert(AppCache::EntryMap::value_type(
|
| http_server_->TestServerPage("files/servererror"),
|
| - AppCacheEntry(AppCacheEntry::MASTER))); // foreign flag is dropped
|
| + AppCacheEntry(AppCacheEntry::MASTER)));
|
| MockFrontend::HostIds ids1(1, host1->host_id());
|
| frontend1->AddExpectedEvent(ids1, CHECKING_EVENT);
|
| frontend1->AddExpectedEvent(ids1, DOWNLOADING_EVENT);
|
| @@ -1012,6 +1012,8 @@
|
| }
|
|
|
| void RetryUrlTest() {
|
| + ASSERT_EQ(MessageLoop::TYPE_IO, MessageLoop::current()->type());
|
| +
|
| // Set 1 as the retry limit (does not exceed the max).
|
| // Expect 1 manifest fetch, 1 url fetch, 1 url retry, 1 manifest refetch.
|
| RetryRequestTestJob::Initialize(1, RetryRequestTestJob::RETRY_AFTER_0, 4);
|
| @@ -1039,6 +1041,147 @@
|
| WaitForUpdateToFinish();
|
| }
|
|
|
| + void FailStoreNewestCacheTest() {
|
| + ASSERT_EQ(MessageLoop::TYPE_IO, MessageLoop::current()->type());
|
| +
|
| + MakeService();
|
| + MockAppCacheStorage* storage =
|
| + reinterpret_cast<MockAppCacheStorage*>(service_->storage());
|
| + storage->SimulateStoreGroupAndNewestCacheFailure();
|
| +
|
| + group_ = new AppCacheGroup(
|
| + service_.get(), http_server_->TestServerPage("files/manifest1"));
|
| + AppCacheUpdateJob* update = new AppCacheUpdateJob(service_.get(), group_);
|
| + group_->update_job_ = update;
|
| +
|
| + MockFrontend* frontend = MakeMockFrontend();
|
| + AppCacheHost* host = MakeHost(1, frontend);
|
| + update->StartUpdate(host, GURL::EmptyGURL());
|
| +
|
| + // Set up checks for when update job finishes.
|
| + do_checks_after_update_finished_ = true;
|
| + expect_group_obsolete_ = false;
|
| + expect_group_has_cache_ = false; // storage failed
|
| + frontend->AddExpectedEvent(MockFrontend::HostIds(1, host->host_id()),
|
| + CHECKING_EVENT);
|
| +
|
| + WaitForUpdateToFinish();
|
| + }
|
| +
|
| + void UpgradeFailStoreNewestCacheTest() {
|
| + ASSERT_EQ(MessageLoop::TYPE_IO, MessageLoop::current()->type());
|
| +
|
| + MakeService();
|
| + MockAppCacheStorage* storage =
|
| + reinterpret_cast<MockAppCacheStorage*>(service_->storage());
|
| + storage->SimulateStoreGroupAndNewestCacheFailure();
|
| +
|
| + group_ = new AppCacheGroup(
|
| + service_.get(), http_server_->TestServerPage("files/manifest1"));
|
| + AppCacheUpdateJob* update = new AppCacheUpdateJob(service_.get(), group_);
|
| + group_->update_job_ = update;
|
| +
|
| + AppCache* cache = MakeCacheForGroup(service_->storage()->NewCacheId());
|
| + MockFrontend* frontend1 = MakeMockFrontend();
|
| + MockFrontend* frontend2 = MakeMockFrontend();
|
| + AppCacheHost* host1 = MakeHost(1, frontend1);
|
| + AppCacheHost* host2 = MakeHost(2, frontend2);
|
| + host1->AssociateCache(cache);
|
| + host2->AssociateCache(cache);
|
| +
|
| + // TODO(jennb): simulate this by mocking storage behavior instead
|
| + update->SimulateManifestChanged(true); // changed
|
| +
|
| + update->StartUpdate(NULL, GURL::EmptyGURL());
|
| +
|
| + // Set up checks for when update job finishes.
|
| + do_checks_after_update_finished_ = true;
|
| + expect_group_obsolete_ = false;
|
| + expect_group_has_cache_ = true;
|
| + expect_newest_cache_ = cache; // unchanged
|
| + MockFrontend::HostIds ids1(1, host1->host_id());
|
| + frontend1->AddExpectedEvent(ids1, CHECKING_EVENT);
|
| + frontend1->AddExpectedEvent(ids1, DOWNLOADING_EVENT);
|
| + frontend1->AddExpectedEvent(ids1, PROGRESS_EVENT);
|
| + frontend1->AddExpectedEvent(ids1, PROGRESS_EVENT);
|
| + frontend1->AddExpectedEvent(ids1, ERROR_EVENT);
|
| + MockFrontend::HostIds ids2(1, host2->host_id());
|
| + frontend2->AddExpectedEvent(ids2, CHECKING_EVENT);
|
| + frontend2->AddExpectedEvent(ids2, DOWNLOADING_EVENT);
|
| + frontend2->AddExpectedEvent(ids2, PROGRESS_EVENT);
|
| + frontend2->AddExpectedEvent(ids2, PROGRESS_EVENT);
|
| + frontend2->AddExpectedEvent(ids2, ERROR_EVENT);
|
| +
|
| + WaitForUpdateToFinish();
|
| + }
|
| +
|
| + void FailMakeGroupObsoleteTest() {
|
| + ASSERT_EQ(MessageLoop::TYPE_IO, MessageLoop::current()->type());
|
| +
|
| + MakeService();
|
| + MockAppCacheStorage* storage =
|
| + reinterpret_cast<MockAppCacheStorage*>(service_->storage());
|
| + storage->SimulateMakeGroupObsoleteFailure();
|
| +
|
| + group_ = new AppCacheGroup(
|
| + service_.get(), http_server_->TestServerPage("files/gone"));
|
| + AppCacheUpdateJob* update = new AppCacheUpdateJob(service_.get(), group_);
|
| + group_->update_job_ = update;
|
| +
|
| + MockFrontend* frontend = MakeMockFrontend();
|
| + AppCacheHost* host = MakeHost(1, frontend);
|
| + update->StartUpdate(host, GURL::EmptyGURL());
|
| + EXPECT_TRUE(update->manifest_url_request_ != NULL);
|
| +
|
| + // Set up checks for when update job finishes.
|
| + do_checks_after_update_finished_ = true;
|
| + expect_group_obsolete_ = false;
|
| + expect_group_has_cache_ = false;
|
| + frontend->AddExpectedEvent(MockFrontend::HostIds(1, host->host_id()),
|
| + CHECKING_EVENT);
|
| +
|
| + WaitForUpdateToFinish();
|
| + }
|
| +
|
| + void UpgradeFailMakeGroupObsoleteTest() {
|
| + ASSERT_EQ(MessageLoop::TYPE_IO, MessageLoop::current()->type());
|
| +
|
| + MakeService();
|
| + MockAppCacheStorage* storage =
|
| + reinterpret_cast<MockAppCacheStorage*>(service_->storage());
|
| + storage->SimulateMakeGroupObsoleteFailure();
|
| +
|
| + group_ = new AppCacheGroup(
|
| + service_.get(), http_server_->TestServerPage("files/nosuchfile"));
|
| + AppCacheUpdateJob* update = new AppCacheUpdateJob(service_.get(), group_);
|
| + group_->update_job_ = update;
|
| +
|
| + AppCache* cache = MakeCacheForGroup(1);
|
| + MockFrontend* frontend1 = MakeMockFrontend();
|
| + MockFrontend* frontend2 = MakeMockFrontend();
|
| + AppCacheHost* host1 = MakeHost(1, frontend1);
|
| + AppCacheHost* host2 = MakeHost(2, frontend2);
|
| + host1->AssociateCache(cache);
|
| + host2->AssociateCache(cache);
|
| +
|
| + update->StartUpdate(NULL, GURL::EmptyGURL());
|
| + EXPECT_TRUE(update->manifest_url_request_ != NULL);
|
| +
|
| + // Set up checks for when update job finishes.
|
| + do_checks_after_update_finished_ = true;
|
| + expect_group_obsolete_ = false;
|
| + expect_group_has_cache_ = true;
|
| + expect_newest_cache_ = cache; // newest cache unaffected by update
|
| + MockFrontend::HostIds ids1(1, host1->host_id());
|
| + frontend1->AddExpectedEvent(ids1, CHECKING_EVENT);
|
| + frontend1->AddExpectedEvent(ids1, ERROR_EVENT);
|
| + MockFrontend::HostIds ids2(1, host2->host_id());
|
| + frontend2->AddExpectedEvent(ids2, CHECKING_EVENT);
|
| + frontend2->AddExpectedEvent(ids2, ERROR_EVENT);
|
| +
|
| + WaitForUpdateToFinish();
|
| + }
|
| +
|
| void WaitForUpdateToFinish() {
|
| if (group_->update_status() == AppCacheGroup::IDLE)
|
| UpdateFinished();
|
| @@ -1053,8 +1196,8 @@
|
| }
|
|
|
| void UpdateFinished() {
|
| - // We unwind the stack prior to finishing up to let stack
|
| - // based objects get deleted.
|
| + // We unwind the stack prior to finishing up to let stack-based objects
|
| + // get deleted.
|
| MessageLoop::current()->PostTask(FROM_HERE,
|
| method_factory_.NewRunnableMethod(
|
| &AppCacheUpdateJobTest::UpdateFinishedUnwound));
|
| @@ -1119,8 +1262,29 @@
|
| std::find(group_->old_caches().begin(),
|
| group_->old_caches().end(), expect_old_cache_));
|
| }
|
| - if (expect_newest_cache_)
|
| + if (expect_newest_cache_) {
|
| EXPECT_EQ(expect_newest_cache_, group_->newest_complete_cache());
|
| + EXPECT_TRUE(group_->old_caches().end() ==
|
| + std::find(group_->old_caches().begin(),
|
| + group_->old_caches().end(), expect_newest_cache_));
|
| + } else {
|
| + // Tests that don't know which newest cache to expect contain updates
|
| + // that succeed (because the update creates a new cache whose pointer
|
| + // is unknown to the test). Check group and newest cache were stored
|
| + // when update succeeds.
|
| + MockAppCacheStorage* storage =
|
| + reinterpret_cast<MockAppCacheStorage*>(service_->storage());
|
| + EXPECT_TRUE(storage->IsGroupStored(group_));
|
| + EXPECT_TRUE(storage->IsCacheStored(group_->newest_complete_cache()));
|
| +
|
| + // Check that all entries in the newest cache were stored.
|
| + const AppCache::EntryMap& entries =
|
| + group_->newest_complete_cache()->entries();
|
| + for (AppCache::EntryMap::const_iterator it = entries.begin();
|
| + it != entries.end(); ++it) {
|
| + EXPECT_NE(kNoResponseId, it->second.response_id());
|
| + }
|
| + }
|
| } else {
|
| EXPECT_TRUE(group_->newest_complete_cache() == NULL);
|
| }
|
| @@ -1458,4 +1622,20 @@
|
| RunTestOnIOThread(&AppCacheUpdateJobTest::RetryUrlTest);
|
| }
|
|
|
| +TEST_F(AppCacheUpdateJobTest, FailStoreNewestCache) {
|
| + RunTestOnIOThread(&AppCacheUpdateJobTest::FailStoreNewestCacheTest);
|
| +}
|
| +
|
| +TEST_F(AppCacheUpdateJobTest, UpgradeFailStoreNewestCache) {
|
| + RunTestOnIOThread(&AppCacheUpdateJobTest::UpgradeFailStoreNewestCacheTest);
|
| +}
|
| +
|
| +TEST_F(AppCacheUpdateJobTest, FailMakeGroupObsolete) {
|
| + RunTestOnIOThread(&AppCacheUpdateJobTest::FailMakeGroupObsoleteTest);
|
| +}
|
| +
|
| +TEST_F(AppCacheUpdateJobTest, UpgradeFailMakeGroupObsolete) {
|
| + RunTestOnIOThread(&AppCacheUpdateJobTest::UpgradeFailMakeGroupObsoleteTest);
|
| +}
|
| +
|
| } // namespace appcache
|
|
|