Index: webkit/appcache/appcache_storage_impl_unittest.cc |
=================================================================== |
--- webkit/appcache/appcache_storage_impl_unittest.cc (revision 81647) |
+++ webkit/appcache/appcache_storage_impl_unittest.cc (working copy) |
@@ -1,4 +1,4 @@ |
-// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+// Copyright (c) 2011 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. |
@@ -25,6 +25,7 @@ |
const base::Time kZeroTime; |
const GURL kManifestUrl("http://blah/manifest"); |
const GURL kManifestUrl2("http://blah/manifest2"); |
+const GURL kManifestUrl3("http://blah/manifest3"); |
const GURL kEntryUrl("http://blah/entry"); |
const GURL kEntryUrl2("http://blah/entry2"); |
const GURL kFallbackNamespace("http://blah/fallback_namespace/"); |
@@ -34,6 +35,9 @@ |
const GURL kOnlineNamespaceWithinFallback( |
"http://blah/fallback_namespace/online/"); |
+const int kManifestEntryIdOffset = 100; |
+const int kFallbackEntryIdOffset = 1000; |
+ |
// For the duration of this test case, we hijack the AppCacheThread API |
// calls and implement them in terms of the io and db threads created here. |
@@ -723,7 +727,7 @@ |
this, &AppCacheStorageImplTest::Verify_FindNoMainResponse)); |
// Conduct the test. |
- storage()->FindResponseForMainRequest(kEntryUrl, delegate()); |
+ storage()->FindResponseForMainRequest(kEntryUrl, GURL(), delegate()); |
EXPECT_NE(kEntryUrl, delegate()->found_url_); |
} |
@@ -783,7 +787,7 @@ |
} |
// Conduct the test. |
- storage()->FindResponseForMainRequest(kEntryUrl, delegate()); |
+ storage()->FindResponseForMainRequest(kEntryUrl, GURL(), delegate()); |
EXPECT_NE(kEntryUrl, delegate()->found_url_); |
} |
@@ -844,7 +848,7 @@ |
// Conduct the test. The test url is in both fallback namespace urls, |
// but should match the longer of the two. |
- storage()->FindResponseForMainRequest(kFallbackTestUrl, delegate()); |
+ storage()->FindResponseForMainRequest(kFallbackTestUrl, GURL(), delegate()); |
EXPECT_NE(kFallbackTestUrl, delegate()->found_url_); |
} |
@@ -866,44 +870,146 @@ |
PushNextTask(NewRunnableMethod(this, |
&AppCacheStorageImplTest::Verify_FindMainResponseWithMultipleHits)); |
- // Setup some preconditions. Create 2 complete caches with an entry |
- // for the same url. |
+ // Setup some preconditions, create a few caches with an identical set |
+ // of entries and fallback namespaces. Only the last one remains in |
+ // the working set to simulate appearing as "in use". |
+ MakeMultipleHitCacheAndGroup(kManifestUrl, 1); |
+ MakeMultipleHitCacheAndGroup(kManifestUrl2, 2); |
+ MakeMultipleHitCacheAndGroup(kManifestUrl3, 3); |
- // The first cache, in the database but not in the working set. |
- MakeCacheAndGroup(kManifestUrl, 1, 1, true); |
- cache_->AddEntry(kEntryUrl, AppCacheEntry(AppCacheEntry::EXPLICIT, 1)); |
+ // Conduct the test, we should find the response from the last cache |
+ // since it's "in use". |
+ storage()->FindResponseForMainRequest(kEntryUrl, GURL(), delegate()); |
+ EXPECT_NE(kEntryUrl, delegate()->found_url_); |
+ } |
+ |
+ void MakeMultipleHitCacheAndGroup(const GURL& manifest_url, int id) { |
+ MakeCacheAndGroup(manifest_url, id, id, true); |
AppCacheDatabase::EntryRecord entry_record; |
- entry_record.cache_id = 1; |
+ |
+ // Add an entry for kEntryUrl |
+ entry_record.cache_id = id; |
entry_record.url = kEntryUrl; |
entry_record.flags = AppCacheEntry::EXPLICIT; |
- entry_record.response_id = 1; |
+ entry_record.response_id = id; |
EXPECT_TRUE(database()->InsertEntry(&entry_record)); |
- cache_ = NULL; |
- group_ = NULL; |
+ cache_->AddEntry( |
+ entry_record.url, |
+ AppCacheEntry(entry_record.flags, entry_record.response_id)); |
- // The second cache, in the database and working set. |
- MakeCacheAndGroup(kManifestUrl2, 2, 2, true); |
- cache_->AddEntry(kEntryUrl, AppCacheEntry(AppCacheEntry::EXPLICIT, 2)); |
- entry_record.cache_id = 2; |
- entry_record.url = kEntryUrl; |
- entry_record.flags = AppCacheEntry::EXPLICIT; |
- entry_record.response_id = 2; |
+ // Add an entry for the manifestUrl |
+ entry_record.cache_id = id; |
+ entry_record.url = manifest_url; |
+ entry_record.flags = AppCacheEntry::MANIFEST; |
+ entry_record.response_id = id + kManifestEntryIdOffset; |
EXPECT_TRUE(database()->InsertEntry(&entry_record)); |
+ cache_->AddEntry( |
+ entry_record.url, |
+ AppCacheEntry(entry_record.flags, entry_record.response_id)); |
- // Conduct the test, we should find the response from the second cache |
- // since it's "in use". |
- storage()->FindResponseForMainRequest(kEntryUrl, delegate()); |
- EXPECT_NE(kEntryUrl, delegate()->found_url_); |
+ // Add a fallback entry and namespace |
+ entry_record.cache_id = id; |
+ entry_record.url = kEntryUrl2; |
+ entry_record.flags = AppCacheEntry::FALLBACK; |
+ entry_record.response_id = id + kFallbackEntryIdOffset; |
+ EXPECT_TRUE(database()->InsertEntry(&entry_record)); |
+ cache_->AddEntry( |
+ entry_record.url, |
+ AppCacheEntry(entry_record.flags, entry_record.response_id)); |
+ AppCacheDatabase::FallbackNameSpaceRecord fallback_namespace_record; |
+ fallback_namespace_record.cache_id = id; |
+ fallback_namespace_record.fallback_entry_url = entry_record.url; |
+ fallback_namespace_record.namespace_url = kFallbackNamespace; |
+ fallback_namespace_record.origin = manifest_url.GetOrigin(); |
+ EXPECT_TRUE( |
+ database()->InsertFallbackNameSpace(&fallback_namespace_record)); |
+ cache_->fallback_namespaces_.push_back( |
+ FallbackNamespace(kFallbackNamespace, kEntryUrl2)); |
} |
void Verify_FindMainResponseWithMultipleHits() { |
EXPECT_EQ(kEntryUrl, delegate()->found_url_); |
+ EXPECT_EQ(kManifestUrl3, delegate()->found_manifest_url_); |
+ EXPECT_FALSE(delegate()->found_blocked_by_policy_); |
+ EXPECT_EQ(3, delegate()->found_cache_id_); |
+ EXPECT_EQ(3, delegate()->found_entry_.response_id()); |
+ EXPECT_TRUE(delegate()->found_entry_.IsExplicit()); |
+ EXPECT_FALSE(delegate()->found_fallback_entry_.has_response_id()); |
+ |
+ // Conduct another test perferring kManifestUrl |
+ delegate_.reset(new MockStorageDelegate(this)); |
+ PushNextTask(NewRunnableMethod(this, |
+ &AppCacheStorageImplTest::Verify_FindMainResponseWithMultipleHits2)); |
+ storage()->FindResponseForMainRequest(kEntryUrl, kManifestUrl, delegate()); |
+ EXPECT_NE(kEntryUrl, delegate()->found_url_); |
+ } |
+ |
+ void Verify_FindMainResponseWithMultipleHits2() { |
+ EXPECT_EQ(kEntryUrl, delegate()->found_url_); |
+ EXPECT_EQ(kManifestUrl, delegate()->found_manifest_url_); |
+ EXPECT_FALSE(delegate()->found_blocked_by_policy_); |
+ EXPECT_EQ(1, delegate()->found_cache_id_); |
+ EXPECT_EQ(1, delegate()->found_entry_.response_id()); |
+ EXPECT_TRUE(delegate()->found_entry_.IsExplicit()); |
+ EXPECT_FALSE(delegate()->found_fallback_entry_.has_response_id()); |
+ |
+ // Conduct the another test perferring kManifestUrl2 |
+ delegate_.reset(new MockStorageDelegate(this)); |
+ PushNextTask(NewRunnableMethod(this, |
+ &AppCacheStorageImplTest::Verify_FindMainResponseWithMultipleHits3)); |
+ storage()->FindResponseForMainRequest(kEntryUrl, kManifestUrl2, delegate()); |
+ EXPECT_NE(kEntryUrl, delegate()->found_url_); |
+ } |
+ |
+ void Verify_FindMainResponseWithMultipleHits3() { |
+ EXPECT_EQ(kEntryUrl, delegate()->found_url_); |
EXPECT_EQ(kManifestUrl2, delegate()->found_manifest_url_); |
EXPECT_FALSE(delegate()->found_blocked_by_policy_); |
EXPECT_EQ(2, delegate()->found_cache_id_); |
EXPECT_EQ(2, delegate()->found_entry_.response_id()); |
EXPECT_TRUE(delegate()->found_entry_.IsExplicit()); |
EXPECT_FALSE(delegate()->found_fallback_entry_.has_response_id()); |
+ |
+ // Conduct another test with no preferred manifest that hits the fallback. |
+ delegate_.reset(new MockStorageDelegate(this)); |
+ PushNextTask(NewRunnableMethod(this, |
+ &AppCacheStorageImplTest::Verify_FindMainResponseWithMultipleHits4)); |
+ storage()->FindResponseForMainRequest( |
+ kFallbackTestUrl, GURL(), delegate()); |
+ EXPECT_NE(kFallbackTestUrl, delegate()->found_url_); |
+ } |
+ |
+ void Verify_FindMainResponseWithMultipleHits4() { |
+ EXPECT_EQ(kFallbackTestUrl, delegate()->found_url_); |
+ EXPECT_EQ(kManifestUrl3, delegate()->found_manifest_url_); |
+ EXPECT_FALSE(delegate()->found_blocked_by_policy_); |
+ EXPECT_EQ(3, delegate()->found_cache_id_); |
+ EXPECT_FALSE(delegate()->found_entry_.has_response_id()); |
+ EXPECT_EQ(3 + kFallbackEntryIdOffset, |
+ delegate()->found_fallback_entry_.response_id()); |
+ EXPECT_TRUE(delegate()->found_fallback_entry_.IsFallback()); |
+ EXPECT_EQ(kEntryUrl2, delegate()->found_fallback_url_); |
+ |
+ // Conduct another test preferring kManifestUrl2 that hits the fallback. |
+ delegate_.reset(new MockStorageDelegate(this)); |
+ PushNextTask(NewRunnableMethod(this, |
+ &AppCacheStorageImplTest::Verify_FindMainResponseWithMultipleHits5)); |
+ storage()->FindResponseForMainRequest( |
+ kFallbackTestUrl, kManifestUrl2, delegate()); |
+ EXPECT_NE(kFallbackTestUrl, delegate()->found_url_); |
+ } |
+ |
+ void Verify_FindMainResponseWithMultipleHits5() { |
+ EXPECT_EQ(kFallbackTestUrl, delegate()->found_url_); |
+ EXPECT_EQ(kManifestUrl2, delegate()->found_manifest_url_); |
+ EXPECT_FALSE(delegate()->found_blocked_by_policy_); |
+ EXPECT_EQ(2, delegate()->found_cache_id_); |
+ EXPECT_FALSE(delegate()->found_entry_.has_response_id()); |
+ EXPECT_EQ(2 + kFallbackEntryIdOffset, |
+ delegate()->found_fallback_entry_.response_id()); |
+ EXPECT_TRUE(delegate()->found_fallback_entry_.IsFallback()); |
+ EXPECT_EQ(kEntryUrl2, delegate()->found_fallback_url_); |
+ |
TestFinished(); |
} |
@@ -961,7 +1067,7 @@ |
PushNextTask(NewRunnableMethod( |
this, &AppCacheStorageImplTest::Verify_ExclusionNotFound, |
kEntryUrl, 1)); |
- storage()->FindResponseForMainRequest(kEntryUrl, delegate()); |
+ storage()->FindResponseForMainRequest(kEntryUrl, GURL(), delegate()); |
} |
void Verify_ExclusionNotFound(GURL expected_url, int phase) { |
@@ -980,7 +1086,8 @@ |
PushNextTask(NewRunnableMethod(this, |
&AppCacheStorageImplTest::Verify_ExclusionNotFound, |
kOnlineNamespace, 2)); |
- storage()->FindResponseForMainRequest(kOnlineNamespace, delegate()); |
+ storage()->FindResponseForMainRequest( |
+ kOnlineNamespace, GURL(), delegate()); |
return; |
} |
if (phase == 2) { |
@@ -990,7 +1097,7 @@ |
&AppCacheStorageImplTest::Verify_ExclusionNotFound, |
kOnlineNamespaceWithinFallback, 3)); |
storage()->FindResponseForMainRequest( |
- kOnlineNamespaceWithinFallback, delegate()); |
+ kOnlineNamespaceWithinFallback, GURL(), delegate()); |
return; |
} |