Chromium Code Reviews| Index: content/browser/storage_partition_impl_unittest.cc |
| diff --git a/content/browser/storage_partition_impl_unittest.cc b/content/browser/storage_partition_impl_unittest.cc |
| index 4828ae6529fccae29d94bd7ff6bf6c874fc0739e..ea9ab2650cb4326273d11b5a27f4126d1331a952 100644 |
| --- a/content/browser/storage_partition_impl_unittest.cc |
| +++ b/content/browser/storage_partition_impl_unittest.cc |
| @@ -2,6 +2,7 @@ |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| +#include "base/file_util.h" |
| #include "base/files/scoped_temp_dir.h" |
| #include "base/message_loop/message_loop_proxy.h" |
| #include "base/run_loop.h" |
| @@ -9,14 +10,57 @@ |
| #include "content/browser/browser_thread_impl.h" |
| #include "content/browser/gpu/shader_disk_cache.h" |
| #include "content/browser/storage_partition_impl.h" |
| +#include "content/public/browser/local_storage_usage_info.h" |
| #include "content/public/browser/storage_partition.h" |
| +#include "content/public/test/test_browser_context.h" |
| +#include "content/public/test/test_browser_thread.h" |
| #include "content/public/test/test_browser_thread_bundle.h" |
| #include "net/base/test_completion_callback.h" |
| +#include "net/cookies/cookie_monster.h" |
| +#include "net/url_request/url_request_context.h" |
| +#include "net/url_request/url_request_context_getter.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| +#include "webkit/browser/quota/mock_quota_manager.h" |
| +#include "webkit/browser/quota/mock_special_storage_policy.h" |
| +#include "webkit/browser/quota/quota_manager.h" |
| namespace content { |
| namespace { |
| +const int kDefaultClientId = 42; |
| +const char kCacheKey[] = "key"; |
| +const char kCacheValue[] = "cached value"; |
| + |
| +const char kTestOrigin1[] = "http://host1:1/"; |
| +const char kTestOrigin2[] = "http://host2:1/"; |
| +const char kTestOrigin3[] = "http://host3:1/"; |
| +const char kTestOriginDevTools[] = "chrome-devtools://abcdefghijklmnopqrstuvw/"; |
| + |
| +const GURL kOrigin1(kTestOrigin1); |
| +const GURL kOrigin2(kTestOrigin2); |
| +const GURL kOrigin3(kTestOrigin3); |
| +const GURL kOriginDevTools(kTestOriginDevTools); |
| + |
| +const base::FilePath::CharType kDomStorageOrigin1[] = |
| + FILE_PATH_LITERAL("http_host1_1.localstorage"); |
| + |
| +const base::FilePath::CharType kDomStorageOrigin2[] = |
| + FILE_PATH_LITERAL("http_host2_1.localstorage"); |
| + |
| +const base::FilePath::CharType kDomStorageOrigin3[] = |
| + FILE_PATH_LITERAL("http_host3_1.localstorage"); |
| + |
| +const quota::StorageType kTemporary = quota::kStorageTypeTemporary; |
| +const quota::StorageType kPersistent = quota::kStorageTypePersistent; |
| + |
| +const quota::QuotaClient::ID kClientFile = quota::QuotaClient::kFileSystem; |
| + |
| +const uint32 kAllQuotaRemoveMask = |
| + StoragePartition::REMOVE_DATA_MASK_INDEXEDDB | |
| + StoragePartition::REMOVE_DATA_MASK_WEBSQL | |
| + StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS | |
| + StoragePartition::REMOVE_DATA_MASK_APPCACHE; |
| + |
| class TestClosureCallback { |
| public: |
| TestClosureCallback() |
| @@ -42,12 +86,293 @@ class TestClosureCallback { |
| DISALLOW_COPY_AND_ASSIGN(TestClosureCallback); |
| }; |
| -const int kDefaultClientId = 42; |
| -const char kCacheKey[] = "key"; |
| -const char kCacheValue[] = "cached value"; |
| +class AwaitCompletionHelper { |
| + public: |
| + AwaitCompletionHelper() : start_(false), already_quit_(false) {} |
| + virtual ~AwaitCompletionHelper() {} |
| + |
| + void BlockUntilNotified() { |
| + if (!already_quit_) { |
| + DCHECK(!start_); |
| + start_ = true; |
| + base::MessageLoop::current()->Run(); |
| + } else { |
| + DCHECK(!start_); |
| + already_quit_ = false; |
| + } |
| + } |
| + |
| + void Notify() { |
| + if (start_) { |
| + DCHECK(!already_quit_); |
| + base::MessageLoop::current()->Quit(); |
| + start_ = false; |
| + } else { |
| + DCHECK(!already_quit_); |
| + already_quit_ = true; |
| + } |
| + } |
| + |
| +// protected: |
| +// // BrowsingDataRemover::Observer implementation. |
| +// virtual void OnBrowsingDataRemoverDone() OVERRIDE { |
| +// Notify(); |
| +// } |
| +// |
| + private: |
| + // Helps prevent from running message_loop, if the callback invoked |
| + // immediately. |
| + bool start_; |
| + bool already_quit_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(AwaitCompletionHelper); |
| +}; |
| + |
| +class RemoveCookieTester { |
| + public: |
| + explicit RemoveCookieTester(TestBrowserContext* context) |
| + : get_cookie_success_(false), monster_(NULL) { |
| + SetMonster(context->GetRequestContext()->GetURLRequestContext()-> |
| + cookie_store()->GetCookieMonster()); |
| + } |
| + |
| + // Returns true, if the given cookie exists in the cookie store. |
| + bool ContainsCookie() { |
| + get_cookie_success_ = false; |
| + monster_->GetCookiesWithOptionsAsync( |
| + kOrigin1, net::CookieOptions(), |
| + base::Bind(&RemoveCookieTester::GetCookieCallback, |
| + base::Unretained(this))); |
| + await_completion_.BlockUntilNotified(); |
| + return get_cookie_success_; |
| + } |
| + |
| + void AddCookie() { |
| + monster_->SetCookieWithOptionsAsync( |
| + kOrigin1, "A=1", net::CookieOptions(), |
| + base::Bind(&RemoveCookieTester::SetCookieCallback, |
| + base::Unretained(this))); |
| + await_completion_.BlockUntilNotified(); |
| + } |
| + |
| + protected: |
| + void SetMonster(net::CookieStore* monster) { |
| + monster_ = monster; |
| + } |
| + |
| + private: |
| + void GetCookieCallback(const std::string& cookies) { |
| + if (cookies == "A=1") { |
| + get_cookie_success_ = true; |
| + } else { |
| + EXPECT_EQ("", cookies); |
| + get_cookie_success_ = false; |
| + } |
| + await_completion_.Notify(); |
| + } |
| + |
| + void SetCookieCallback(bool result) { |
| + ASSERT_TRUE(result); |
| + await_completion_.Notify(); |
| + } |
| + |
| + bool get_cookie_success_; |
| + AwaitCompletionHelper await_completion_; |
| + net::CookieStore* monster_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(RemoveCookieTester); |
| +}; |
| + |
| +class RemoveLocalStorageTester { |
| + public: |
| + explicit RemoveLocalStorageTester(TestBrowserContext* profile) |
| + : profile_(profile), dom_storage_context_(NULL) { |
| + dom_storage_context_ = |
| + content::BrowserContext::GetDefaultStoragePartition(profile)-> |
| + GetDOMStorageContext(); |
| + } |
| + |
| + // Returns true, if the given origin URL exists. |
| + bool DOMStorageExistsForOrigin(const GURL& origin) { |
| + GetLocalStorageUsage(); |
| + await_completion_.BlockUntilNotified(); |
| + for (size_t i = 0; i < infos_.size(); ++i) { |
| + if (origin == infos_[i].origin) |
| + return true; |
| + } |
| + return false; |
| + } |
| + |
| + void AddDOMStorageTestData() { |
| + // Note: This test depends on details of how the dom_storage library |
| + // stores data in the host file system. |
| + base::FilePath storage_path = |
| + profile_->GetPath().AppendASCII("Local Storage"); |
| + file_util::CreateDirectory(storage_path); |
| + |
| + // Write some files. |
| + file_util::WriteFile(storage_path.Append(kDomStorageOrigin1), NULL, 0); |
| + file_util::WriteFile(storage_path.Append(kDomStorageOrigin2), NULL, 0); |
| + file_util::WriteFile(storage_path.Append(kDomStorageOrigin3), NULL, 0); |
| + |
| + // Tweak their dates. |
| + file_util::SetLastModifiedTime(storage_path.Append(kDomStorageOrigin1), |
| + base::Time::Now()); |
| + file_util::SetLastModifiedTime(storage_path.Append(kDomStorageOrigin2), |
| + base::Time::Now() - base::TimeDelta::FromDays(1)); |
| + file_util::SetLastModifiedTime(storage_path.Append(kDomStorageOrigin3), |
| + base::Time::Now() - base::TimeDelta::FromDays(60)); |
| + } |
| + |
| + private: |
| + void GetLocalStorageUsage() { |
| + dom_storage_context_->GetLocalStorageUsage( |
| + base::Bind(&RemoveLocalStorageTester::OnGotLocalStorageUsage, |
| + base::Unretained(this))); |
| + } |
| + void OnGotLocalStorageUsage( |
| + const std::vector<content::LocalStorageUsageInfo>& infos) { |
| + infos_ = infos; |
| + await_completion_.Notify(); |
| + } |
| + |
| + // We don't own these pointers. |
| + TestBrowserContext* profile_; |
| + content::DOMStorageContext* dom_storage_context_; |
| + |
| + std::vector<content::LocalStorageUsageInfo> infos_; |
| + |
| + AwaitCompletionHelper await_completion_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(RemoveLocalStorageTester); |
| +}; |
| + |
| +bool IsWebSafeSchemeForTest(const std::string& scheme) { |
| + return scheme == "http"; |
| +} |
| + |
| +bool DoesOriginMatchForUnprotectedWeb( |
| + const GURL& origin, |
| + quota::SpecialStoragePolicy* special_storage_policy) { |
| +// if (IsWebSafeSchemeForTest(origin.scheme())) { |
|
Nico
2013/11/07 20:01:30
Did you intentionally land this code commented out
lazyboy
2013/11/07 20:17:18
Mistake from me. Uncommenting them in other CL.
|
| + return !special_storage_policy->IsStorageProtected(origin.GetOrigin()); |
| + |
| +// } |
| +// return false; |
| +} |
| + |
| +bool DoesOriginMatchForBothProtectedAndUnprotectedWeb( |
| + const GURL& origin, |
| + quota::SpecialStoragePolicy* special_storage_policy) { |
| + return true; |
| +} |
| + |
| +bool DoesOriginMatchUnprotected( |
| + const GURL& origin, |
| + quota::SpecialStoragePolicy* special_storage_policy) { |
| + return origin.GetOrigin().scheme() != kOriginDevTools.scheme(); |
| +} |
| + |
| +void ClearQuotaData(content::StoragePartition* storage_partition, |
| + const base::Closure& cb) { |
| + storage_partition->ClearData( |
| + kAllQuotaRemoveMask, |
| + StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL, |
| + NULL, StoragePartition::OriginMatcherFunction(), |
| + base::Time(), base::Time::Max(), cb); |
| +} |
| + |
| +void ClearQuotaDataWithOriginMatcher( |
| + content::StoragePartition* storage_partition, |
| + const GURL& remove_origin, |
| + const StoragePartition::OriginMatcherFunction& origin_matcher, |
| + const base::Time delete_begin, |
| + const base::Closure& cb) { |
| + storage_partition->ClearData(kAllQuotaRemoveMask, |
| + StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL, |
| + &remove_origin, origin_matcher, delete_begin, |
| + base::Time::Max(), cb); |
| +} |
| + |
| +void ClearQuotaDataForOrigin( |
| + content::StoragePartition* storage_partition, |
| + const GURL& remove_origin, |
| + const base::Time delete_begin, |
| + const base::Closure& cb) { |
| + ClearQuotaDataWithOriginMatcher( |
| + storage_partition, remove_origin, |
| + StoragePartition::OriginMatcherFunction(), delete_begin, cb); |
| +} |
| + |
| +void ClearQuotaDataForNonPersistent( |
| + content::StoragePartition* storage_partition, |
| + const base::Time delete_begin, |
| + const base::Closure& cb) { |
| + uint32 quota_storage_remove_mask_no_persistent = |
| + StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL & |
| + ~StoragePartition::QUOTA_MANAGED_STORAGE_MASK_PERSISTENT; |
| + storage_partition->ClearData( |
| + kAllQuotaRemoveMask, quota_storage_remove_mask_no_persistent, |
| + NULL, StoragePartition::OriginMatcherFunction(), |
| + delete_begin, base::Time::Max(), cb); |
| +} |
| + |
| +void ClearCookies(content::StoragePartition* storage_partition, |
| + const base::Time delete_begin, |
| + const base::Time delete_end, |
| + const base::Closure& cb) { |
| + storage_partition->ClearData( |
| + StoragePartition::REMOVE_DATA_MASK_COOKIES, |
| + StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL, |
| + NULL, StoragePartition::OriginMatcherFunction(), |
| + delete_begin, delete_end, cb); |
| +} |
| + |
| +void ClearStuff(uint32 remove_mask, |
| + content::StoragePartition* storage_partition, |
| + const base::Time delete_begin, |
| + const base::Time delete_end, |
| + const StoragePartition::OriginMatcherFunction& origin_matcher, |
| + const base::Closure& cb) { |
| + storage_partition->ClearData( |
| + remove_mask, StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL, |
| + NULL, origin_matcher, delete_begin, delete_end, cb); |
| +} |
| } // namespace |
| +class StoragePartitionImplTest : public testing::Test { |
| + public: |
| + StoragePartitionImplTest() |
| + : browser_context_(new TestBrowserContext()), |
| + thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) { |
| + } |
| + virtual ~StoragePartitionImplTest() {} |
| + |
| + quota::MockQuotaManager* GetMockManager() { |
| + if (!quota_manager_.get()) { |
| + quota_manager_ = new quota::MockQuotaManager( |
| + browser_context_->IsOffTheRecord(), |
| + browser_context_->GetPath(), |
| + BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO).get(), |
| + BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB).get(), |
| + browser_context_->GetSpecialStoragePolicy()); |
| + } |
| + return quota_manager_.get(); |
| + } |
| + |
| + TestBrowserContext* GetBrowserContext() { |
| + return browser_context_.get(); |
| + } |
| + |
| + private: |
| + scoped_ptr<TestBrowserContext> browser_context_; |
| + scoped_refptr<quota::MockQuotaManager> quota_manager_; |
| + content::TestBrowserThreadBundle thread_bundle_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(StoragePartitionImplTest); |
| +}; |
| + |
| class StoragePartitionShaderClearTest : public testing::Test { |
| public: |
| StoragePartitionShaderClearTest() |
| @@ -98,23 +423,550 @@ class StoragePartitionShaderClearTest : public testing::Test { |
| void ClearData(content::StoragePartitionImpl* sp, |
| const base::Closure& cb) { |
| base::Time time; |
| - sp->ClearDataForRange( |
| + sp->ClearData( |
| StoragePartition::REMOVE_DATA_MASK_SHADER_CACHE, |
| StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL, |
| + NULL, StoragePartition::OriginMatcherFunction(), |
| time, time, cb); |
| } |
| +// Tests --------------------------------------------------------------------- |
| + |
| TEST_F(StoragePartitionShaderClearTest, ClearShaderCache) { |
| InitCache(); |
| EXPECT_EQ(1u, Size()); |
| TestClosureCallback clear_cb; |
| - StoragePartitionImpl sp( |
| - cache_path(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); |
| + StoragePartitionImpl storage_partition( |
| + cache_path(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); |
| base::MessageLoop::current()->PostTask( |
| - FROM_HERE, base::Bind(&ClearData, &sp, clear_cb.callback())); |
| + FROM_HERE, base::Bind(&ClearData, &storage_partition, |
| + clear_cb.callback())); |
| clear_cb.WaitForResult(); |
| EXPECT_EQ(0u, Size()); |
| } |
| +TEST_F(StoragePartitionImplTest, QuotaClientMaskGeneration) { |
| + EXPECT_EQ(quota::QuotaClient::kFileSystem, |
| + StoragePartitionImpl::GenerateQuotaClientMask( |
| + StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS)); |
| + EXPECT_EQ(quota::QuotaClient::kDatabase, |
| + StoragePartitionImpl::GenerateQuotaClientMask( |
| + StoragePartition::REMOVE_DATA_MASK_WEBSQL)); |
| + EXPECT_EQ(quota::QuotaClient::kAppcache, |
| + StoragePartitionImpl::GenerateQuotaClientMask( |
| + StoragePartition::REMOVE_DATA_MASK_APPCACHE)); |
| + EXPECT_EQ(quota::QuotaClient::kIndexedDatabase, |
| + StoragePartitionImpl::GenerateQuotaClientMask( |
| + StoragePartition::REMOVE_DATA_MASK_INDEXEDDB)); |
| + EXPECT_EQ(quota::QuotaClient::kFileSystem | |
| + quota::QuotaClient::kDatabase | |
| + quota::QuotaClient::kAppcache | |
| + quota::QuotaClient::kIndexedDatabase, |
| + StoragePartitionImpl::GenerateQuotaClientMask( |
| + StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS | |
| + StoragePartition::REMOVE_DATA_MASK_WEBSQL | |
| + StoragePartition::REMOVE_DATA_MASK_APPCACHE | |
| + StoragePartition::REMOVE_DATA_MASK_INDEXEDDB)); |
| +} |
| + |
| +void PopulateTestQuotaManagedPersistentData(quota::MockQuotaManager* manager) { |
| + manager->AddOrigin(kOrigin2, kPersistent, kClientFile, base::Time()); |
| + manager->AddOrigin(kOrigin3, kPersistent, kClientFile, |
| + base::Time::Now() - base::TimeDelta::FromDays(1)); |
| + |
| + EXPECT_FALSE(manager->OriginHasData(kOrigin1, kPersistent, kClientFile)); |
| + EXPECT_TRUE(manager->OriginHasData(kOrigin2, kPersistent, kClientFile)); |
| + EXPECT_TRUE(manager->OriginHasData(kOrigin3, kPersistent, kClientFile)); |
| +} |
| + |
| +void PopulateTestQuotaManagedTemporaryData(quota::MockQuotaManager* manager) { |
| + manager->AddOrigin(kOrigin1, kTemporary, kClientFile, base::Time::Now()); |
| + manager->AddOrigin(kOrigin3, kTemporary, kClientFile, |
| + base::Time::Now() - base::TimeDelta::FromDays(1)); |
| + |
| + EXPECT_TRUE(manager->OriginHasData(kOrigin1, kTemporary, kClientFile)); |
| + EXPECT_FALSE(manager->OriginHasData(kOrigin2, kTemporary, kClientFile)); |
| + EXPECT_TRUE(manager->OriginHasData(kOrigin3, kTemporary, kClientFile)); |
| +} |
| + |
| +void PopulateTestQuotaManagedData(quota::MockQuotaManager* manager) { |
| + // Set up kOrigin1 with a temporary quota, kOrigin2 with a persistent |
| + // quota, and kOrigin3 with both. kOrigin1 is modified now, kOrigin2 |
| + // is modified at the beginning of time, and kOrigin3 is modified one day |
| + // ago. |
| + PopulateTestQuotaManagedPersistentData(manager); |
| + PopulateTestQuotaManagedTemporaryData(manager); |
| +} |
| + |
| +void PopulateTestQuotaManagedNonBrowsingData(quota::MockQuotaManager* manager) { |
| + manager->AddOrigin(kOriginDevTools, kTemporary, kClientFile, base::Time()); |
| + manager->AddOrigin(kOriginDevTools, kPersistent, kClientFile, base::Time()); |
| +} |
| + |
| +TEST_F(StoragePartitionImplTest, RemoveQuotaManagedDataForeverBoth) { |
| + PopulateTestQuotaManagedData(GetMockManager()); |
| + |
| + TestClosureCallback clear_cb; |
| + StoragePartitionImpl sp( |
| + base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); |
| + static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting( |
| + GetMockManager()); |
| + base::MessageLoop::current()->PostTask( |
| + FROM_HERE, base::Bind(&ClearQuotaData, &sp, clear_cb.callback())); |
| + clear_cb.WaitForResult(); |
| + |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kPersistent, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kPersistent, |
| + kClientFile)); |
| +} |
| + |
| +TEST_F(StoragePartitionImplTest, RemoveQuotaManagedDataForeverOnlyTemporary) { |
| + PopulateTestQuotaManagedTemporaryData(GetMockManager()); |
| + |
| + TestClosureCallback clear_cb; |
| + StoragePartitionImpl sp( |
| + base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); |
| + static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting( |
| + GetMockManager()); |
| + base::MessageLoop::current()->PostTask( |
| + FROM_HERE, base::Bind(&ClearQuotaData, &sp, clear_cb.callback())); |
| + clear_cb.WaitForResult(); |
| + |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kPersistent, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kPersistent, |
| + kClientFile)); |
| +} |
| + |
| +TEST_F(StoragePartitionImplTest, RemoveQuotaManagedDataForeverOnlyPersistent) { |
| + PopulateTestQuotaManagedPersistentData(GetMockManager()); |
| + |
| + TestClosureCallback clear_cb; |
| + StoragePartitionImpl sp( |
| + base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); |
| + static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting( |
| + GetMockManager()); |
| + base::MessageLoop::current()->PostTask( |
| + FROM_HERE, base::Bind(&ClearQuotaData, &sp, clear_cb.callback())); |
| + clear_cb.WaitForResult(); |
| + |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kPersistent, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kPersistent, |
| + kClientFile)); |
| +} |
| + |
| +TEST_F(StoragePartitionImplTest, RemoveQuotaManagedDataForeverNeither) { |
| + TestClosureCallback clear_cb; |
| + StoragePartitionImpl sp( |
| + base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); |
| + static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting( |
| + GetMockManager()); |
| + base::MessageLoop::current()->PostTask( |
| + FROM_HERE, base::Bind(&ClearQuotaData, &sp, clear_cb.callback())); |
| + clear_cb.WaitForResult(); |
| + |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kPersistent, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kPersistent, |
| + kClientFile)); |
| +} |
| + |
| +TEST_F(StoragePartitionImplTest, RemoveQuotaManagedDataForeverSpecificOrigin) { |
| + PopulateTestQuotaManagedData(GetMockManager()); |
| + |
| + TestClosureCallback clear_cb; |
| + StoragePartitionImpl sp( |
| + base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); |
| + static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting( |
| + GetMockManager()); |
| + base::MessageLoop::current()->PostTask( |
| + FROM_HERE, base::Bind(&ClearQuotaDataForOrigin, |
| + &sp, kOrigin1, base::Time(), clear_cb.callback())); |
| + clear_cb.WaitForResult(); |
| + |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary, |
| + kClientFile)); |
| + EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kTemporary, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent, |
| + kClientFile)); |
| + EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin2, kPersistent, |
| + kClientFile)); |
| + EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kPersistent, |
| + kClientFile)); |
| +} |
| + |
| +TEST_F(StoragePartitionImplTest, RemoveQuotaManagedDataForLastHour) { |
| + PopulateTestQuotaManagedData(GetMockManager()); |
| + |
| + TestClosureCallback clear_cb; |
| + StoragePartitionImpl sp( |
| + base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); |
| + static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting( |
| + GetMockManager()); |
| + base::MessageLoop::current()->PostTask( |
| + FROM_HERE, base::Bind(&ClearQuotaDataForOrigin, |
| + &sp, GURL(), |
| + base::Time::Now() - base::TimeDelta::FromHours(1), |
| + clear_cb.callback())); |
| + clear_cb.WaitForResult(); |
| + |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary, |
| + kClientFile)); |
| + EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kTemporary, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent, |
| + kClientFile)); |
| + EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin2, kPersistent, |
| + kClientFile)); |
| + EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kPersistent, |
| + kClientFile)); |
| +} |
| + |
| +TEST_F(StoragePartitionImplTest, RemoveQuotaManagedDataForLastWeek) { |
| + PopulateTestQuotaManagedData(GetMockManager()); |
| + |
| + TestClosureCallback clear_cb; |
| + StoragePartitionImpl sp( |
| + base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); |
| + static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting( |
| + GetMockManager()); |
| + base::MessageLoop::current()->PostTask( |
| + FROM_HERE, base::Bind(&ClearQuotaDataForNonPersistent, |
| + &sp, |
| + base::Time::Now() - base::TimeDelta::FromDays(7), |
| + clear_cb.callback())); |
| + clear_cb.WaitForResult(); |
| + |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent, |
| + kClientFile)); |
| + EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin2, kPersistent, |
| + kClientFile)); |
| + EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kPersistent, |
| + kClientFile)); |
| +} |
| + |
| +TEST_F(StoragePartitionImplTest, RemoveQuotaManagedUnprotectedOrigins) { |
| + // Protect kOrigin1. |
| + scoped_refptr<quota::MockSpecialStoragePolicy> mock_policy = |
| + new quota::MockSpecialStoragePolicy; |
| + mock_policy->AddProtected(kOrigin1.GetOrigin()); |
| + |
| + PopulateTestQuotaManagedData(GetMockManager()); |
| + |
| + TestClosureCallback clear_cb; |
| + StoragePartitionImpl sp( |
| + base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); |
| + static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting( |
| + GetMockManager()); |
| + static_cast<StoragePartitionImpl*>( |
| + &sp)->OverrideSpecialStoragePolicyForTesting(mock_policy); |
| + base::MessageLoop::current()->PostTask( |
| + FROM_HERE, base::Bind(&ClearQuotaDataWithOriginMatcher, |
| + &sp, GURL(), |
| + base::Bind(&DoesOriginMatchForUnprotectedWeb), |
| + base::Time(), clear_cb.callback())); |
| + clear_cb.WaitForResult(); |
| + |
| + EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin1, kTemporary, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kPersistent, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kPersistent, |
| + kClientFile)); |
| +} |
| + |
| +TEST_F(StoragePartitionImplTest, RemoveQuotaManagedProtectedSpecificOrigin) { |
| + // Protect kOrigin1. |
| + scoped_refptr<quota::MockSpecialStoragePolicy> mock_policy = |
| + new quota::MockSpecialStoragePolicy; |
| + mock_policy->AddProtected(kOrigin1.GetOrigin()); |
| + |
| + PopulateTestQuotaManagedData(GetMockManager()); |
| + |
| + TestClosureCallback clear_cb; |
| + StoragePartitionImpl sp( |
| + base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); |
| + static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting( |
| + GetMockManager()); |
| + static_cast<StoragePartitionImpl*>( |
| + &sp)->OverrideSpecialStoragePolicyForTesting(mock_policy); |
| + |
| + // Try to remove kOrigin1. Expect failure. |
| + base::MessageLoop::current()->PostTask( |
| + FROM_HERE, base::Bind(&ClearQuotaDataWithOriginMatcher, |
| + &sp, kOrigin1, |
| + base::Bind(&DoesOriginMatchForUnprotectedWeb), |
| + base::Time(), clear_cb.callback())); |
| + clear_cb.WaitForResult(); |
| + |
| + EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin1, kTemporary, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary, |
| + kClientFile)); |
| + EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kTemporary, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent, |
| + kClientFile)); |
| + EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin2, kPersistent, |
| + kClientFile)); |
| + EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kPersistent, |
| + kClientFile)); |
| +} |
| + |
| +TEST_F(StoragePartitionImplTest, RemoveQuotaManagedProtectedOrigins) { |
| + // Protect kOrigin1. |
| + scoped_refptr<quota::MockSpecialStoragePolicy> mock_policy = |
| + new quota::MockSpecialStoragePolicy; |
| + mock_policy->AddProtected(kOrigin1.GetOrigin()); |
| + |
| + PopulateTestQuotaManagedData(GetMockManager()); |
| + |
| + // Try to remove kOrigin1. Expect success. |
| + TestClosureCallback clear_cb; |
| + StoragePartitionImpl sp( |
| + base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); |
| + static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting( |
| + GetMockManager()); |
| + static_cast<StoragePartitionImpl*>( |
| + &sp)->OverrideSpecialStoragePolicyForTesting(mock_policy); |
| + base::MessageLoop::current()->PostTask( |
| + FROM_HERE, |
| + base::Bind(&ClearQuotaDataWithOriginMatcher, |
| + &sp, GURL(), |
| + base::Bind(&DoesOriginMatchForBothProtectedAndUnprotectedWeb), |
| + base::Time(), clear_cb.callback())); |
| + clear_cb.WaitForResult(); |
| + |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kPersistent, |
| + kClientFile)); |
| + EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kPersistent, |
| + kClientFile)); |
| +} |
| + |
| +TEST_F(StoragePartitionImplTest, RemoveQuotaManagedIgnoreDevTools) { |
| + PopulateTestQuotaManagedNonBrowsingData(GetMockManager()); |
| + |
| + TestClosureCallback clear_cb; |
| + StoragePartitionImpl sp( |
| + base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); |
| + static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting( |
| + GetMockManager()); |
| + base::MessageLoop::current()->PostTask( |
| + FROM_HERE, base::Bind(&ClearQuotaDataWithOriginMatcher, |
| + &sp, GURL(), |
| + base::Bind(&DoesOriginMatchUnprotected), |
| + base::Time(), clear_cb.callback())); |
| + clear_cb.WaitForResult(); |
| + |
| + // Check that devtools data isn't removed. |
| + EXPECT_TRUE(GetMockManager()->OriginHasData(kOriginDevTools, kTemporary, |
| + kClientFile)); |
| + EXPECT_TRUE(GetMockManager()->OriginHasData(kOriginDevTools, kPersistent, |
| + kClientFile)); |
| +} |
| + |
| +TEST_F(StoragePartitionImplTest, RemoveCookieForever) { |
| + RemoveCookieTester tester(GetBrowserContext()); |
| + |
| + tester.AddCookie(); |
| + ASSERT_TRUE(tester.ContainsCookie()); |
| + |
| + TestClosureCallback clear_cb; |
| + StoragePartitionImpl sp( |
| + base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); |
| + sp.SetURLRequestContext(GetBrowserContext()->GetRequestContext()); |
| + base::MessageLoop::current()->PostTask( |
| + FROM_HERE, base::Bind(&ClearCookies, |
| + &sp, base::Time(), base::Time::Max(), |
| + clear_cb.callback())); |
| + clear_cb.WaitForResult(); |
| + |
| + EXPECT_FALSE(tester.ContainsCookie()); |
| +} |
| + |
| +TEST_F(StoragePartitionImplTest, RemoveCookieLastHour) { |
| + RemoveCookieTester tester(GetBrowserContext()); |
| + |
| + tester.AddCookie(); |
| + ASSERT_TRUE(tester.ContainsCookie()); |
| + |
| + TestClosureCallback clear_cb; |
| + StoragePartitionImpl sp( |
| + base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); |
| + base::Time an_hour_ago = base::Time::Now() - base::TimeDelta::FromHours(1); |
| + sp.SetURLRequestContext(GetBrowserContext()->GetRequestContext()); |
| + base::MessageLoop::current()->PostTask( |
| + FROM_HERE, base::Bind(&ClearCookies, |
| + &sp, an_hour_ago, base::Time::Max(), |
| + clear_cb.callback())); |
| + clear_cb.WaitForResult(); |
| + |
| + EXPECT_FALSE(tester.ContainsCookie()); |
| +} |
| + |
| +TEST_F(StoragePartitionImplTest, RemoveUnprotectedLocalStorageForever) { |
| + // Protect kOrigin1. |
| + scoped_refptr<quota::MockSpecialStoragePolicy> mock_policy = |
| + new quota::MockSpecialStoragePolicy; |
| + mock_policy->AddProtected(kOrigin1.GetOrigin()); |
| + |
| + RemoveLocalStorageTester tester(GetBrowserContext()); |
| + |
| + tester.AddDOMStorageTestData(); |
| + EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin1)); |
| + EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin2)); |
| + EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin3)); |
| + |
| + TestClosureCallback clear_cb; |
| + DOMStorageContextWrapper* dom_storage_context = |
| + static_cast<DOMStorageContextWrapper*>( |
| + content::BrowserContext::GetDefaultStoragePartition( |
| + GetBrowserContext())->GetDOMStorageContext()); |
| + StoragePartitionImpl sp(base::FilePath(), NULL, NULL, NULL, NULL, |
| + dom_storage_context, NULL, NULL, NULL, NULL); |
| + static_cast<StoragePartitionImpl*>( |
| + &sp)->OverrideSpecialStoragePolicyForTesting(mock_policy); |
| + base::MessageLoop::current()->PostTask( |
| + FROM_HERE, |
| + base::Bind(&ClearStuff, |
| + StoragePartitionImpl::REMOVE_DATA_MASK_LOCAL_STORAGE, |
| + &sp, base::Time(), base::Time::Max(), |
| + base::Bind(&DoesOriginMatchForUnprotectedWeb), |
| + clear_cb.callback())); |
| + clear_cb.WaitForResult(); |
| + |
| + EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin1)); |
| + EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin2)); |
| + EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin3)); |
| +} |
| + |
| +TEST_F(StoragePartitionImplTest, RemoveProtectedLocalStorageForever) { |
| + // Protect kOrigin1. |
| + scoped_refptr<quota::MockSpecialStoragePolicy> mock_policy = |
| + new quota::MockSpecialStoragePolicy; |
| + mock_policy->AddProtected(kOrigin1.GetOrigin()); |
| + |
| + RemoveLocalStorageTester tester(GetBrowserContext()); |
| + |
| + tester.AddDOMStorageTestData(); |
| + EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin1)); |
| + EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin2)); |
| + EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin3)); |
| + |
| + TestClosureCallback clear_cb; |
| + DOMStorageContextWrapper* dom_storage_context = |
| + static_cast<DOMStorageContextWrapper*>( |
| + content::BrowserContext::GetDefaultStoragePartition( |
| + GetBrowserContext())->GetDOMStorageContext()); |
| + StoragePartitionImpl sp(base::FilePath(), NULL, NULL, NULL, NULL, |
| + dom_storage_context, NULL, NULL, NULL, NULL); |
| + static_cast<StoragePartitionImpl*>( |
| + &sp)->OverrideSpecialStoragePolicyForTesting(mock_policy); |
| + base::MessageLoop::current()->PostTask( |
| + FROM_HERE, |
| + base::Bind(&ClearStuff, |
| + StoragePartitionImpl::REMOVE_DATA_MASK_LOCAL_STORAGE, |
| + &sp, base::Time(), base::Time::Max(), |
| + base::Bind(&DoesOriginMatchForBothProtectedAndUnprotectedWeb), |
| + clear_cb.callback())); |
| + clear_cb.WaitForResult(); |
| + |
| + // Even if kOrigin1 is protected, it will be deleted since we specify |
| + // ClearData to delete protected data. |
| + EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin1)); |
| + EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin2)); |
| + EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin3)); |
| +} |
| + |
| +TEST_F(StoragePartitionImplTest, RemoveLocalStorageForLastWeek) { |
| + RemoveLocalStorageTester tester(GetBrowserContext()); |
| + |
| + tester.AddDOMStorageTestData(); |
| + EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin1)); |
| + EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin2)); |
| + EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin3)); |
| + |
| + TestClosureCallback clear_cb; |
| + DOMStorageContextWrapper* dom_storage_context = |
| + static_cast<DOMStorageContextWrapper*>( |
| + content::BrowserContext::GetDefaultStoragePartition( |
| + GetBrowserContext())->GetDOMStorageContext()); |
| + StoragePartitionImpl sp(base::FilePath(), NULL, NULL, NULL, NULL, |
| + dom_storage_context, NULL, NULL, NULL, NULL); |
| + base::Time a_week_ago = base::Time::Now() - base::TimeDelta::FromDays(7); |
| + base::MessageLoop::current()->PostTask( |
| + FROM_HERE, |
| + base::Bind(&ClearStuff, |
| + StoragePartitionImpl::REMOVE_DATA_MASK_LOCAL_STORAGE, |
| + &sp, a_week_ago, base::Time::Max(), |
| + base::Bind(&DoesOriginMatchForBothProtectedAndUnprotectedWeb), |
| + clear_cb.callback())); |
| + clear_cb.WaitForResult(); |
| + |
| + // kOrigin1 and kOrigin2 do not have age more than a week. |
| + EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin1)); |
| + EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin2)); |
| + EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin3)); |
| +} |
| + |
| } // namespace content |