blob: ef3b67912ac377db7c35d7a074edf331b2390f2c [file] [log] [blame]
[email protected]877e2612013-04-05 05:58:181// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]88562b512013-11-06 21:10:445#include "base/file_util.h"
[email protected]877e2612013-04-05 05:58:186#include "base/files/scoped_temp_dir.h"
7#include "base/message_loop/message_loop_proxy.h"
8#include "base/run_loop.h"
9#include "base/threading/thread.h"
10#include "content/browser/browser_thread_impl.h"
11#include "content/browser/gpu/shader_disk_cache.h"
12#include "content/browser/storage_partition_impl.h"
[email protected]88562b512013-11-06 21:10:4413#include "content/public/browser/local_storage_usage_info.h"
[email protected]877e2612013-04-05 05:58:1814#include "content/public/browser/storage_partition.h"
[email protected]88562b512013-11-06 21:10:4415#include "content/public/test/test_browser_context.h"
16#include "content/public/test/test_browser_thread.h"
[email protected]ec04d3f2013-06-06 21:31:3917#include "content/public/test/test_browser_thread_bundle.h"
[email protected]877e2612013-04-05 05:58:1818#include "net/base/test_completion_callback.h"
[email protected]88562b512013-11-06 21:10:4419#include "net/cookies/cookie_monster.h"
20#include "net/url_request/url_request_context.h"
21#include "net/url_request/url_request_context_getter.h"
[email protected]877e2612013-04-05 05:58:1822#include "testing/gtest/include/gtest/gtest.h"
[email protected]88562b512013-11-06 21:10:4423#include "webkit/browser/quota/mock_quota_manager.h"
24#include "webkit/browser/quota/mock_special_storage_policy.h"
25#include "webkit/browser/quota/quota_manager.h"
[email protected]877e2612013-04-05 05:58:1826
27namespace content {
28namespace {
29
[email protected]88562b512013-11-06 21:10:4430const int kDefaultClientId = 42;
31const char kCacheKey[] = "key";
32const char kCacheValue[] = "cached value";
33
34const char kTestOrigin1[] = "http://host1:1/";
35const char kTestOrigin2[] = "http://host2:1/";
36const char kTestOrigin3[] = "http://host3:1/";
37const char kTestOriginDevTools[] = "chrome-devtools://abcdefghijklmnopqrstuvw/";
38
39const GURL kOrigin1(kTestOrigin1);
40const GURL kOrigin2(kTestOrigin2);
41const GURL kOrigin3(kTestOrigin3);
42const GURL kOriginDevTools(kTestOriginDevTools);
43
44const base::FilePath::CharType kDomStorageOrigin1[] =
45 FILE_PATH_LITERAL("http_host1_1.localstorage");
46
47const base::FilePath::CharType kDomStorageOrigin2[] =
48 FILE_PATH_LITERAL("http_host2_1.localstorage");
49
50const base::FilePath::CharType kDomStorageOrigin3[] =
51 FILE_PATH_LITERAL("http_host3_1.localstorage");
52
53const quota::StorageType kTemporary = quota::kStorageTypeTemporary;
54const quota::StorageType kPersistent = quota::kStorageTypePersistent;
55
56const quota::QuotaClient::ID kClientFile = quota::QuotaClient::kFileSystem;
57
58const uint32 kAllQuotaRemoveMask =
59 StoragePartition::REMOVE_DATA_MASK_INDEXEDDB |
60 StoragePartition::REMOVE_DATA_MASK_WEBSQL |
61 StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS |
62 StoragePartition::REMOVE_DATA_MASK_APPCACHE;
63
[email protected]877e2612013-04-05 05:58:1864class TestClosureCallback {
65 public:
66 TestClosureCallback()
[email protected]69e797f2013-04-30 01:10:2267 : callback_(base::Bind(
68 &TestClosureCallback::StopWaiting, base::Unretained(this))) {
[email protected]877e2612013-04-05 05:58:1869 }
70
71 void WaitForResult() {
72 wait_run_loop_.reset(new base::RunLoop());
73 wait_run_loop_->Run();
74 }
75
76 const base::Closure& callback() { return callback_; }
77
78 private:
79 void StopWaiting() {
80 wait_run_loop_->Quit();
81 }
82
83 base::Closure callback_;
84 scoped_ptr<base::RunLoop> wait_run_loop_;
85
86 DISALLOW_COPY_AND_ASSIGN(TestClosureCallback);
87};
88
[email protected]88562b512013-11-06 21:10:4489class AwaitCompletionHelper {
90 public:
91 AwaitCompletionHelper() : start_(false), already_quit_(false) {}
92 virtual ~AwaitCompletionHelper() {}
93
94 void BlockUntilNotified() {
95 if (!already_quit_) {
96 DCHECK(!start_);
97 start_ = true;
98 base::MessageLoop::current()->Run();
99 } else {
100 DCHECK(!start_);
101 already_quit_ = false;
102 }
103 }
104
105 void Notify() {
106 if (start_) {
107 DCHECK(!already_quit_);
108 base::MessageLoop::current()->Quit();
109 start_ = false;
110 } else {
111 DCHECK(!already_quit_);
112 already_quit_ = true;
113 }
114 }
115
[email protected]88562b512013-11-06 21:10:44116 private:
117 // Helps prevent from running message_loop, if the callback invoked
118 // immediately.
119 bool start_;
120 bool already_quit_;
121
122 DISALLOW_COPY_AND_ASSIGN(AwaitCompletionHelper);
123};
124
125class RemoveCookieTester {
126 public:
127 explicit RemoveCookieTester(TestBrowserContext* context)
128 : get_cookie_success_(false), monster_(NULL) {
129 SetMonster(context->GetRequestContext()->GetURLRequestContext()->
130 cookie_store()->GetCookieMonster());
131 }
132
133 // Returns true, if the given cookie exists in the cookie store.
134 bool ContainsCookie() {
135 get_cookie_success_ = false;
136 monster_->GetCookiesWithOptionsAsync(
137 kOrigin1, net::CookieOptions(),
138 base::Bind(&RemoveCookieTester::GetCookieCallback,
139 base::Unretained(this)));
140 await_completion_.BlockUntilNotified();
141 return get_cookie_success_;
142 }
143
144 void AddCookie() {
145 monster_->SetCookieWithOptionsAsync(
146 kOrigin1, "A=1", net::CookieOptions(),
147 base::Bind(&RemoveCookieTester::SetCookieCallback,
148 base::Unretained(this)));
149 await_completion_.BlockUntilNotified();
150 }
151
152 protected:
153 void SetMonster(net::CookieStore* monster) {
154 monster_ = monster;
155 }
156
157 private:
158 void GetCookieCallback(const std::string& cookies) {
159 if (cookies == "A=1") {
160 get_cookie_success_ = true;
161 } else {
162 EXPECT_EQ("", cookies);
163 get_cookie_success_ = false;
164 }
165 await_completion_.Notify();
166 }
167
168 void SetCookieCallback(bool result) {
169 ASSERT_TRUE(result);
170 await_completion_.Notify();
171 }
172
173 bool get_cookie_success_;
174 AwaitCompletionHelper await_completion_;
175 net::CookieStore* monster_;
176
177 DISALLOW_COPY_AND_ASSIGN(RemoveCookieTester);
178};
179
180class RemoveLocalStorageTester {
181 public:
182 explicit RemoveLocalStorageTester(TestBrowserContext* profile)
183 : profile_(profile), dom_storage_context_(NULL) {
184 dom_storage_context_ =
185 content::BrowserContext::GetDefaultStoragePartition(profile)->
186 GetDOMStorageContext();
187 }
188
189 // Returns true, if the given origin URL exists.
190 bool DOMStorageExistsForOrigin(const GURL& origin) {
191 GetLocalStorageUsage();
192 await_completion_.BlockUntilNotified();
193 for (size_t i = 0; i < infos_.size(); ++i) {
194 if (origin == infos_[i].origin)
195 return true;
196 }
197 return false;
198 }
199
200 void AddDOMStorageTestData() {
201 // Note: This test depends on details of how the dom_storage library
202 // stores data in the host file system.
203 base::FilePath storage_path =
204 profile_->GetPath().AppendASCII("Local Storage");
[email protected]426d1c92013-12-03 20:08:54205 base::CreateDirectory(storage_path);
[email protected]88562b512013-11-06 21:10:44206
207 // Write some files.
208 file_util::WriteFile(storage_path.Append(kDomStorageOrigin1), NULL, 0);
209 file_util::WriteFile(storage_path.Append(kDomStorageOrigin2), NULL, 0);
210 file_util::WriteFile(storage_path.Append(kDomStorageOrigin3), NULL, 0);
211
212 // Tweak their dates.
[email protected]c0d508162013-12-04 22:49:00213 base::Time now = base::Time::Now();
214 base::TouchFile(storage_path.Append(kDomStorageOrigin1), now, now);
215
216 base::Time one_day_ago = now - base::TimeDelta::FromDays(1);
217 base::TouchFile(storage_path.Append(kDomStorageOrigin2),
218 one_day_ago, one_day_ago);
219
220 base::Time sixty_days_ago = now - base::TimeDelta::FromDays(60);
221 base::TouchFile(storage_path.Append(kDomStorageOrigin3),
222 sixty_days_ago, sixty_days_ago);
[email protected]88562b512013-11-06 21:10:44223 }
224
225 private:
226 void GetLocalStorageUsage() {
227 dom_storage_context_->GetLocalStorageUsage(
228 base::Bind(&RemoveLocalStorageTester::OnGotLocalStorageUsage,
229 base::Unretained(this)));
230 }
231 void OnGotLocalStorageUsage(
232 const std::vector<content::LocalStorageUsageInfo>& infos) {
233 infos_ = infos;
234 await_completion_.Notify();
235 }
236
237 // We don't own these pointers.
238 TestBrowserContext* profile_;
239 content::DOMStorageContext* dom_storage_context_;
240
241 std::vector<content::LocalStorageUsageInfo> infos_;
242
243 AwaitCompletionHelper await_completion_;
244
245 DISALLOW_COPY_AND_ASSIGN(RemoveLocalStorageTester);
246};
247
248bool IsWebSafeSchemeForTest(const std::string& scheme) {
249 return scheme == "http";
250}
251
252bool DoesOriginMatchForUnprotectedWeb(
253 const GURL& origin,
254 quota::SpecialStoragePolicy* special_storage_policy) {
[email protected]8c63cd22013-11-08 11:31:21255 if (IsWebSafeSchemeForTest(origin.scheme()))
[email protected]88562b512013-11-06 21:10:44256 return !special_storage_policy->IsStorageProtected(origin.GetOrigin());
257
[email protected]8c63cd22013-11-08 11:31:21258 return false;
[email protected]88562b512013-11-06 21:10:44259}
260
261bool DoesOriginMatchForBothProtectedAndUnprotectedWeb(
262 const GURL& origin,
263 quota::SpecialStoragePolicy* special_storage_policy) {
264 return true;
265}
266
267bool DoesOriginMatchUnprotected(
268 const GURL& origin,
269 quota::SpecialStoragePolicy* special_storage_policy) {
270 return origin.GetOrigin().scheme() != kOriginDevTools.scheme();
271}
272
273void ClearQuotaData(content::StoragePartition* storage_partition,
274 const base::Closure& cb) {
275 storage_partition->ClearData(
276 kAllQuotaRemoveMask,
277 StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL,
278 NULL, StoragePartition::OriginMatcherFunction(),
279 base::Time(), base::Time::Max(), cb);
280}
281
282void ClearQuotaDataWithOriginMatcher(
283 content::StoragePartition* storage_partition,
284 const GURL& remove_origin,
285 const StoragePartition::OriginMatcherFunction& origin_matcher,
286 const base::Time delete_begin,
287 const base::Closure& cb) {
288 storage_partition->ClearData(kAllQuotaRemoveMask,
289 StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL,
290 &remove_origin, origin_matcher, delete_begin,
291 base::Time::Max(), cb);
292}
293
294void ClearQuotaDataForOrigin(
295 content::StoragePartition* storage_partition,
296 const GURL& remove_origin,
297 const base::Time delete_begin,
298 const base::Closure& cb) {
299 ClearQuotaDataWithOriginMatcher(
300 storage_partition, remove_origin,
301 StoragePartition::OriginMatcherFunction(), delete_begin, cb);
302}
303
304void ClearQuotaDataForNonPersistent(
305 content::StoragePartition* storage_partition,
306 const base::Time delete_begin,
307 const base::Closure& cb) {
308 uint32 quota_storage_remove_mask_no_persistent =
309 StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL &
310 ~StoragePartition::QUOTA_MANAGED_STORAGE_MASK_PERSISTENT;
311 storage_partition->ClearData(
312 kAllQuotaRemoveMask, quota_storage_remove_mask_no_persistent,
313 NULL, StoragePartition::OriginMatcherFunction(),
314 delete_begin, base::Time::Max(), cb);
315}
316
317void ClearCookies(content::StoragePartition* storage_partition,
318 const base::Time delete_begin,
319 const base::Time delete_end,
320 const base::Closure& cb) {
321 storage_partition->ClearData(
322 StoragePartition::REMOVE_DATA_MASK_COOKIES,
323 StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL,
324 NULL, StoragePartition::OriginMatcherFunction(),
325 delete_begin, delete_end, cb);
326}
327
328void ClearStuff(uint32 remove_mask,
329 content::StoragePartition* storage_partition,
330 const base::Time delete_begin,
331 const base::Time delete_end,
332 const StoragePartition::OriginMatcherFunction& origin_matcher,
333 const base::Closure& cb) {
334 storage_partition->ClearData(
335 remove_mask, StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL,
336 NULL, origin_matcher, delete_begin, delete_end, cb);
337}
[email protected]877e2612013-04-05 05:58:18338
339} // namespace
340
[email protected]88562b512013-11-06 21:10:44341class StoragePartitionImplTest : public testing::Test {
342 public:
343 StoragePartitionImplTest()
344 : browser_context_(new TestBrowserContext()),
345 thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) {
346 }
347 virtual ~StoragePartitionImplTest() {}
348
349 quota::MockQuotaManager* GetMockManager() {
350 if (!quota_manager_.get()) {
351 quota_manager_ = new quota::MockQuotaManager(
352 browser_context_->IsOffTheRecord(),
353 browser_context_->GetPath(),
354 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO).get(),
355 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB).get(),
356 browser_context_->GetSpecialStoragePolicy());
357 }
358 return quota_manager_.get();
359 }
360
361 TestBrowserContext* GetBrowserContext() {
362 return browser_context_.get();
363 }
364
365 private:
366 scoped_ptr<TestBrowserContext> browser_context_;
367 scoped_refptr<quota::MockQuotaManager> quota_manager_;
368 content::TestBrowserThreadBundle thread_bundle_;
369
370 DISALLOW_COPY_AND_ASSIGN(StoragePartitionImplTest);
371};
372
[email protected]877e2612013-04-05 05:58:18373class StoragePartitionShaderClearTest : public testing::Test {
374 public:
[email protected]ec04d3f2013-06-06 21:31:39375 StoragePartitionShaderClearTest()
376 : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) {
[email protected]877e2612013-04-05 05:58:18377 }
378
379 virtual ~StoragePartitionShaderClearTest() {}
380
381 const base::FilePath& cache_path() { return temp_dir_.path(); }
382
383 virtual void SetUp() OVERRIDE {
384 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
385 ShaderCacheFactory::GetInstance()->SetCacheInfo(kDefaultClientId,
386 cache_path());
387
388 cache_ = ShaderCacheFactory::GetInstance()->Get(kDefaultClientId);
389 ASSERT_TRUE(cache_.get() != NULL);
390 }
391
392 void InitCache() {
393 net::TestCompletionCallback available_cb;
394 int rv = cache_->SetAvailableCallback(available_cb.callback());
395 ASSERT_EQ(net::OK, available_cb.GetResult(rv));
396 EXPECT_EQ(0, cache_->Size());
397
398 cache_->Cache(kCacheKey, kCacheValue);
399
400 net::TestCompletionCallback complete_cb;
401
402 rv = cache_->SetCacheCompleteCallback(complete_cb.callback());
403 ASSERT_EQ(net::OK, complete_cb.GetResult(rv));
404 }
405
406 size_t Size() { return cache_->Size(); }
407
[email protected]877e2612013-04-05 05:58:18408 private:
409 virtual void TearDown() OVERRIDE {
410 cache_ = NULL;
411 ShaderCacheFactory::GetInstance()->RemoveCacheInfo(kDefaultClientId);
412 }
413
414 base::ScopedTempDir temp_dir_;
[email protected]ec04d3f2013-06-06 21:31:39415 content::TestBrowserThreadBundle thread_bundle_;
[email protected]877e2612013-04-05 05:58:18416
417 scoped_refptr<ShaderDiskCache> cache_;
418};
419
420void ClearData(content::StoragePartitionImpl* sp,
421 const base::Closure& cb) {
422 base::Time time;
[email protected]88562b512013-11-06 21:10:44423 sp->ClearData(
[email protected]fdf3e13c2013-07-31 06:23:46424 StoragePartition::REMOVE_DATA_MASK_SHADER_CACHE,
[email protected]b1272d52013-08-02 19:26:05425 StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL,
[email protected]88562b512013-11-06 21:10:44426 NULL, StoragePartition::OriginMatcherFunction(),
[email protected]fdf3e13c2013-07-31 06:23:46427 time, time, cb);
[email protected]877e2612013-04-05 05:58:18428}
429
[email protected]88562b512013-11-06 21:10:44430// Tests ---------------------------------------------------------------------
431
[email protected]877e2612013-04-05 05:58:18432TEST_F(StoragePartitionShaderClearTest, ClearShaderCache) {
433 InitCache();
434 EXPECT_EQ(1u, Size());
435
436 TestClosureCallback clear_cb;
[email protected]88562b512013-11-06 21:10:44437 StoragePartitionImpl storage_partition(
438 cache_path(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
[email protected]ec04d3f2013-06-06 21:31:39439 base::MessageLoop::current()->PostTask(
[email protected]88562b512013-11-06 21:10:44440 FROM_HERE, base::Bind(&ClearData, &storage_partition,
441 clear_cb.callback()));
[email protected]877e2612013-04-05 05:58:18442 clear_cb.WaitForResult();
443 EXPECT_EQ(0u, Size());
444}
445
[email protected]88562b512013-11-06 21:10:44446TEST_F(StoragePartitionImplTest, QuotaClientMaskGeneration) {
447 EXPECT_EQ(quota::QuotaClient::kFileSystem,
448 StoragePartitionImpl::GenerateQuotaClientMask(
449 StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS));
450 EXPECT_EQ(quota::QuotaClient::kDatabase,
451 StoragePartitionImpl::GenerateQuotaClientMask(
452 StoragePartition::REMOVE_DATA_MASK_WEBSQL));
453 EXPECT_EQ(quota::QuotaClient::kAppcache,
454 StoragePartitionImpl::GenerateQuotaClientMask(
455 StoragePartition::REMOVE_DATA_MASK_APPCACHE));
456 EXPECT_EQ(quota::QuotaClient::kIndexedDatabase,
457 StoragePartitionImpl::GenerateQuotaClientMask(
458 StoragePartition::REMOVE_DATA_MASK_INDEXEDDB));
459 EXPECT_EQ(quota::QuotaClient::kFileSystem |
460 quota::QuotaClient::kDatabase |
461 quota::QuotaClient::kAppcache |
462 quota::QuotaClient::kIndexedDatabase,
463 StoragePartitionImpl::GenerateQuotaClientMask(
464 StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS |
465 StoragePartition::REMOVE_DATA_MASK_WEBSQL |
466 StoragePartition::REMOVE_DATA_MASK_APPCACHE |
467 StoragePartition::REMOVE_DATA_MASK_INDEXEDDB));
468}
469
470void PopulateTestQuotaManagedPersistentData(quota::MockQuotaManager* manager) {
471 manager->AddOrigin(kOrigin2, kPersistent, kClientFile, base::Time());
472 manager->AddOrigin(kOrigin3, kPersistent, kClientFile,
473 base::Time::Now() - base::TimeDelta::FromDays(1));
474
475 EXPECT_FALSE(manager->OriginHasData(kOrigin1, kPersistent, kClientFile));
476 EXPECT_TRUE(manager->OriginHasData(kOrigin2, kPersistent, kClientFile));
477 EXPECT_TRUE(manager->OriginHasData(kOrigin3, kPersistent, kClientFile));
478}
479
480void PopulateTestQuotaManagedTemporaryData(quota::MockQuotaManager* manager) {
481 manager->AddOrigin(kOrigin1, kTemporary, kClientFile, base::Time::Now());
482 manager->AddOrigin(kOrigin3, kTemporary, kClientFile,
483 base::Time::Now() - base::TimeDelta::FromDays(1));
484
485 EXPECT_TRUE(manager->OriginHasData(kOrigin1, kTemporary, kClientFile));
486 EXPECT_FALSE(manager->OriginHasData(kOrigin2, kTemporary, kClientFile));
487 EXPECT_TRUE(manager->OriginHasData(kOrigin3, kTemporary, kClientFile));
488}
489
490void PopulateTestQuotaManagedData(quota::MockQuotaManager* manager) {
491 // Set up kOrigin1 with a temporary quota, kOrigin2 with a persistent
492 // quota, and kOrigin3 with both. kOrigin1 is modified now, kOrigin2
493 // is modified at the beginning of time, and kOrigin3 is modified one day
494 // ago.
495 PopulateTestQuotaManagedPersistentData(manager);
496 PopulateTestQuotaManagedTemporaryData(manager);
497}
498
499void PopulateTestQuotaManagedNonBrowsingData(quota::MockQuotaManager* manager) {
500 manager->AddOrigin(kOriginDevTools, kTemporary, kClientFile, base::Time());
501 manager->AddOrigin(kOriginDevTools, kPersistent, kClientFile, base::Time());
502}
503
504TEST_F(StoragePartitionImplTest, RemoveQuotaManagedDataForeverBoth) {
505 PopulateTestQuotaManagedData(GetMockManager());
506
507 TestClosureCallback clear_cb;
508 StoragePartitionImpl sp(
509 base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
510 static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting(
511 GetMockManager());
512 base::MessageLoop::current()->PostTask(
513 FROM_HERE, base::Bind(&ClearQuotaData, &sp, clear_cb.callback()));
514 clear_cb.WaitForResult();
515
516 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary,
517 kClientFile));
518 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary,
519 kClientFile));
520 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary,
521 kClientFile));
522 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent,
523 kClientFile));
524 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kPersistent,
525 kClientFile));
526 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kPersistent,
527 kClientFile));
528}
529
530TEST_F(StoragePartitionImplTest, RemoveQuotaManagedDataForeverOnlyTemporary) {
531 PopulateTestQuotaManagedTemporaryData(GetMockManager());
532
533 TestClosureCallback clear_cb;
534 StoragePartitionImpl sp(
535 base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
536 static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting(
537 GetMockManager());
538 base::MessageLoop::current()->PostTask(
539 FROM_HERE, base::Bind(&ClearQuotaData, &sp, clear_cb.callback()));
540 clear_cb.WaitForResult();
541
542 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary,
543 kClientFile));
544 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary,
545 kClientFile));
546 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary,
547 kClientFile));
548 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent,
549 kClientFile));
550 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kPersistent,
551 kClientFile));
552 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kPersistent,
553 kClientFile));
554}
555
556TEST_F(StoragePartitionImplTest, RemoveQuotaManagedDataForeverOnlyPersistent) {
557 PopulateTestQuotaManagedPersistentData(GetMockManager());
558
559 TestClosureCallback clear_cb;
560 StoragePartitionImpl sp(
561 base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
562 static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting(
563 GetMockManager());
564 base::MessageLoop::current()->PostTask(
565 FROM_HERE, base::Bind(&ClearQuotaData, &sp, clear_cb.callback()));
566 clear_cb.WaitForResult();
567
568 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary,
569 kClientFile));
570 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary,
571 kClientFile));
572 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary,
573 kClientFile));
574 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent,
575 kClientFile));
576 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kPersistent,
577 kClientFile));
578 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kPersistent,
579 kClientFile));
580}
581
582TEST_F(StoragePartitionImplTest, RemoveQuotaManagedDataForeverNeither) {
583 TestClosureCallback clear_cb;
584 StoragePartitionImpl sp(
585 base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
586 static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting(
587 GetMockManager());
588 base::MessageLoop::current()->PostTask(
589 FROM_HERE, base::Bind(&ClearQuotaData, &sp, clear_cb.callback()));
590 clear_cb.WaitForResult();
591
592 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary,
593 kClientFile));
594 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary,
595 kClientFile));
596 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary,
597 kClientFile));
598 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent,
599 kClientFile));
600 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kPersistent,
601 kClientFile));
602 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kPersistent,
603 kClientFile));
604}
605
606TEST_F(StoragePartitionImplTest, RemoveQuotaManagedDataForeverSpecificOrigin) {
607 PopulateTestQuotaManagedData(GetMockManager());
608
609 TestClosureCallback clear_cb;
610 StoragePartitionImpl sp(
611 base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
612 static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting(
613 GetMockManager());
614 base::MessageLoop::current()->PostTask(
615 FROM_HERE, base::Bind(&ClearQuotaDataForOrigin,
616 &sp, kOrigin1, base::Time(), clear_cb.callback()));
617 clear_cb.WaitForResult();
618
619 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary,
620 kClientFile));
621 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary,
622 kClientFile));
623 EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kTemporary,
624 kClientFile));
625 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent,
626 kClientFile));
627 EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin2, kPersistent,
628 kClientFile));
629 EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kPersistent,
630 kClientFile));
631}
632
633TEST_F(StoragePartitionImplTest, RemoveQuotaManagedDataForLastHour) {
634 PopulateTestQuotaManagedData(GetMockManager());
635
636 TestClosureCallback clear_cb;
637 StoragePartitionImpl sp(
638 base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
639 static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting(
640 GetMockManager());
641 base::MessageLoop::current()->PostTask(
642 FROM_HERE, base::Bind(&ClearQuotaDataForOrigin,
643 &sp, GURL(),
644 base::Time::Now() - base::TimeDelta::FromHours(1),
645 clear_cb.callback()));
646 clear_cb.WaitForResult();
647
648 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary,
649 kClientFile));
650 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary,
651 kClientFile));
652 EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kTemporary,
653 kClientFile));
654 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent,
655 kClientFile));
656 EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin2, kPersistent,
657 kClientFile));
658 EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kPersistent,
659 kClientFile));
660}
661
662TEST_F(StoragePartitionImplTest, RemoveQuotaManagedDataForLastWeek) {
663 PopulateTestQuotaManagedData(GetMockManager());
664
665 TestClosureCallback clear_cb;
666 StoragePartitionImpl sp(
667 base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
668 static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting(
669 GetMockManager());
670 base::MessageLoop::current()->PostTask(
671 FROM_HERE, base::Bind(&ClearQuotaDataForNonPersistent,
672 &sp,
673 base::Time::Now() - base::TimeDelta::FromDays(7),
674 clear_cb.callback()));
675 clear_cb.WaitForResult();
676
677 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary,
678 kClientFile));
679 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary,
680 kClientFile));
681 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary,
682 kClientFile));
683 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent,
684 kClientFile));
685 EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin2, kPersistent,
686 kClientFile));
687 EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kPersistent,
688 kClientFile));
689}
690
691TEST_F(StoragePartitionImplTest, RemoveQuotaManagedUnprotectedOrigins) {
692 // Protect kOrigin1.
693 scoped_refptr<quota::MockSpecialStoragePolicy> mock_policy =
694 new quota::MockSpecialStoragePolicy;
695 mock_policy->AddProtected(kOrigin1.GetOrigin());
696
697 PopulateTestQuotaManagedData(GetMockManager());
698
699 TestClosureCallback clear_cb;
700 StoragePartitionImpl sp(
701 base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
702 static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting(
703 GetMockManager());
704 static_cast<StoragePartitionImpl*>(
705 &sp)->OverrideSpecialStoragePolicyForTesting(mock_policy);
706 base::MessageLoop::current()->PostTask(
707 FROM_HERE, base::Bind(&ClearQuotaDataWithOriginMatcher,
708 &sp, GURL(),
709 base::Bind(&DoesOriginMatchForUnprotectedWeb),
710 base::Time(), clear_cb.callback()));
711 clear_cb.WaitForResult();
712
713 EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin1, kTemporary,
714 kClientFile));
715 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary,
716 kClientFile));
717 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary,
718 kClientFile));
719 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent,
720 kClientFile));
721 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kPersistent,
722 kClientFile));
723 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kPersistent,
724 kClientFile));
725}
726
727TEST_F(StoragePartitionImplTest, RemoveQuotaManagedProtectedSpecificOrigin) {
728 // Protect kOrigin1.
729 scoped_refptr<quota::MockSpecialStoragePolicy> mock_policy =
730 new quota::MockSpecialStoragePolicy;
731 mock_policy->AddProtected(kOrigin1.GetOrigin());
732
733 PopulateTestQuotaManagedData(GetMockManager());
734
735 TestClosureCallback clear_cb;
736 StoragePartitionImpl sp(
737 base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
738 static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting(
739 GetMockManager());
740 static_cast<StoragePartitionImpl*>(
741 &sp)->OverrideSpecialStoragePolicyForTesting(mock_policy);
742
743 // Try to remove kOrigin1. Expect failure.
744 base::MessageLoop::current()->PostTask(
745 FROM_HERE, base::Bind(&ClearQuotaDataWithOriginMatcher,
746 &sp, kOrigin1,
747 base::Bind(&DoesOriginMatchForUnprotectedWeb),
748 base::Time(), clear_cb.callback()));
749 clear_cb.WaitForResult();
750
751 EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin1, kTemporary,
752 kClientFile));
753 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary,
754 kClientFile));
755 EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kTemporary,
756 kClientFile));
757 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent,
758 kClientFile));
759 EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin2, kPersistent,
760 kClientFile));
761 EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kPersistent,
762 kClientFile));
763}
764
765TEST_F(StoragePartitionImplTest, RemoveQuotaManagedProtectedOrigins) {
766 // Protect kOrigin1.
767 scoped_refptr<quota::MockSpecialStoragePolicy> mock_policy =
768 new quota::MockSpecialStoragePolicy;
769 mock_policy->AddProtected(kOrigin1.GetOrigin());
770
771 PopulateTestQuotaManagedData(GetMockManager());
772
773 // Try to remove kOrigin1. Expect success.
774 TestClosureCallback clear_cb;
775 StoragePartitionImpl sp(
776 base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
777 static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting(
778 GetMockManager());
779 static_cast<StoragePartitionImpl*>(
780 &sp)->OverrideSpecialStoragePolicyForTesting(mock_policy);
781 base::MessageLoop::current()->PostTask(
782 FROM_HERE,
783 base::Bind(&ClearQuotaDataWithOriginMatcher,
784 &sp, GURL(),
785 base::Bind(&DoesOriginMatchForBothProtectedAndUnprotectedWeb),
786 base::Time(), clear_cb.callback()));
787 clear_cb.WaitForResult();
788
789 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary,
790 kClientFile));
791 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary,
792 kClientFile));
793 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary,
794 kClientFile));
795 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent,
796 kClientFile));
797 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kPersistent,
798 kClientFile));
799 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kPersistent,
800 kClientFile));
801}
802
803TEST_F(StoragePartitionImplTest, RemoveQuotaManagedIgnoreDevTools) {
804 PopulateTestQuotaManagedNonBrowsingData(GetMockManager());
805
806 TestClosureCallback clear_cb;
807 StoragePartitionImpl sp(
808 base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
809 static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting(
810 GetMockManager());
811 base::MessageLoop::current()->PostTask(
812 FROM_HERE, base::Bind(&ClearQuotaDataWithOriginMatcher,
813 &sp, GURL(),
814 base::Bind(&DoesOriginMatchUnprotected),
815 base::Time(), clear_cb.callback()));
816 clear_cb.WaitForResult();
817
818 // Check that devtools data isn't removed.
819 EXPECT_TRUE(GetMockManager()->OriginHasData(kOriginDevTools, kTemporary,
820 kClientFile));
821 EXPECT_TRUE(GetMockManager()->OriginHasData(kOriginDevTools, kPersistent,
822 kClientFile));
823}
824
825TEST_F(StoragePartitionImplTest, RemoveCookieForever) {
826 RemoveCookieTester tester(GetBrowserContext());
827
828 tester.AddCookie();
829 ASSERT_TRUE(tester.ContainsCookie());
830
831 TestClosureCallback clear_cb;
832 StoragePartitionImpl sp(
833 base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
834 sp.SetURLRequestContext(GetBrowserContext()->GetRequestContext());
835 base::MessageLoop::current()->PostTask(
836 FROM_HERE, base::Bind(&ClearCookies,
837 &sp, base::Time(), base::Time::Max(),
838 clear_cb.callback()));
839 clear_cb.WaitForResult();
840
841 EXPECT_FALSE(tester.ContainsCookie());
842}
843
844TEST_F(StoragePartitionImplTest, RemoveCookieLastHour) {
845 RemoveCookieTester tester(GetBrowserContext());
846
847 tester.AddCookie();
848 ASSERT_TRUE(tester.ContainsCookie());
849
850 TestClosureCallback clear_cb;
851 StoragePartitionImpl sp(
852 base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
853 base::Time an_hour_ago = base::Time::Now() - base::TimeDelta::FromHours(1);
854 sp.SetURLRequestContext(GetBrowserContext()->GetRequestContext());
855 base::MessageLoop::current()->PostTask(
856 FROM_HERE, base::Bind(&ClearCookies,
857 &sp, an_hour_ago, base::Time::Max(),
858 clear_cb.callback()));
859 clear_cb.WaitForResult();
860
861 EXPECT_FALSE(tester.ContainsCookie());
862}
863
864TEST_F(StoragePartitionImplTest, RemoveUnprotectedLocalStorageForever) {
865 // Protect kOrigin1.
866 scoped_refptr<quota::MockSpecialStoragePolicy> mock_policy =
867 new quota::MockSpecialStoragePolicy;
868 mock_policy->AddProtected(kOrigin1.GetOrigin());
869
870 RemoveLocalStorageTester tester(GetBrowserContext());
871
872 tester.AddDOMStorageTestData();
873 EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin1));
874 EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin2));
875 EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin3));
876
877 TestClosureCallback clear_cb;
878 DOMStorageContextWrapper* dom_storage_context =
879 static_cast<DOMStorageContextWrapper*>(
880 content::BrowserContext::GetDefaultStoragePartition(
881 GetBrowserContext())->GetDOMStorageContext());
882 StoragePartitionImpl sp(base::FilePath(), NULL, NULL, NULL, NULL,
883 dom_storage_context, NULL, NULL, NULL, NULL);
884 static_cast<StoragePartitionImpl*>(
885 &sp)->OverrideSpecialStoragePolicyForTesting(mock_policy);
886 base::MessageLoop::current()->PostTask(
887 FROM_HERE,
888 base::Bind(&ClearStuff,
889 StoragePartitionImpl::REMOVE_DATA_MASK_LOCAL_STORAGE,
890 &sp, base::Time(), base::Time::Max(),
891 base::Bind(&DoesOriginMatchForUnprotectedWeb),
892 clear_cb.callback()));
893 clear_cb.WaitForResult();
894
895 EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin1));
896 EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin2));
897 EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin3));
898}
899
900TEST_F(StoragePartitionImplTest, RemoveProtectedLocalStorageForever) {
901 // Protect kOrigin1.
902 scoped_refptr<quota::MockSpecialStoragePolicy> mock_policy =
903 new quota::MockSpecialStoragePolicy;
904 mock_policy->AddProtected(kOrigin1.GetOrigin());
905
906 RemoveLocalStorageTester tester(GetBrowserContext());
907
908 tester.AddDOMStorageTestData();
909 EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin1));
910 EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin2));
911 EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin3));
912
913 TestClosureCallback clear_cb;
914 DOMStorageContextWrapper* dom_storage_context =
915 static_cast<DOMStorageContextWrapper*>(
916 content::BrowserContext::GetDefaultStoragePartition(
917 GetBrowserContext())->GetDOMStorageContext());
918 StoragePartitionImpl sp(base::FilePath(), NULL, NULL, NULL, NULL,
919 dom_storage_context, NULL, NULL, NULL, NULL);
920 static_cast<StoragePartitionImpl*>(
921 &sp)->OverrideSpecialStoragePolicyForTesting(mock_policy);
922 base::MessageLoop::current()->PostTask(
923 FROM_HERE,
924 base::Bind(&ClearStuff,
925 StoragePartitionImpl::REMOVE_DATA_MASK_LOCAL_STORAGE,
926 &sp, base::Time(), base::Time::Max(),
927 base::Bind(&DoesOriginMatchForBothProtectedAndUnprotectedWeb),
928 clear_cb.callback()));
929 clear_cb.WaitForResult();
930
931 // Even if kOrigin1 is protected, it will be deleted since we specify
932 // ClearData to delete protected data.
933 EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin1));
934 EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin2));
935 EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin3));
936}
937
938TEST_F(StoragePartitionImplTest, RemoveLocalStorageForLastWeek) {
939 RemoveLocalStorageTester tester(GetBrowserContext());
940
941 tester.AddDOMStorageTestData();
942 EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin1));
943 EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin2));
944 EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin3));
945
946 TestClosureCallback clear_cb;
947 DOMStorageContextWrapper* dom_storage_context =
948 static_cast<DOMStorageContextWrapper*>(
949 content::BrowserContext::GetDefaultStoragePartition(
950 GetBrowserContext())->GetDOMStorageContext());
951 StoragePartitionImpl sp(base::FilePath(), NULL, NULL, NULL, NULL,
952 dom_storage_context, NULL, NULL, NULL, NULL);
953 base::Time a_week_ago = base::Time::Now() - base::TimeDelta::FromDays(7);
954 base::MessageLoop::current()->PostTask(
955 FROM_HERE,
956 base::Bind(&ClearStuff,
957 StoragePartitionImpl::REMOVE_DATA_MASK_LOCAL_STORAGE,
958 &sp, a_week_ago, base::Time::Max(),
959 base::Bind(&DoesOriginMatchForBothProtectedAndUnprotectedWeb),
960 clear_cb.callback()));
961 clear_cb.WaitForResult();
962
963 // kOrigin1 and kOrigin2 do not have age more than a week.
964 EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin1));
965 EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin2));
966 EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin3));
967}
968
[email protected]877e2612013-04-05 05:58:18969} // namespace content