1 // 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
5 #include <set>
6 #include <sstream>
7 #include <vector>
8
9 #include "base/bind.h"
10 #include "base/file_util.h"
11 #include "base/files/scoped_temp_dir.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "base/memory/weak_ptr.h"
14 #include "base/message_loop/message_loop_proxy.h"
15 #include "base/run_loop.h"
16 #include "base/stl_util.h"
17 #include "base/sys_info.h"
18 #include "base/time/time.h"
19 #include "testing/gtest/include/gtest/gtest.h"
20 #include "url/gurl.h"
21 #include "webkit/browser/quota/mock_special_storage_policy.h"
22 #include "webkit/browser/quota/mock_storage_client.h"
23 #include "webkit/browser/quota/quota_database.h"
24 #include "webkit/browser/quota/quota_manager.h"
25
26 using base::MessageLoopProxy;
27
28 namespace quota {
29
30 namespace {
31
32 // For shorter names.
33 const StorageType kTemp = kStorageTypeTemporary;
34 const StorageType kPerm = kStorageTypePersistent;
35 const StorageType kSync = kStorageTypeSyncable;
36
37 const int kAllClients = QuotaClient::kAllClientsMask;
38
39 const int64 kAvailableSpaceForApp = 13377331U;
40
41 const int64 kMinimumPreserveForSystem = QuotaManager::kMinimumPreserveForSystem;
42 const int kPerHostTemporaryPortion = QuotaManager::kPerHostTemporaryPortion;
43
44 // Returns a deterministic value for the amount of available disk space.
GetAvailableDiskSpaceForTest(const base::FilePath &)45 int64 GetAvailableDiskSpaceForTest(const base::FilePath&) {
46 return kAvailableSpaceForApp + kMinimumPreserveForSystem;
47 }
48
49 } // namespace
50
51 class QuotaManagerTest : public testing::Test {
52 protected:
53 typedef QuotaManager::QuotaTableEntry QuotaTableEntry;
54 typedef QuotaManager::QuotaTableEntries QuotaTableEntries;
55 typedef QuotaManager::OriginInfoTableEntries OriginInfoTableEntries;
56
57 public:
QuotaManagerTest()58 QuotaManagerTest()
59 : mock_time_counter_(0),
60 weak_factory_(this) {
61 }
62
SetUp()63 virtual void SetUp() {
64 ASSERT_TRUE(data_dir_.CreateUniqueTempDir());
65 mock_special_storage_policy_ = new MockSpecialStoragePolicy;
66 ResetQuotaManager(false /* is_incognito */);
67 }
68
TearDown()69 virtual void TearDown() {
70 // Make sure the quota manager cleans up correctly.
71 quota_manager_ = NULL;
72 base::RunLoop().RunUntilIdle();
73 }
74
75 protected:
ResetQuotaManager(bool is_incognito)76 void ResetQuotaManager(bool is_incognito) {
77 quota_manager_ = new QuotaManager(is_incognito,
78 data_dir_.path(),
79 MessageLoopProxy::current().get(),
80 MessageLoopProxy::current().get(),
81 mock_special_storage_policy_.get());
82 // Don't (automatically) start the eviction for testing.
83 quota_manager_->eviction_disabled_ = true;
84 // Don't query the hard disk for remaining capacity.
85 quota_manager_->get_disk_space_fn_ = &GetAvailableDiskSpaceForTest;
86 additional_callback_count_ = 0;
87 }
88
CreateClient(const MockOriginData * mock_data,size_t mock_data_size,QuotaClient::ID id)89 MockStorageClient* CreateClient(
90 const MockOriginData* mock_data,
91 size_t mock_data_size,
92 QuotaClient::ID id) {
93 return new MockStorageClient(quota_manager_->proxy(),
94 mock_data, id, mock_data_size);
95 }
96
RegisterClient(MockStorageClient * client)97 void RegisterClient(MockStorageClient* client) {
98 quota_manager_->proxy()->RegisterClient(client);
99 }
100
GetUsageInfo()101 void GetUsageInfo() {
102 usage_info_.clear();
103 quota_manager_->GetUsageInfo(
104 base::Bind(&QuotaManagerTest::DidGetUsageInfo,
105 weak_factory_.GetWeakPtr()));
106 }
107
GetUsageAndQuotaForWebApps(const GURL & origin,StorageType type)108 void GetUsageAndQuotaForWebApps(const GURL& origin,
109 StorageType type) {
110 quota_status_ = kQuotaStatusUnknown;
111 usage_ = -1;
112 quota_ = -1;
113 quota_manager_->GetUsageAndQuotaForWebApps(
114 origin, type, base::Bind(&QuotaManagerTest::DidGetUsageAndQuota,
115 weak_factory_.GetWeakPtr()));
116 }
117
GetUsageAndQuotaForStorageClient(const GURL & origin,StorageType type)118 void GetUsageAndQuotaForStorageClient(const GURL& origin,
119 StorageType type) {
120 quota_status_ = kQuotaStatusUnknown;
121 usage_ = -1;
122 quota_ = -1;
123 quota_manager_->GetUsageAndQuota(
124 origin, type, base::Bind(&QuotaManagerTest::DidGetUsageAndQuota,
125 weak_factory_.GetWeakPtr()));
126 }
127
GetTemporaryGlobalQuota()128 void GetTemporaryGlobalQuota() {
129 quota_status_ = kQuotaStatusUnknown;
130 quota_ = -1;
131 quota_manager_->GetTemporaryGlobalQuota(
132 base::Bind(&QuotaManagerTest::DidGetQuota,
133 weak_factory_.GetWeakPtr()));
134 }
135
SetTemporaryGlobalQuota(int64 new_quota)136 void SetTemporaryGlobalQuota(int64 new_quota) {
137 quota_status_ = kQuotaStatusUnknown;
138 quota_ = -1;
139 quota_manager_->SetTemporaryGlobalOverrideQuota(
140 new_quota,
141 base::Bind(&QuotaManagerTest::DidGetQuota,
142 weak_factory_.GetWeakPtr()));
143 }
144
GetPersistentHostQuota(const std::string & host)145 void GetPersistentHostQuota(const std::string& host) {
146 quota_status_ = kQuotaStatusUnknown;
147 quota_ = -1;
148 quota_manager_->GetPersistentHostQuota(
149 host,
150 base::Bind(&QuotaManagerTest::DidGetHostQuota,
151 weak_factory_.GetWeakPtr()));
152 }
153
SetPersistentHostQuota(const std::string & host,int64 new_quota)154 void SetPersistentHostQuota(const std::string& host, int64 new_quota) {
155 quota_status_ = kQuotaStatusUnknown;
156 quota_ = -1;
157 quota_manager_->SetPersistentHostQuota(
158 host, new_quota,
159 base::Bind(&QuotaManagerTest::DidGetHostQuota,
160 weak_factory_.GetWeakPtr()));
161 }
162
GetGlobalUsage(StorageType type)163 void GetGlobalUsage(StorageType type) {
164 usage_ = -1;
165 unlimited_usage_ = -1;
166 quota_manager_->GetGlobalUsage(
167 type,
168 base::Bind(&QuotaManagerTest::DidGetGlobalUsage,
169 weak_factory_.GetWeakPtr()));
170 }
171
GetHostUsage(const std::string & host,StorageType type)172 void GetHostUsage(const std::string& host, StorageType type) {
173 usage_ = -1;
174 quota_manager_->GetHostUsage(
175 host, type,
176 base::Bind(&QuotaManagerTest::DidGetHostUsage,
177 weak_factory_.GetWeakPtr()));
178 }
179
RunAdditionalUsageAndQuotaTask(const GURL & origin,StorageType type)180 void RunAdditionalUsageAndQuotaTask(const GURL& origin, StorageType type) {
181 quota_manager_->GetUsageAndQuota(
182 origin, type,
183 base::Bind(&QuotaManagerTest::DidGetUsageAndQuotaAdditional,
184 weak_factory_.GetWeakPtr()));
185 }
186
DeleteClientOriginData(QuotaClient * client,const GURL & origin,StorageType type)187 void DeleteClientOriginData(QuotaClient* client,
188 const GURL& origin,
189 StorageType type) {
190 DCHECK(client);
191 quota_status_ = kQuotaStatusUnknown;
192 client->DeleteOriginData(
193 origin, type,
194 base::Bind(&QuotaManagerTest::StatusCallback,
195 weak_factory_.GetWeakPtr()));
196 }
197
EvictOriginData(const GURL & origin,StorageType type)198 void EvictOriginData(const GURL& origin,
199 StorageType type) {
200 quota_status_ = kQuotaStatusUnknown;
201 quota_manager_->EvictOriginData(
202 origin, type,
203 base::Bind(&QuotaManagerTest::StatusCallback,
204 weak_factory_.GetWeakPtr()));
205 }
206
DeleteOriginData(const GURL & origin,StorageType type,int quota_client_mask)207 void DeleteOriginData(const GURL& origin,
208 StorageType type,
209 int quota_client_mask) {
210 quota_status_ = kQuotaStatusUnknown;
211 quota_manager_->DeleteOriginData(
212 origin, type, quota_client_mask,
213 base::Bind(&QuotaManagerTest::StatusCallback,
214 weak_factory_.GetWeakPtr()));
215 }
216
DeleteHostData(const std::string & host,StorageType type,int quota_client_mask)217 void DeleteHostData(const std::string& host,
218 StorageType type,
219 int quota_client_mask) {
220 quota_status_ = kQuotaStatusUnknown;
221 quota_manager_->DeleteHostData(
222 host, type, quota_client_mask,
223 base::Bind(&QuotaManagerTest::StatusCallback,
224 weak_factory_.GetWeakPtr()));
225 }
226
GetAvailableSpace()227 void GetAvailableSpace() {
228 quota_status_ = kQuotaStatusUnknown;
229 available_space_ = -1;
230 quota_manager_->GetAvailableSpace(
231 base::Bind(&QuotaManagerTest::DidGetAvailableSpace,
232 weak_factory_.GetWeakPtr()));
233 }
234
GetUsageAndQuotaForEviction()235 void GetUsageAndQuotaForEviction() {
236 quota_status_ = kQuotaStatusUnknown;
237 usage_ = -1;
238 unlimited_usage_ = -1;
239 quota_ = -1;
240 available_space_ = -1;
241 quota_manager_->GetUsageAndQuotaForEviction(
242 base::Bind(&QuotaManagerTest::DidGetUsageAndQuotaForEviction,
243 weak_factory_.GetWeakPtr()));
244 }
245
GetCachedOrigins(StorageType type,std::set<GURL> * origins)246 void GetCachedOrigins(StorageType type, std::set<GURL>* origins) {
247 ASSERT_TRUE(origins != NULL);
248 origins->clear();
249 quota_manager_->GetCachedOrigins(type, origins);
250 }
251
NotifyStorageAccessed(QuotaClient * client,const GURL & origin,StorageType type)252 void NotifyStorageAccessed(QuotaClient* client,
253 const GURL& origin,
254 StorageType type) {
255 DCHECK(client);
256 quota_manager_->NotifyStorageAccessedInternal(
257 client->id(), origin, type, IncrementMockTime());
258 }
259
DeleteOriginFromDatabase(const GURL & origin,StorageType type)260 void DeleteOriginFromDatabase(const GURL& origin, StorageType type) {
261 quota_manager_->DeleteOriginFromDatabase(origin, type);
262 }
263
GetLRUOrigin(StorageType type)264 void GetLRUOrigin(StorageType type) {
265 lru_origin_ = GURL();
266 quota_manager_->GetLRUOrigin(
267 type,
268 base::Bind(&QuotaManagerTest::DidGetLRUOrigin,
269 weak_factory_.GetWeakPtr()));
270 }
271
NotifyOriginInUse(const GURL & origin)272 void NotifyOriginInUse(const GURL& origin) {
273 quota_manager_->NotifyOriginInUse(origin);
274 }
275
NotifyOriginNoLongerInUse(const GURL & origin)276 void NotifyOriginNoLongerInUse(const GURL& origin) {
277 quota_manager_->NotifyOriginNoLongerInUse(origin);
278 }
279
GetOriginsModifiedSince(StorageType type,base::Time modified_since)280 void GetOriginsModifiedSince(StorageType type, base::Time modified_since) {
281 modified_origins_.clear();
282 modified_origins_type_ = kStorageTypeUnknown;
283 quota_manager_->GetOriginsModifiedSince(
284 type, modified_since,
285 base::Bind(&QuotaManagerTest::DidGetModifiedOrigins,
286 weak_factory_.GetWeakPtr()));
287 }
288
DumpQuotaTable()289 void DumpQuotaTable() {
290 quota_entries_.clear();
291 quota_manager_->DumpQuotaTable(
292 base::Bind(&QuotaManagerTest::DidDumpQuotaTable,
293 weak_factory_.GetWeakPtr()));
294 }
295
DumpOriginInfoTable()296 void DumpOriginInfoTable() {
297 origin_info_entries_.clear();
298 quota_manager_->DumpOriginInfoTable(
299 base::Bind(&QuotaManagerTest::DidDumpOriginInfoTable,
300 weak_factory_.GetWeakPtr()));
301 }
302
DidGetUsageInfo(const UsageInfoEntries & entries)303 void DidGetUsageInfo(const UsageInfoEntries& entries) {
304 usage_info_.insert(usage_info_.begin(), entries.begin(), entries.end());
305 }
306
DidGetUsageAndQuota(QuotaStatusCode status,int64 usage,int64 quota)307 void DidGetUsageAndQuota(QuotaStatusCode status, int64 usage, int64 quota) {
308 quota_status_ = status;
309 usage_ = usage;
310 quota_ = quota;
311 }
312
DidGetQuota(QuotaStatusCode status,int64 quota)313 void DidGetQuota(QuotaStatusCode status,
314 int64 quota) {
315 quota_status_ = status;
316 quota_ = quota;
317 }
318
DidGetAvailableSpace(QuotaStatusCode status,int64 available_space)319 void DidGetAvailableSpace(QuotaStatusCode status, int64 available_space) {
320 quota_status_ = status;
321 available_space_ = available_space;
322 }
323
DidGetHostQuota(QuotaStatusCode status,int64 quota)324 void DidGetHostQuota(QuotaStatusCode status,
325 int64 quota) {
326 quota_status_ = status;
327 quota_ = quota;
328 }
329
DidGetGlobalUsage(int64 usage,int64 unlimited_usage)330 void DidGetGlobalUsage(int64 usage,
331 int64 unlimited_usage) {
332 usage_ = usage;
333 unlimited_usage_ = unlimited_usage;
334 }
335
DidGetHostUsage(int64 usage)336 void DidGetHostUsage(int64 usage) {
337 usage_ = usage;
338 }
339
StatusCallback(QuotaStatusCode status)340 void StatusCallback(QuotaStatusCode status) {
341 ++status_callback_count_;
342 quota_status_ = status;
343 }
344
DidGetUsageAndQuotaForEviction(QuotaStatusCode status,const UsageAndQuota & usage_and_quota)345 void DidGetUsageAndQuotaForEviction(QuotaStatusCode status,
346 const UsageAndQuota& usage_and_quota) {
347 quota_status_ = status;
348 limited_usage_ = usage_and_quota.global_limited_usage;
349 quota_ = usage_and_quota.quota;
350 available_space_ = usage_and_quota.available_disk_space;
351 }
352
DidGetLRUOrigin(const GURL & origin)353 void DidGetLRUOrigin(const GURL& origin) {
354 lru_origin_ = origin;
355 }
356
DidGetModifiedOrigins(const std::set<GURL> & origins,StorageType type)357 void DidGetModifiedOrigins(const std::set<GURL>& origins, StorageType type) {
358 modified_origins_ = origins;
359 modified_origins_type_ = type;
360 }
361
DidDumpQuotaTable(const QuotaTableEntries & entries)362 void DidDumpQuotaTable(const QuotaTableEntries& entries) {
363 quota_entries_ = entries;
364 }
365
DidDumpOriginInfoTable(const OriginInfoTableEntries & entries)366 void DidDumpOriginInfoTable(const OriginInfoTableEntries& entries) {
367 origin_info_entries_ = entries;
368 }
369
370 void GetUsage_WithModifyTestBody(const StorageType type);
371
set_additional_callback_count(int c)372 void set_additional_callback_count(int c) { additional_callback_count_ = c; }
additional_callback_count() const373 int additional_callback_count() const { return additional_callback_count_; }
DidGetUsageAndQuotaAdditional(QuotaStatusCode status,int64 usage,int64 quota)374 void DidGetUsageAndQuotaAdditional(
375 QuotaStatusCode status, int64 usage, int64 quota) {
376 ++additional_callback_count_;
377 }
378
quota_manager() const379 QuotaManager* quota_manager() const { return quota_manager_.get(); }
set_quota_manager(QuotaManager * quota_manager)380 void set_quota_manager(QuotaManager* quota_manager) {
381 quota_manager_ = quota_manager;
382 }
383
mock_special_storage_policy() const384 MockSpecialStoragePolicy* mock_special_storage_policy() const {
385 return mock_special_storage_policy_.get();
386 }
387
status() const388 QuotaStatusCode status() const { return quota_status_; }
usage_info() const389 const UsageInfoEntries& usage_info() const { return usage_info_; }
usage() const390 int64 usage() const { return usage_; }
limited_usage() const391 int64 limited_usage() const { return limited_usage_; }
unlimited_usage() const392 int64 unlimited_usage() const { return unlimited_usage_; }
quota() const393 int64 quota() const { return quota_; }
available_space() const394 int64 available_space() const { return available_space_; }
lru_origin() const395 const GURL& lru_origin() const { return lru_origin_; }
modified_origins() const396 const std::set<GURL>& modified_origins() const { return modified_origins_; }
modified_origins_type() const397 StorageType modified_origins_type() const { return modified_origins_type_; }
quota_entries() const398 const QuotaTableEntries& quota_entries() const { return quota_entries_; }
origin_info_entries() const399 const OriginInfoTableEntries& origin_info_entries() const {
400 return origin_info_entries_;
401 }
profile_path() const402 base::FilePath profile_path() const { return data_dir_.path(); }
status_callback_count() const403 int status_callback_count() const { return status_callback_count_; }
reset_status_callback_count()404 void reset_status_callback_count() { status_callback_count_ = 0; }
405
406 private:
IncrementMockTime()407 base::Time IncrementMockTime() {
408 ++mock_time_counter_;
409 return base::Time::FromDoubleT(mock_time_counter_ * 10.0);
410 }
411
412 base::MessageLoop message_loop_;
413 base::ScopedTempDir data_dir_;
414
415 scoped_refptr<QuotaManager> quota_manager_;
416 scoped_refptr<MockSpecialStoragePolicy> mock_special_storage_policy_;
417
418 QuotaStatusCode quota_status_;
419 UsageInfoEntries usage_info_;
420 int64 usage_;
421 int64 limited_usage_;
422 int64 unlimited_usage_;
423 int64 quota_;
424 int64 available_space_;
425 GURL lru_origin_;
426 std::set<GURL> modified_origins_;
427 StorageType modified_origins_type_;
428 QuotaTableEntries quota_entries_;
429 OriginInfoTableEntries origin_info_entries_;
430 int status_callback_count_;
431
432 int additional_callback_count_;
433
434 int mock_time_counter_;
435
436 base::WeakPtrFactory<QuotaManagerTest> weak_factory_;
437
438 DISALLOW_COPY_AND_ASSIGN(QuotaManagerTest);
439 };
440
TEST_F(QuotaManagerTest,GetUsageInfo)441 TEST_F(QuotaManagerTest, GetUsageInfo) {
442 static const MockOriginData kData1[] = {
443 { "http://foo.com/", kTemp, 10 },
444 { "http://foo.com:8080/", kTemp, 15 },
445 { "http://bar.com/", kTemp, 20 },
446 { "http://bar.com/", kPerm, 50 },
447 };
448 static const MockOriginData kData2[] = {
449 { "https://foo.com/", kTemp, 30 },
450 { "https://foo.com:8081/", kTemp, 35 },
451 { "http://bar.com/", kPerm, 40 },
452 { "http://example.com/", kPerm, 40 },
453 };
454 RegisterClient(CreateClient(kData1, ARRAYSIZE_UNSAFE(kData1),
455 QuotaClient::kFileSystem));
456 RegisterClient(CreateClient(kData2, ARRAYSIZE_UNSAFE(kData2),
457 QuotaClient::kDatabase));
458
459 GetUsageInfo();
460 base::RunLoop().RunUntilIdle();
461
462 EXPECT_EQ(4U, usage_info().size());
463 for (size_t i = 0; i < usage_info().size(); ++i) {
464 const UsageInfo& info = usage_info()[i];
465 if (info.host == "foo.com" && info.type == kTemp) {
466 EXPECT_EQ(10 + 15 + 30 + 35, info.usage);
467 } else if (info.host == "bar.com" && info.type == kTemp) {
468 EXPECT_EQ(20, info.usage);
469 } else if (info.host == "bar.com" && info.type == kPerm) {
470 EXPECT_EQ(50 + 40, info.usage);
471 } else if (info.host == "example.com" && info.type == kPerm) {
472 EXPECT_EQ(40, info.usage);
473 } else {
474 ADD_FAILURE()
475 << "Unexpected host, type: " << info.host << ", " << info.type;
476 }
477 }
478 }
479
TEST_F(QuotaManagerTest,GetUsageAndQuota_Simple)480 TEST_F(QuotaManagerTest, GetUsageAndQuota_Simple) {
481 static const MockOriginData kData[] = {
482 { "http://foo.com/", kTemp, 10 },
483 { "http://foo.com/", kPerm, 80 },
484 };
485 RegisterClient(CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
486 QuotaClient::kFileSystem));
487
488 GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kPerm);
489 base::RunLoop().RunUntilIdle();
490 EXPECT_EQ(kQuotaStatusOk, status());
491 EXPECT_EQ(80, usage());
492 EXPECT_EQ(0, quota());
493
494 GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kTemp);
495 base::RunLoop().RunUntilIdle();
496 EXPECT_EQ(kQuotaStatusOk, status());
497 EXPECT_EQ(10, usage());
498 EXPECT_LE(0, quota());
499 int64 quota_returned_for_foo = quota();
500
501 GetUsageAndQuotaForWebApps(GURL("http://bar.com/"), kTemp);
502 base::RunLoop().RunUntilIdle();
503 EXPECT_EQ(kQuotaStatusOk, status());
504 EXPECT_EQ(0, usage());
505 EXPECT_EQ(quota_returned_for_foo, quota());
506 }
507
TEST_F(QuotaManagerTest,GetUsage_NoClient)508 TEST_F(QuotaManagerTest, GetUsage_NoClient) {
509 GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kTemp);
510 base::RunLoop().RunUntilIdle();
511 EXPECT_EQ(kQuotaStatusOk, status());
512 EXPECT_EQ(0, usage());
513
514 GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kPerm);
515 base::RunLoop().RunUntilIdle();
516 EXPECT_EQ(kQuotaStatusOk, status());
517 EXPECT_EQ(0, usage());
518
519 GetHostUsage("foo.com", kTemp);
520 base::RunLoop().RunUntilIdle();
521 EXPECT_EQ(0, usage());
522
523 GetHostUsage("foo.com", kPerm);
524 base::RunLoop().RunUntilIdle();
525 EXPECT_EQ(0, usage());
526
527 GetGlobalUsage(kTemp);
528 base::RunLoop().RunUntilIdle();
529 EXPECT_EQ(0, usage());
530 EXPECT_EQ(0, unlimited_usage());
531
532 GetGlobalUsage(kPerm);
533 base::RunLoop().RunUntilIdle();
534 EXPECT_EQ(0, usage());
535 EXPECT_EQ(0, unlimited_usage());
536 }
537
TEST_F(QuotaManagerTest,GetUsage_EmptyClient)538 TEST_F(QuotaManagerTest, GetUsage_EmptyClient) {
539 RegisterClient(CreateClient(NULL, 0, QuotaClient::kFileSystem));
540 GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kTemp);
541 base::RunLoop().RunUntilIdle();
542 EXPECT_EQ(kQuotaStatusOk, status());
543 EXPECT_EQ(0, usage());
544
545 GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kPerm);
546 base::RunLoop().RunUntilIdle();
547 EXPECT_EQ(kQuotaStatusOk, status());
548 EXPECT_EQ(0, usage());
549
550 GetHostUsage("foo.com", kTemp);
551 base::RunLoop().RunUntilIdle();
552 EXPECT_EQ(0, usage());
553
554 GetHostUsage("foo.com", kPerm);
555 base::RunLoop().RunUntilIdle();
556 EXPECT_EQ(0, usage());
557
558 GetGlobalUsage(kTemp);
559 base::RunLoop().RunUntilIdle();
560 EXPECT_EQ(0, usage());
561 EXPECT_EQ(0, unlimited_usage());
562
563 GetGlobalUsage(kPerm);
564 base::RunLoop().RunUntilIdle();
565 EXPECT_EQ(0, usage());
566 EXPECT_EQ(0, unlimited_usage());
567 }
568
TEST_F(QuotaManagerTest,GetTemporaryUsageAndQuota_MultiOrigins)569 TEST_F(QuotaManagerTest, GetTemporaryUsageAndQuota_MultiOrigins) {
570 static const MockOriginData kData[] = {
571 { "http://foo.com/", kTemp, 10 },
572 { "http://foo.com:8080/", kTemp, 20 },
573 { "http://bar.com/", kTemp, 5 },
574 { "https://bar.com/", kTemp, 7 },
575 { "http://baz.com/", kTemp, 30 },
576 { "http://foo.com/", kPerm, 40 },
577 };
578 RegisterClient(CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
579 QuotaClient::kFileSystem));
580
581 // This time explicitly sets a temporary global quota.
582 SetTemporaryGlobalQuota(100);
583 base::RunLoop().RunUntilIdle();
584 EXPECT_EQ(kQuotaStatusOk, status());
585 EXPECT_EQ(100, quota());
586
587 GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kTemp);
588 base::RunLoop().RunUntilIdle();
589 EXPECT_EQ(kQuotaStatusOk, status());
590 EXPECT_EQ(10 + 20, usage());
591
592 const int kPerHostQuota = 100 / kPerHostTemporaryPortion;
593
594 // The host's quota should be its full portion of the global quota
595 // since global usage is under the global quota.
596 EXPECT_EQ(kPerHostQuota, quota());
597
598 GetUsageAndQuotaForWebApps(GURL("http://bar.com/"), kTemp);
599 base::RunLoop().RunUntilIdle();
600 EXPECT_EQ(kQuotaStatusOk, status());
601 EXPECT_EQ(5 + 7, usage());
602 EXPECT_EQ(kPerHostQuota, quota());
603 }
604
TEST_F(QuotaManagerTest,GetUsage_MultipleClients)605 TEST_F(QuotaManagerTest, GetUsage_MultipleClients) {
606 static const MockOriginData kData1[] = {
607 { "http://foo.com/", kTemp, 1 },
608 { "http://bar.com/", kTemp, 2 },
609 { "http://bar.com/", kPerm, 4 },
610 { "http://unlimited/", kPerm, 8 },
611 { "http://installed/", kPerm, 16 },
612 };
613 static const MockOriginData kData2[] = {
614 { "https://foo.com/", kTemp, 128 },
615 { "http://example.com/", kPerm, 256 },
616 { "http://unlimited/", kTemp, 512 },
617 { "http://installed/", kTemp, 1024 },
618 };
619 mock_special_storage_policy()->AddUnlimited(GURL("http://unlimited/"));
620 mock_special_storage_policy()->GrantQueryDiskSize(GURL("http://installed/"));
621 RegisterClient(CreateClient(kData1, ARRAYSIZE_UNSAFE(kData1),
622 QuotaClient::kFileSystem));
623 RegisterClient(CreateClient(kData2, ARRAYSIZE_UNSAFE(kData2),
624 QuotaClient::kDatabase));
625
626 const int64 kTempQuotaBase =
627 GetAvailableDiskSpaceForTest(base::FilePath()) / kPerHostTemporaryPortion;
628
629 GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kTemp);
630 base::RunLoop().RunUntilIdle();
631 EXPECT_EQ(kQuotaStatusOk, status());
632 EXPECT_EQ(1 + 128, usage());
633
634 GetUsageAndQuotaForWebApps(GURL("http://bar.com/"), kPerm);
635 base::RunLoop().RunUntilIdle();
636 EXPECT_EQ(kQuotaStatusOk, status());
637 EXPECT_EQ(4, usage());
638
639 GetUsageAndQuotaForWebApps(GURL("http://unlimited/"), kTemp);
640 base::RunLoop().RunUntilIdle();
641 EXPECT_EQ(kQuotaStatusOk, status());
642 EXPECT_EQ(512, usage());
643 EXPECT_EQ(std::min(kAvailableSpaceForApp, kTempQuotaBase) + usage(), quota());
644
645 GetUsageAndQuotaForWebApps(GURL("http://unlimited/"), kPerm);
646 base::RunLoop().RunUntilIdle();
647 EXPECT_EQ(kQuotaStatusOk, status());
648 EXPECT_EQ(8, usage());
649 EXPECT_EQ(kAvailableSpaceForApp + usage(), quota());
650
651 GetAvailableSpace();
652 base::RunLoop().RunUntilIdle();
653 EXPECT_EQ(kQuotaStatusOk, status());
654 EXPECT_LE(0, available_space());
655
656 GetUsageAndQuotaForWebApps(GURL("http://installed/"), kTemp);
657 base::RunLoop().RunUntilIdle();
658 EXPECT_EQ(kQuotaStatusOk, status());
659 EXPECT_EQ(1024, usage());
660 EXPECT_EQ(std::min(kAvailableSpaceForApp, kTempQuotaBase) + usage(), quota());
661
662 GetUsageAndQuotaForWebApps(GURL("http://installed/"), kPerm);
663 base::RunLoop().RunUntilIdle();
664 EXPECT_EQ(kQuotaStatusOk, status());
665 EXPECT_EQ(16, usage());
666 EXPECT_EQ(usage(), quota()); // Over-budget case.
667
668 GetGlobalUsage(kTemp);
669 base::RunLoop().RunUntilIdle();
670 EXPECT_EQ(kQuotaStatusOk, status());
671 EXPECT_EQ(1 + 2 + 128 + 512 + 1024, usage());
672 EXPECT_EQ(512, unlimited_usage());
673
674 GetGlobalUsage(kPerm);
675 base::RunLoop().RunUntilIdle();
676 EXPECT_EQ(kQuotaStatusOk, status());
677 EXPECT_EQ(4 + 8 + 16 + 256, usage());
678 EXPECT_EQ(8, unlimited_usage());
679 }
680
GetUsage_WithModifyTestBody(const StorageType type)681 void QuotaManagerTest::GetUsage_WithModifyTestBody(const StorageType type) {
682 const MockOriginData data[] = {
683 { "http://foo.com/", type, 10 },
684 { "http://foo.com:1/", type, 20 },
685 };
686 MockStorageClient* client = CreateClient(data, ARRAYSIZE_UNSAFE(data),
687 QuotaClient::kFileSystem);
688 RegisterClient(client);
689
690 GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), type);
691 base::RunLoop().RunUntilIdle();
692 EXPECT_EQ(kQuotaStatusOk, status());
693 EXPECT_EQ(10 + 20, usage());
694
695 client->ModifyOriginAndNotify(GURL("http://foo.com/"), type, 30);
696 client->ModifyOriginAndNotify(GURL("http://foo.com:1/"), type, -5);
697 client->AddOriginAndNotify(GURL("https://foo.com/"), type, 1);
698
699 GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), type);
700 base::RunLoop().RunUntilIdle();
701 EXPECT_EQ(kQuotaStatusOk, status());
702 EXPECT_EQ(10 + 20 + 30 - 5 + 1, usage());
703 int foo_usage = usage();
704
705 client->AddOriginAndNotify(GURL("http://bar.com/"), type, 40);
706 GetUsageAndQuotaForWebApps(GURL("http://bar.com/"), type);
707 base::RunLoop().RunUntilIdle();
708 EXPECT_EQ(kQuotaStatusOk, status());
709 EXPECT_EQ(40, usage());
710
711 GetGlobalUsage(type);
712 base::RunLoop().RunUntilIdle();
713 EXPECT_EQ(foo_usage + 40, usage());
714 EXPECT_EQ(0, unlimited_usage());
715 }
716
TEST_F(QuotaManagerTest,GetTemporaryUsage_WithModify)717 TEST_F(QuotaManagerTest, GetTemporaryUsage_WithModify) {
718 GetUsage_WithModifyTestBody(kTemp);
719 }
720
TEST_F(QuotaManagerTest,GetTemporaryUsageAndQuota_WithAdditionalTasks)721 TEST_F(QuotaManagerTest, GetTemporaryUsageAndQuota_WithAdditionalTasks) {
722 static const MockOriginData kData[] = {
723 { "http://foo.com/", kTemp, 10 },
724 { "http://foo.com:8080/", kTemp, 20 },
725 { "http://bar.com/", kTemp, 13 },
726 { "http://foo.com/", kPerm, 40 },
727 };
728 RegisterClient(CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
729 QuotaClient::kFileSystem));
730 SetTemporaryGlobalQuota(100);
731 base::RunLoop().RunUntilIdle();
732
733 const int kPerHostQuota = 100 / QuotaManager::kPerHostTemporaryPortion;
734
735 GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kTemp);
736 GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kTemp);
737 GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kTemp);
738 base::RunLoop().RunUntilIdle();
739 EXPECT_EQ(kQuotaStatusOk, status());
740 EXPECT_EQ(10 + 20, usage());
741 EXPECT_EQ(kPerHostQuota, quota());
742
743 set_additional_callback_count(0);
744 RunAdditionalUsageAndQuotaTask(GURL("http://foo.com/"),
745 kTemp);
746 GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kTemp);
747 RunAdditionalUsageAndQuotaTask(GURL("http://bar.com/"), kTemp);
748 base::RunLoop().RunUntilIdle();
749 EXPECT_EQ(kQuotaStatusOk, status());
750 EXPECT_EQ(10 + 20, usage());
751 EXPECT_EQ(kPerHostQuota, quota());
752 EXPECT_EQ(2, additional_callback_count());
753 }
754
TEST_F(QuotaManagerTest,GetTemporaryUsageAndQuota_NukeManager)755 TEST_F(QuotaManagerTest, GetTemporaryUsageAndQuota_NukeManager) {
756 static const MockOriginData kData[] = {
757 { "http://foo.com/", kTemp, 10 },
758 { "http://foo.com:8080/", kTemp, 20 },
759 { "http://bar.com/", kTemp, 13 },
760 { "http://foo.com/", kPerm, 40 },
761 };
762 RegisterClient(CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
763 QuotaClient::kFileSystem));
764 SetTemporaryGlobalQuota(100);
765 base::RunLoop().RunUntilIdle();
766
767 set_additional_callback_count(0);
768 GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kTemp);
769 RunAdditionalUsageAndQuotaTask(GURL("http://foo.com/"),
770 kTemp);
771 RunAdditionalUsageAndQuotaTask(GURL("http://bar.com/"),
772 kTemp);
773
774 DeleteOriginData(GURL("http://foo.com/"), kTemp, kAllClients);
775 DeleteOriginData(GURL("http://bar.com/"), kTemp, kAllClients);
776
777 // Nuke before waiting for callbacks.
778 set_quota_manager(NULL);
779 base::RunLoop().RunUntilIdle();
780 EXPECT_EQ(kQuotaErrorAbort, status());
781 }
782
TEST_F(QuotaManagerTest,GetTemporaryUsageAndQuota_Overbudget)783 TEST_F(QuotaManagerTest, GetTemporaryUsageAndQuota_Overbudget) {
784 static const MockOriginData kData[] = {
785 { "http://usage1/", kTemp, 1 },
786 { "http://usage10/", kTemp, 10 },
787 { "http://usage200/", kTemp, 200 },
788 };
789 RegisterClient(CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
790 QuotaClient::kFileSystem));
791 SetTemporaryGlobalQuota(100);
792 base::RunLoop().RunUntilIdle();
793
794 const int kPerHostQuota = 100 / QuotaManager::kPerHostTemporaryPortion;
795
796 GetUsageAndQuotaForWebApps(GURL("http://usage1/"), kTemp);
797 base::RunLoop().RunUntilIdle();
798 EXPECT_EQ(kQuotaStatusOk, status());
799 EXPECT_EQ(1, usage());
800 EXPECT_EQ(1, quota()); // should be clamped to our current usage
801
802 GetUsageAndQuotaForWebApps(GURL("http://usage10/"), kTemp);
803 base::RunLoop().RunUntilIdle();
804 EXPECT_EQ(kQuotaStatusOk, status());
805 EXPECT_EQ(10, usage());
806 EXPECT_EQ(10, quota());
807
808 GetUsageAndQuotaForWebApps(GURL("http://usage200/"), kTemp);
809 base::RunLoop().RunUntilIdle();
810 EXPECT_EQ(kQuotaStatusOk, status());
811 EXPECT_EQ(200, usage());
812 EXPECT_EQ(kPerHostQuota, quota()); // should be clamped to the nominal quota
813 }
814
TEST_F(QuotaManagerTest,GetTemporaryUsageAndQuota_Unlimited)815 TEST_F(QuotaManagerTest, GetTemporaryUsageAndQuota_Unlimited) {
816 static const MockOriginData kData[] = {
817 { "http://usage10/", kTemp, 10 },
818 { "http://usage50/", kTemp, 50 },
819 { "http://unlimited/", kTemp, 4000 },
820 };
821 mock_special_storage_policy()->AddUnlimited(GURL("http://unlimited/"));
822 MockStorageClient* client = CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
823 QuotaClient::kFileSystem);
824 RegisterClient(client);
825
826 // Test when not overbugdet.
827 SetTemporaryGlobalQuota(1000);
828 base::RunLoop().RunUntilIdle();
829
830 GetGlobalUsage(kTemp);
831 base::RunLoop().RunUntilIdle();
832 EXPECT_EQ(10 + 50 + 4000, usage());
833 EXPECT_EQ(4000, unlimited_usage());
834
835 const int kPerHostQuotaFor1000 =
836 1000 / QuotaManager::kPerHostTemporaryPortion;
837
838 GetUsageAndQuotaForWebApps(GURL("http://usage10/"), kTemp);
839 base::RunLoop().RunUntilIdle();
840 EXPECT_EQ(kQuotaStatusOk, status());
841 EXPECT_EQ(10, usage());
842 EXPECT_EQ(kPerHostQuotaFor1000, quota());
843
844 GetUsageAndQuotaForWebApps(GURL("http://usage50/"), kTemp);
845 base::RunLoop().RunUntilIdle();
846 EXPECT_EQ(kQuotaStatusOk, status());
847 EXPECT_EQ(50, usage());
848 EXPECT_EQ(kPerHostQuotaFor1000, quota());
849
850 GetUsageAndQuotaForWebApps(GURL("http://unlimited/"), kTemp);
851 base::RunLoop().RunUntilIdle();
852 EXPECT_EQ(kQuotaStatusOk, status());
853 EXPECT_EQ(4000, usage());
854 EXPECT_EQ(kAvailableSpaceForApp + usage(), quota());
855
856 GetUsageAndQuotaForStorageClient(GURL("http://unlimited/"), kTemp);
857 base::RunLoop().RunUntilIdle();
858 EXPECT_EQ(kQuotaStatusOk, status());
859 EXPECT_EQ(0, usage());
860 EXPECT_EQ(QuotaManager::kNoLimit, quota());
861
862 // Test when overbugdet.
863 SetTemporaryGlobalQuota(100);
864 base::RunLoop().RunUntilIdle();
865
866 const int kPerHostQuotaFor100 =
867 100 / QuotaManager::kPerHostTemporaryPortion;
868
869 GetUsageAndQuotaForWebApps(GURL("http://usage10/"), kTemp);
870 base::RunLoop().RunUntilIdle();
871 EXPECT_EQ(kQuotaStatusOk, status());
872 EXPECT_EQ(10, usage());
873 EXPECT_EQ(kPerHostQuotaFor100, quota());
874
875 GetUsageAndQuotaForWebApps(GURL("http://usage50/"), kTemp);
876 base::RunLoop().RunUntilIdle();
877 EXPECT_EQ(kQuotaStatusOk, status());
878 EXPECT_EQ(50, usage());
879 EXPECT_EQ(kPerHostQuotaFor100, quota());
880
881 GetUsageAndQuotaForWebApps(GURL("http://unlimited/"), kTemp);
882 base::RunLoop().RunUntilIdle();
883 EXPECT_EQ(kQuotaStatusOk, status());
884 EXPECT_EQ(4000, usage());
885 EXPECT_EQ(kAvailableSpaceForApp + usage(), quota());
886
887 GetUsageAndQuotaForStorageClient(GURL("http://unlimited/"), kTemp);
888 base::RunLoop().RunUntilIdle();
889 EXPECT_EQ(kQuotaStatusOk, status());
890 EXPECT_EQ(0, usage());
891 EXPECT_EQ(QuotaManager::kNoLimit, quota());
892
893 // Revoke the unlimited rights and make sure the change is noticed.
894 mock_special_storage_policy()->Reset();
895 mock_special_storage_policy()->NotifyCleared();
896
897 GetGlobalUsage(kTemp);
898 base::RunLoop().RunUntilIdle();
899 EXPECT_EQ(10 + 50 + 4000, usage());
900 EXPECT_EQ(0, unlimited_usage());
901
902 GetUsageAndQuotaForWebApps(GURL("http://usage10/"), kTemp);
903 base::RunLoop().RunUntilIdle();
904 EXPECT_EQ(kQuotaStatusOk, status());
905 EXPECT_EQ(10, usage());
906 EXPECT_EQ(10, quota()); // should be clamped to our current usage
907
908 GetUsageAndQuotaForWebApps(GURL("http://usage50/"), kTemp);
909 base::RunLoop().RunUntilIdle();
910 EXPECT_EQ(kQuotaStatusOk, status());
911 EXPECT_EQ(50, usage());
912 EXPECT_EQ(kPerHostQuotaFor100, quota());
913
914 GetUsageAndQuotaForWebApps(GURL("http://unlimited/"), kTemp);
915 base::RunLoop().RunUntilIdle();
916 EXPECT_EQ(kQuotaStatusOk, status());
917 EXPECT_EQ(4000, usage());
918 EXPECT_EQ(kPerHostQuotaFor100, quota());
919
920 GetUsageAndQuotaForStorageClient(GURL("http://unlimited/"), kTemp);
921 base::RunLoop().RunUntilIdle();
922 EXPECT_EQ(kQuotaStatusOk, status());
923 EXPECT_EQ(4000, usage());
924 EXPECT_EQ(kPerHostQuotaFor100, quota());
925 }
926
TEST_F(QuotaManagerTest,OriginInUse)927 TEST_F(QuotaManagerTest, OriginInUse) {
928 const GURL kFooOrigin("http://foo.com/");
929 const GURL kBarOrigin("http://bar.com/");
930
931 EXPECT_FALSE(quota_manager()->IsOriginInUse(kFooOrigin));
932 quota_manager()->NotifyOriginInUse(kFooOrigin); // count of 1
933 EXPECT_TRUE(quota_manager()->IsOriginInUse(kFooOrigin));
934 quota_manager()->NotifyOriginInUse(kFooOrigin); // count of 2
935 EXPECT_TRUE(quota_manager()->IsOriginInUse(kFooOrigin));
936 quota_manager()->NotifyOriginNoLongerInUse(kFooOrigin); // count of 1
937 EXPECT_TRUE(quota_manager()->IsOriginInUse(kFooOrigin));
938
939 EXPECT_FALSE(quota_manager()->IsOriginInUse(kBarOrigin));
940 quota_manager()->NotifyOriginInUse(kBarOrigin);
941 EXPECT_TRUE(quota_manager()->IsOriginInUse(kBarOrigin));
942 quota_manager()->NotifyOriginNoLongerInUse(kBarOrigin);
943 EXPECT_FALSE(quota_manager()->IsOriginInUse(kBarOrigin));
944
945 quota_manager()->NotifyOriginNoLongerInUse(kFooOrigin);
946 EXPECT_FALSE(quota_manager()->IsOriginInUse(kFooOrigin));
947 }
948
TEST_F(QuotaManagerTest,GetAndSetPerststentHostQuota)949 TEST_F(QuotaManagerTest, GetAndSetPerststentHostQuota) {
950 RegisterClient(CreateClient(NULL, 0, QuotaClient::kFileSystem));
951
952 GetPersistentHostQuota("foo.com");
953 base::RunLoop().RunUntilIdle();
954 EXPECT_EQ(0, quota());
955
956 SetPersistentHostQuota("foo.com", 100);
957 base::RunLoop().RunUntilIdle();
958 EXPECT_EQ(100, quota());
959
960 GetPersistentHostQuota("foo.com");
961 SetPersistentHostQuota("foo.com", 200);
962 GetPersistentHostQuota("foo.com");
963 SetPersistentHostQuota("foo.com", 300000000000ll);
964 GetPersistentHostQuota("foo.com");
965 base::RunLoop().RunUntilIdle();
966 EXPECT_EQ(300000000000ll, quota());
967 }
968
TEST_F(QuotaManagerTest,GetAndSetPersistentUsageAndQuota)969 TEST_F(QuotaManagerTest, GetAndSetPersistentUsageAndQuota) {
970 RegisterClient(CreateClient(NULL, 0, QuotaClient::kFileSystem));
971
972 GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kPerm);
973 base::RunLoop().RunUntilIdle();
974 EXPECT_EQ(kQuotaStatusOk, status());
975 EXPECT_EQ(0, usage());
976 EXPECT_EQ(0, quota());
977
978 SetPersistentHostQuota("foo.com", 100);
979 GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kPerm);
980 base::RunLoop().RunUntilIdle();
981 EXPECT_EQ(kQuotaStatusOk, status());
982 EXPECT_EQ(0, usage());
983 EXPECT_EQ(100, quota());
984
985 // For installed app GetUsageAndQuotaForWebApps returns the capped quota.
986 mock_special_storage_policy()->GrantQueryDiskSize(GURL("http://installed/"));
987 SetPersistentHostQuota("installed", kAvailableSpaceForApp + 100);
988 GetUsageAndQuotaForWebApps(GURL("http://installed/"), kPerm);
989 base::RunLoop().RunUntilIdle();
990 EXPECT_EQ(kAvailableSpaceForApp, quota());
991
992 // Ditto for unlimited apps.
993 mock_special_storage_policy()->AddUnlimited(GURL("http://unlimited/"));
994 GetUsageAndQuotaForWebApps(GURL("http://unlimited/"), kPerm);
995 base::RunLoop().RunUntilIdle();
996 EXPECT_EQ(kAvailableSpaceForApp, quota());
997
998 // GetUsageAndQuotaForStorageClient should just return 0 usage and
999 // kNoLimit quota.
1000 GetUsageAndQuotaForStorageClient(GURL("http://unlimited/"), kPerm);
1001 base::RunLoop().RunUntilIdle();
1002 EXPECT_EQ(0, usage());
1003 EXPECT_EQ(QuotaManager::kNoLimit, quota());
1004 }
1005
TEST_F(QuotaManagerTest,GetSyncableQuota)1006 TEST_F(QuotaManagerTest, GetSyncableQuota) {
1007 RegisterClient(CreateClient(NULL, 0, QuotaClient::kFileSystem));
1008
1009 // Pre-condition check: available disk space (for testing) is less than
1010 // the default quota for syncable storage.
1011 EXPECT_LE(kAvailableSpaceForApp,
1012 QuotaManager::kSyncableStorageDefaultHostQuota);
1013
1014 // For installed apps the quota manager should return
1015 // kAvailableSpaceForApp as syncable quota (because of the pre-condition).
1016 mock_special_storage_policy()->GrantQueryDiskSize(GURL("http://installed/"));
1017 GetUsageAndQuotaForWebApps(GURL("http://installed/"), kSync);
1018 base::RunLoop().RunUntilIdle();
1019 EXPECT_EQ(kQuotaStatusOk, status());
1020 EXPECT_EQ(0, usage());
1021 EXPECT_EQ(kAvailableSpaceForApp, quota());
1022
1023 // If it's not installed (which shouldn't happen in real case) it
1024 // should just return the default host quota for syncable.
1025 GetUsageAndQuotaForWebApps(GURL("http://foo/"), kSync);
1026 base::RunLoop().RunUntilIdle();
1027 EXPECT_EQ(kQuotaStatusOk, status());
1028 EXPECT_EQ(0, usage());
1029 EXPECT_EQ(QuotaManager::kSyncableStorageDefaultHostQuota, quota());
1030 }
1031
TEST_F(QuotaManagerTest,GetPersistentUsageAndQuota_MultiOrigins)1032 TEST_F(QuotaManagerTest, GetPersistentUsageAndQuota_MultiOrigins) {
1033 static const MockOriginData kData[] = {
1034 { "http://foo.com/", kPerm, 10 },
1035 { "http://foo.com:8080/", kPerm, 20 },
1036 { "https://foo.com/", kPerm, 13 },
1037 { "https://foo.com:8081/", kPerm, 19 },
1038 { "http://bar.com/", kPerm, 5 },
1039 { "https://bar.com/", kPerm, 7 },
1040 { "http://baz.com/", kPerm, 30 },
1041 { "http://foo.com/", kTemp, 40 },
1042 };
1043 RegisterClient(CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
1044 QuotaClient::kFileSystem));
1045
1046 SetPersistentHostQuota("foo.com", 100);
1047 GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kPerm);
1048 base::RunLoop().RunUntilIdle();
1049 EXPECT_EQ(kQuotaStatusOk, status());
1050 EXPECT_EQ(10 + 20 + 13 + 19, usage());
1051 EXPECT_EQ(100, quota());
1052 }
1053
TEST_F(QuotaManagerTest,GetPersistentUsage_WithModify)1054 TEST_F(QuotaManagerTest, GetPersistentUsage_WithModify) {
1055 GetUsage_WithModifyTestBody(kPerm);
1056 }
1057
TEST_F(QuotaManagerTest,GetPersistentUsageAndQuota_WithAdditionalTasks)1058 TEST_F(QuotaManagerTest, GetPersistentUsageAndQuota_WithAdditionalTasks) {
1059 static const MockOriginData kData[] = {
1060 { "http://foo.com/", kPerm, 10 },
1061 { "http://foo.com:8080/", kPerm, 20 },
1062 { "http://bar.com/", kPerm, 13 },
1063 { "http://foo.com/", kTemp, 40 },
1064 };
1065 RegisterClient(CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
1066 QuotaClient::kFileSystem));
1067 SetPersistentHostQuota("foo.com", 100);
1068
1069 GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kPerm);
1070 GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kPerm);
1071 GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kPerm);
1072 base::RunLoop().RunUntilIdle();
1073 EXPECT_EQ(kQuotaStatusOk, status());
1074 EXPECT_EQ(10 + 20, usage());
1075 EXPECT_EQ(100, quota());
1076
1077 set_additional_callback_count(0);
1078 RunAdditionalUsageAndQuotaTask(GURL("http://foo.com/"),
1079 kPerm);
1080 GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kPerm);
1081 RunAdditionalUsageAndQuotaTask(GURL("http://bar.com/"), kPerm);
1082 base::RunLoop().RunUntilIdle();
1083 EXPECT_EQ(kQuotaStatusOk, status());
1084 EXPECT_EQ(10 + 20, usage());
1085 EXPECT_EQ(2, additional_callback_count());
1086 }
1087
TEST_F(QuotaManagerTest,GetPersistentUsageAndQuota_NukeManager)1088 TEST_F(QuotaManagerTest, GetPersistentUsageAndQuota_NukeManager) {
1089 static const MockOriginData kData[] = {
1090 { "http://foo.com/", kPerm, 10 },
1091 { "http://foo.com:8080/", kPerm, 20 },
1092 { "http://bar.com/", kPerm, 13 },
1093 { "http://foo.com/", kTemp, 40 },
1094 };
1095 RegisterClient(CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
1096 QuotaClient::kFileSystem));
1097 SetPersistentHostQuota("foo.com", 100);
1098
1099 set_additional_callback_count(0);
1100 GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kPerm);
1101 RunAdditionalUsageAndQuotaTask(GURL("http://foo.com/"), kPerm);
1102 RunAdditionalUsageAndQuotaTask(GURL("http://bar.com/"), kPerm);
1103
1104 // Nuke before waiting for callbacks.
1105 set_quota_manager(NULL);
1106 base::RunLoop().RunUntilIdle();
1107 EXPECT_EQ(kQuotaErrorAbort, status());
1108 }
1109
TEST_F(QuotaManagerTest,GetUsage_Simple)1110 TEST_F(QuotaManagerTest, GetUsage_Simple) {
1111 static const MockOriginData kData[] = {
1112 { "http://foo.com/", kPerm, 1 },
1113 { "http://foo.com:1/", kPerm, 20 },
1114 { "http://bar.com/", kTemp, 300 },
1115 { "https://buz.com/", kTemp, 4000 },
1116 { "http://buz.com/", kTemp, 50000 },
1117 { "http://bar.com:1/", kPerm, 600000 },
1118 { "http://foo.com/", kTemp, 7000000 },
1119 };
1120 RegisterClient(CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
1121 QuotaClient::kFileSystem));
1122
1123 GetGlobalUsage(kPerm);
1124 base::RunLoop().RunUntilIdle();
1125 EXPECT_EQ(usage(), 1 + 20 + 600000);
1126 EXPECT_EQ(0, unlimited_usage());
1127
1128 GetGlobalUsage(kTemp);
1129 base::RunLoop().RunUntilIdle();
1130 EXPECT_EQ(usage(), 300 + 4000 + 50000 + 7000000);
1131 EXPECT_EQ(0, unlimited_usage());
1132
1133 GetHostUsage("foo.com", kPerm);
1134 base::RunLoop().RunUntilIdle();
1135 EXPECT_EQ(usage(), 1 + 20);
1136
1137 GetHostUsage("buz.com", kTemp);
1138 base::RunLoop().RunUntilIdle();
1139 EXPECT_EQ(usage(), 4000 + 50000);
1140 }
1141
TEST_F(QuotaManagerTest,GetUsage_WithModification)1142 TEST_F(QuotaManagerTest, GetUsage_WithModification) {
1143 static const MockOriginData kData[] = {
1144 { "http://foo.com/", kPerm, 1 },
1145 { "http://foo.com:1/", kPerm, 20 },
1146 { "http://bar.com/", kTemp, 300 },
1147 { "https://buz.com/", kTemp, 4000 },
1148 { "http://buz.com/", kTemp, 50000 },
1149 { "http://bar.com:1/", kPerm, 600000 },
1150 { "http://foo.com/", kTemp, 7000000 },
1151 };
1152
1153 MockStorageClient* client = CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
1154 QuotaClient::kFileSystem);
1155 RegisterClient(client);
1156
1157 GetGlobalUsage(kPerm);
1158 base::RunLoop().RunUntilIdle();
1159 EXPECT_EQ(usage(), 1 + 20 + 600000);
1160 EXPECT_EQ(0, unlimited_usage());
1161
1162 client->ModifyOriginAndNotify(
1163 GURL("http://foo.com/"), kPerm, 80000000);
1164
1165 GetGlobalUsage(kPerm);
1166 base::RunLoop().RunUntilIdle();
1167 EXPECT_EQ(usage(), 1 + 20 + 600000 + 80000000);
1168 EXPECT_EQ(0, unlimited_usage());
1169
1170 GetGlobalUsage(kTemp);
1171 base::RunLoop().RunUntilIdle();
1172 EXPECT_EQ(usage(), 300 + 4000 + 50000 + 7000000);
1173 EXPECT_EQ(0, unlimited_usage());
1174
1175 client->ModifyOriginAndNotify(
1176 GURL("http://foo.com/"), kTemp, 1);
1177
1178 GetGlobalUsage(kTemp);
1179 base::RunLoop().RunUntilIdle();
1180 EXPECT_EQ(usage(), 300 + 4000 + 50000 + 7000000 + 1);
1181 EXPECT_EQ(0, unlimited_usage());
1182
1183 GetHostUsage("buz.com", kTemp);
1184 base::RunLoop().RunUntilIdle();
1185 EXPECT_EQ(usage(), 4000 + 50000);
1186
1187 client->ModifyOriginAndNotify(
1188 GURL("http://buz.com/"), kTemp, 900000000);
1189
1190 GetHostUsage("buz.com", kTemp);
1191 base::RunLoop().RunUntilIdle();
1192 EXPECT_EQ(usage(), 4000 + 50000 + 900000000);
1193 }
1194
TEST_F(QuotaManagerTest,GetUsage_WithDeleteOrigin)1195 TEST_F(QuotaManagerTest, GetUsage_WithDeleteOrigin) {
1196 static const MockOriginData kData[] = {
1197 { "http://foo.com/", kTemp, 1 },
1198 { "http://foo.com:1/", kTemp, 20 },
1199 { "http://foo.com/", kPerm, 300 },
1200 { "http://bar.com/", kTemp, 4000 },
1201 };
1202 MockStorageClient* client = CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
1203 QuotaClient::kFileSystem);
1204 RegisterClient(client);
1205
1206 GetGlobalUsage(kTemp);
1207 base::RunLoop().RunUntilIdle();
1208 int64 predelete_global_tmp = usage();
1209
1210 GetHostUsage("foo.com", kTemp);
1211 base::RunLoop().RunUntilIdle();
1212 int64 predelete_host_tmp = usage();
1213
1214 GetHostUsage("foo.com", kPerm);
1215 base::RunLoop().RunUntilIdle();
1216 int64 predelete_host_pers = usage();
1217
1218 DeleteClientOriginData(client, GURL("http://foo.com/"),
1219 kTemp);
1220 base::RunLoop().RunUntilIdle();
1221 EXPECT_EQ(kQuotaStatusOk, status());
1222
1223 GetGlobalUsage(kTemp);
1224 base::RunLoop().RunUntilIdle();
1225 EXPECT_EQ(predelete_global_tmp - 1, usage());
1226
1227 GetHostUsage("foo.com", kTemp);
1228 base::RunLoop().RunUntilIdle();
1229 EXPECT_EQ(predelete_host_tmp - 1, usage());
1230
1231 GetHostUsage("foo.com", kPerm);
1232 base::RunLoop().RunUntilIdle();
1233 EXPECT_EQ(predelete_host_pers, usage());
1234 }
1235
TEST_F(QuotaManagerTest,GetAvailableSpaceTest)1236 TEST_F(QuotaManagerTest, GetAvailableSpaceTest) {
1237 GetAvailableSpace();
1238 base::RunLoop().RunUntilIdle();
1239 EXPECT_EQ(kQuotaStatusOk, status());
1240 EXPECT_LE(0, available_space());
1241 }
1242
TEST_F(QuotaManagerTest,EvictOriginData)1243 TEST_F(QuotaManagerTest, EvictOriginData) {
1244 static const MockOriginData kData1[] = {
1245 { "http://foo.com/", kTemp, 1 },
1246 { "http://foo.com:1/", kTemp, 20 },
1247 { "http://foo.com/", kPerm, 300 },
1248 { "http://bar.com/", kTemp, 4000 },
1249 };
1250 static const MockOriginData kData2[] = {
1251 { "http://foo.com/", kTemp, 50000 },
1252 { "http://foo.com:1/", kTemp, 6000 },
1253 { "http://foo.com/", kPerm, 700 },
1254 { "https://foo.com/", kTemp, 80 },
1255 { "http://bar.com/", kTemp, 9 },
1256 };
1257 MockStorageClient* client1 = CreateClient(kData1, ARRAYSIZE_UNSAFE(kData1),
1258 QuotaClient::kFileSystem);
1259 MockStorageClient* client2 = CreateClient(kData2, ARRAYSIZE_UNSAFE(kData2),
1260 QuotaClient::kDatabase);
1261 RegisterClient(client1);
1262 RegisterClient(client2);
1263
1264 GetGlobalUsage(kTemp);
1265 base::RunLoop().RunUntilIdle();
1266 int64 predelete_global_tmp = usage();
1267
1268 GetHostUsage("foo.com", kTemp);
1269 base::RunLoop().RunUntilIdle();
1270 int64 predelete_host_tmp = usage();
1271
1272 GetHostUsage("foo.com", kPerm);
1273 base::RunLoop().RunUntilIdle();
1274 int64 predelete_host_pers = usage();
1275
1276 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kData1); ++i)
1277 quota_manager()->NotifyStorageAccessed(QuotaClient::kUnknown,
1278 GURL(kData1[i].origin), kData1[i].type);
1279 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kData2); ++i)
1280 quota_manager()->NotifyStorageAccessed(QuotaClient::kUnknown,
1281 GURL(kData2[i].origin), kData2[i].type);
1282 base::RunLoop().RunUntilIdle();
1283
1284 EvictOriginData(GURL("http://foo.com/"), kTemp);
1285 base::RunLoop().RunUntilIdle();
1286
1287 DumpOriginInfoTable();
1288 base::RunLoop().RunUntilIdle();
1289
1290 typedef OriginInfoTableEntries::const_iterator iterator;
1291 for (iterator itr(origin_info_entries().begin()),
1292 end(origin_info_entries().end());
1293 itr != end; ++itr) {
1294 if (itr->type == kTemp)
1295 EXPECT_NE(std::string("http://foo.com/"), itr->origin.spec());
1296 }
1297
1298 GetGlobalUsage(kTemp);
1299 base::RunLoop().RunUntilIdle();
1300 EXPECT_EQ(predelete_global_tmp - (1 + 50000), usage());
1301
1302 GetHostUsage("foo.com", kTemp);
1303 base::RunLoop().RunUntilIdle();
1304 EXPECT_EQ(predelete_host_tmp - (1 + 50000), usage());
1305
1306 GetHostUsage("foo.com", kPerm);
1307 base::RunLoop().RunUntilIdle();
1308 EXPECT_EQ(predelete_host_pers, usage());
1309 }
1310
TEST_F(QuotaManagerTest,EvictOriginDataWithDeletionError)1311 TEST_F(QuotaManagerTest, EvictOriginDataWithDeletionError) {
1312 static const MockOriginData kData[] = {
1313 { "http://foo.com/", kTemp, 1 },
1314 { "http://foo.com:1/", kTemp, 20 },
1315 { "http://foo.com/", kPerm, 300 },
1316 { "http://bar.com/", kTemp, 4000 },
1317 };
1318 static const int kNumberOfTemporaryOrigins = 3;
1319 MockStorageClient* client = CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
1320 QuotaClient::kFileSystem);
1321 RegisterClient(client);
1322
1323 GetGlobalUsage(kTemp);
1324 base::RunLoop().RunUntilIdle();
1325 int64 predelete_global_tmp = usage();
1326
1327 GetHostUsage("foo.com", kTemp);
1328 base::RunLoop().RunUntilIdle();
1329 int64 predelete_host_tmp = usage();
1330
1331 GetHostUsage("foo.com", kPerm);
1332 base::RunLoop().RunUntilIdle();
1333 int64 predelete_host_pers = usage();
1334
1335 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kData); ++i)
1336 NotifyStorageAccessed(client, GURL(kData[i].origin), kData[i].type);
1337 base::RunLoop().RunUntilIdle();
1338
1339 client->AddOriginToErrorSet(GURL("http://foo.com/"), kTemp);
1340
1341 for (int i = 0;
1342 i < QuotaManager::kThresholdOfErrorsToBeBlacklisted + 1;
1343 ++i) {
1344 EvictOriginData(GURL("http://foo.com/"), kTemp);
1345 base::RunLoop().RunUntilIdle();
1346 EXPECT_EQ(kQuotaErrorInvalidModification, status());
1347 }
1348
1349 DumpOriginInfoTable();
1350 base::RunLoop().RunUntilIdle();
1351
1352 bool found_origin_in_database = false;
1353 typedef OriginInfoTableEntries::const_iterator iterator;
1354 for (iterator itr(origin_info_entries().begin()),
1355 end(origin_info_entries().end());
1356 itr != end; ++itr) {
1357 if (itr->type == kTemp &&
1358 GURL("http://foo.com/") == itr->origin) {
1359 found_origin_in_database = true;
1360 break;
1361 }
1362 }
1363 // The origin "http://foo.com/" should be in the database.
1364 EXPECT_TRUE(found_origin_in_database);
1365
1366 for (size_t i = 0; i < kNumberOfTemporaryOrigins - 1; ++i) {
1367 GetLRUOrigin(kTemp);
1368 base::RunLoop().RunUntilIdle();
1369 EXPECT_FALSE(lru_origin().is_empty());
1370 // The origin "http://foo.com/" should not be in the LRU list.
1371 EXPECT_NE(std::string("http://foo.com/"), lru_origin().spec());
1372 DeleteOriginFromDatabase(lru_origin(), kTemp);
1373 base::RunLoop().RunUntilIdle();
1374 }
1375
1376 // Now the LRU list must be empty.
1377 GetLRUOrigin(kTemp);
1378 base::RunLoop().RunUntilIdle();
1379 EXPECT_TRUE(lru_origin().is_empty());
1380
1381 // Deleting origins from the database should not affect the results of the
1382 // following checks.
1383 GetGlobalUsage(kTemp);
1384 base::RunLoop().RunUntilIdle();
1385 EXPECT_EQ(predelete_global_tmp, usage());
1386
1387 GetHostUsage("foo.com", kTemp);
1388 base::RunLoop().RunUntilIdle();
1389 EXPECT_EQ(predelete_host_tmp, usage());
1390
1391 GetHostUsage("foo.com", kPerm);
1392 base::RunLoop().RunUntilIdle();
1393 EXPECT_EQ(predelete_host_pers, usage());
1394 }
1395
TEST_F(QuotaManagerTest,GetUsageAndQuotaForEviction)1396 TEST_F(QuotaManagerTest, GetUsageAndQuotaForEviction) {
1397 static const MockOriginData kData[] = {
1398 { "http://foo.com/", kTemp, 1 },
1399 { "http://foo.com:1/", kTemp, 20 },
1400 { "http://foo.com/", kPerm, 300 },
1401 { "http://unlimited/", kTemp, 4000 },
1402 };
1403
1404 mock_special_storage_policy()->AddUnlimited(GURL("http://unlimited/"));
1405 MockStorageClient* client = CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
1406 QuotaClient::kFileSystem);
1407 RegisterClient(client);
1408
1409 SetTemporaryGlobalQuota(10000000);
1410 base::RunLoop().RunUntilIdle();
1411
1412 GetUsageAndQuotaForEviction();
1413 base::RunLoop().RunUntilIdle();
1414 EXPECT_EQ(kQuotaStatusOk, status());
1415 EXPECT_EQ(21, limited_usage());
1416 EXPECT_EQ(10000000, quota());
1417 EXPECT_LE(0, available_space());
1418 }
1419
TEST_F(QuotaManagerTest,DeleteHostDataSimple)1420 TEST_F(QuotaManagerTest, DeleteHostDataSimple) {
1421 static const MockOriginData kData[] = {
1422 { "http://foo.com/", kTemp, 1 },
1423 };
1424 MockStorageClient* client = CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
1425 QuotaClient::kFileSystem);
1426 RegisterClient(client);
1427
1428 GetGlobalUsage(kTemp);
1429 base::RunLoop().RunUntilIdle();
1430 const int64 predelete_global_tmp = usage();
1431
1432 GetHostUsage("foo.com", kTemp);
1433 base::RunLoop().RunUntilIdle();
1434 int64 predelete_host_tmp = usage();
1435
1436 GetHostUsage("foo.com", kPerm);
1437 base::RunLoop().RunUntilIdle();
1438 int64 predelete_host_pers = usage();
1439
1440 DeleteHostData(std::string(), kTemp, kAllClients);
1441 base::RunLoop().RunUntilIdle();
1442 EXPECT_EQ(kQuotaStatusOk, status());
1443
1444 GetGlobalUsage(kTemp);
1445 base::RunLoop().RunUntilIdle();
1446 EXPECT_EQ(predelete_global_tmp, usage());
1447
1448 GetHostUsage("foo.com", kTemp);
1449 base::RunLoop().RunUntilIdle();
1450 EXPECT_EQ(predelete_host_tmp, usage());
1451
1452 GetHostUsage("foo.com", kPerm);
1453 base::RunLoop().RunUntilIdle();
1454 EXPECT_EQ(predelete_host_pers, usage());
1455
1456 DeleteHostData("foo.com", kTemp, kAllClients);
1457 base::RunLoop().RunUntilIdle();
1458 EXPECT_EQ(kQuotaStatusOk, status());
1459
1460 GetGlobalUsage(kTemp);
1461 base::RunLoop().RunUntilIdle();
1462 EXPECT_EQ(predelete_global_tmp - 1, usage());
1463
1464 GetHostUsage("foo.com", kTemp);
1465 base::RunLoop().RunUntilIdle();
1466 EXPECT_EQ(predelete_host_tmp - 1, usage());
1467
1468 GetHostUsage("foo.com", kPerm);
1469 base::RunLoop().RunUntilIdle();
1470 EXPECT_EQ(predelete_host_pers, usage());
1471 }
1472
TEST_F(QuotaManagerTest,DeleteHostDataMultiple)1473 TEST_F(QuotaManagerTest, DeleteHostDataMultiple) {
1474 static const MockOriginData kData1[] = {
1475 { "http://foo.com/", kTemp, 1 },
1476 { "http://foo.com:1/", kTemp, 20 },
1477 { "http://foo.com/", kPerm, 300 },
1478 { "http://bar.com/", kTemp, 4000 },
1479 };
1480 static const MockOriginData kData2[] = {
1481 { "http://foo.com/", kTemp, 50000 },
1482 { "http://foo.com:1/", kTemp, 6000 },
1483 { "http://foo.com/", kPerm, 700 },
1484 { "https://foo.com/", kTemp, 80 },
1485 { "http://bar.com/", kTemp, 9 },
1486 };
1487 MockStorageClient* client1 = CreateClient(kData1, ARRAYSIZE_UNSAFE(kData1),
1488 QuotaClient::kFileSystem);
1489 MockStorageClient* client2 = CreateClient(kData2, ARRAYSIZE_UNSAFE(kData2),
1490 QuotaClient::kDatabase);
1491 RegisterClient(client1);
1492 RegisterClient(client2);
1493
1494 GetGlobalUsage(kTemp);
1495 base::RunLoop().RunUntilIdle();
1496 const int64 predelete_global_tmp = usage();
1497
1498 GetHostUsage("foo.com", kTemp);
1499 base::RunLoop().RunUntilIdle();
1500 const int64 predelete_foo_tmp = usage();
1501
1502 GetHostUsage("bar.com", kTemp);
1503 base::RunLoop().RunUntilIdle();
1504 const int64 predelete_bar_tmp = usage();
1505
1506 GetHostUsage("foo.com", kPerm);
1507 base::RunLoop().RunUntilIdle();
1508 const int64 predelete_foo_pers = usage();
1509
1510 GetHostUsage("bar.com", kPerm);
1511 base::RunLoop().RunUntilIdle();
1512 const int64 predelete_bar_pers = usage();
1513
1514 reset_status_callback_count();
1515 DeleteHostData("foo.com", kTemp, kAllClients);
1516 DeleteHostData("bar.com", kTemp, kAllClients);
1517 DeleteHostData("foo.com", kTemp, kAllClients);
1518 base::RunLoop().RunUntilIdle();
1519
1520 EXPECT_EQ(3, status_callback_count());
1521
1522 DumpOriginInfoTable();
1523 base::RunLoop().RunUntilIdle();
1524
1525 typedef OriginInfoTableEntries::const_iterator iterator;
1526 for (iterator itr(origin_info_entries().begin()),
1527 end(origin_info_entries().end());
1528 itr != end; ++itr) {
1529 if (itr->type == kTemp) {
1530 EXPECT_NE(std::string("http://foo.com/"), itr->origin.spec());
1531 EXPECT_NE(std::string("http://foo.com:1/"), itr->origin.spec());
1532 EXPECT_NE(std::string("https://foo.com/"), itr->origin.spec());
1533 EXPECT_NE(std::string("http://bar.com/"), itr->origin.spec());
1534 }
1535 }
1536
1537 GetGlobalUsage(kTemp);
1538 base::RunLoop().RunUntilIdle();
1539 EXPECT_EQ(predelete_global_tmp - (1 + 20 + 4000 + 50000 + 6000 + 80 + 9),
1540 usage());
1541
1542 GetHostUsage("foo.com", kTemp);
1543 base::RunLoop().RunUntilIdle();
1544 EXPECT_EQ(predelete_foo_tmp - (1 + 20 + 50000 + 6000 + 80), usage());
1545
1546 GetHostUsage("bar.com", kTemp);
1547 base::RunLoop().RunUntilIdle();
1548 EXPECT_EQ(predelete_bar_tmp - (4000 + 9), usage());
1549
1550 GetHostUsage("foo.com", kPerm);
1551 base::RunLoop().RunUntilIdle();
1552 EXPECT_EQ(predelete_foo_pers, usage());
1553
1554 GetHostUsage("bar.com", kPerm);
1555 base::RunLoop().RunUntilIdle();
1556 EXPECT_EQ(predelete_bar_pers, usage());
1557 }
1558
1559 // Single-run DeleteOriginData cases must be well covered by
1560 // EvictOriginData tests.
TEST_F(QuotaManagerTest,DeleteOriginDataMultiple)1561 TEST_F(QuotaManagerTest, DeleteOriginDataMultiple) {
1562 static const MockOriginData kData1[] = {
1563 { "http://foo.com/", kTemp, 1 },
1564 { "http://foo.com:1/", kTemp, 20 },
1565 { "http://foo.com/", kPerm, 300 },
1566 { "http://bar.com/", kTemp, 4000 },
1567 };
1568 static const MockOriginData kData2[] = {
1569 { "http://foo.com/", kTemp, 50000 },
1570 { "http://foo.com:1/", kTemp, 6000 },
1571 { "http://foo.com/", kPerm, 700 },
1572 { "https://foo.com/", kTemp, 80 },
1573 { "http://bar.com/", kTemp, 9 },
1574 };
1575 MockStorageClient* client1 = CreateClient(kData1, ARRAYSIZE_UNSAFE(kData1),
1576 QuotaClient::kFileSystem);
1577 MockStorageClient* client2 = CreateClient(kData2, ARRAYSIZE_UNSAFE(kData2),
1578 QuotaClient::kDatabase);
1579 RegisterClient(client1);
1580 RegisterClient(client2);
1581
1582 GetGlobalUsage(kTemp);
1583 base::RunLoop().RunUntilIdle();
1584 const int64 predelete_global_tmp = usage();
1585
1586 GetHostUsage("foo.com", kTemp);
1587 base::RunLoop().RunUntilIdle();
1588 const int64 predelete_foo_tmp = usage();
1589
1590 GetHostUsage("bar.com", kTemp);
1591 base::RunLoop().RunUntilIdle();
1592 const int64 predelete_bar_tmp = usage();
1593
1594 GetHostUsage("foo.com", kPerm);
1595 base::RunLoop().RunUntilIdle();
1596 const int64 predelete_foo_pers = usage();
1597
1598 GetHostUsage("bar.com", kPerm);
1599 base::RunLoop().RunUntilIdle();
1600 const int64 predelete_bar_pers = usage();
1601
1602 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kData1); ++i)
1603 quota_manager()->NotifyStorageAccessed(QuotaClient::kUnknown,
1604 GURL(kData1[i].origin), kData1[i].type);
1605 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kData2); ++i)
1606 quota_manager()->NotifyStorageAccessed(QuotaClient::kUnknown,
1607 GURL(kData2[i].origin), kData2[i].type);
1608 base::RunLoop().RunUntilIdle();
1609
1610 reset_status_callback_count();
1611 DeleteOriginData(GURL("http://foo.com/"), kTemp, kAllClients);
1612 DeleteOriginData(GURL("http://bar.com/"), kTemp, kAllClients);
1613 DeleteOriginData(GURL("http://foo.com/"), kTemp, kAllClients);
1614 base::RunLoop().RunUntilIdle();
1615
1616 EXPECT_EQ(3, status_callback_count());
1617
1618 DumpOriginInfoTable();
1619 base::RunLoop().RunUntilIdle();
1620
1621 typedef OriginInfoTableEntries::const_iterator iterator;
1622 for (iterator itr(origin_info_entries().begin()),
1623 end(origin_info_entries().end());
1624 itr != end; ++itr) {
1625 if (itr->type == kTemp) {
1626 EXPECT_NE(std::string("http://foo.com/"), itr->origin.spec());
1627 EXPECT_NE(std::string("http://bar.com/"), itr->origin.spec());
1628 }
1629 }
1630
1631 GetGlobalUsage(kTemp);
1632 base::RunLoop().RunUntilIdle();
1633 EXPECT_EQ(predelete_global_tmp - (1 + 4000 + 50000 + 9), usage());
1634
1635 GetHostUsage("foo.com", kTemp);
1636 base::RunLoop().RunUntilIdle();
1637 EXPECT_EQ(predelete_foo_tmp - (1 + 50000), usage());
1638
1639 GetHostUsage("bar.com", kTemp);
1640 base::RunLoop().RunUntilIdle();
1641 EXPECT_EQ(predelete_bar_tmp - (4000 + 9), usage());
1642
1643 GetHostUsage("foo.com", kPerm);
1644 base::RunLoop().RunUntilIdle();
1645 EXPECT_EQ(predelete_foo_pers, usage());
1646
1647 GetHostUsage("bar.com", kPerm);
1648 base::RunLoop().RunUntilIdle();
1649 EXPECT_EQ(predelete_bar_pers, usage());
1650 }
1651
TEST_F(QuotaManagerTest,GetCachedOrigins)1652 TEST_F(QuotaManagerTest, GetCachedOrigins) {
1653 static const MockOriginData kData[] = {
1654 { "http://a.com/", kTemp, 1 },
1655 { "http://a.com:1/", kTemp, 20 },
1656 { "http://b.com/", kPerm, 300 },
1657 { "http://c.com/", kTemp, 4000 },
1658 };
1659 MockStorageClient* client = CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
1660 QuotaClient::kFileSystem);
1661 RegisterClient(client);
1662
1663 // TODO(kinuko): Be careful when we add cache pruner.
1664
1665 std::set<GURL> origins;
1666 GetCachedOrigins(kTemp, &origins);
1667 EXPECT_TRUE(origins.empty());
1668
1669 // No matter how we make queries the quota manager tries to cache all
1670 // the origins at startup.
1671 GetHostUsage("a.com", kTemp);
1672 base::RunLoop().RunUntilIdle();
1673 GetCachedOrigins(kTemp, &origins);
1674 EXPECT_EQ(3U, origins.size());
1675
1676 GetHostUsage("b.com", kTemp);
1677 base::RunLoop().RunUntilIdle();
1678 GetCachedOrigins(kTemp, &origins);
1679 EXPECT_EQ(3U, origins.size());
1680
1681 GetCachedOrigins(kPerm, &origins);
1682 EXPECT_TRUE(origins.empty());
1683
1684 GetGlobalUsage(kTemp);
1685 base::RunLoop().RunUntilIdle();
1686 GetCachedOrigins(kTemp, &origins);
1687 EXPECT_EQ(3U, origins.size());
1688
1689 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kData); ++i) {
1690 if (kData[i].type == kTemp)
1691 EXPECT_TRUE(origins.find(GURL(kData[i].origin)) != origins.end());
1692 }
1693 }
1694
TEST_F(QuotaManagerTest,NotifyAndLRUOrigin)1695 TEST_F(QuotaManagerTest, NotifyAndLRUOrigin) {
1696 static const MockOriginData kData[] = {
1697 { "http://a.com/", kTemp, 0 },
1698 { "http://a.com:1/", kTemp, 0 },
1699 { "https://a.com/", kTemp, 0 },
1700 { "http://b.com/", kPerm, 0 }, // persistent
1701 { "http://c.com/", kTemp, 0 },
1702 };
1703 MockStorageClient* client = CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
1704 QuotaClient::kFileSystem);
1705 RegisterClient(client);
1706
1707 GURL origin;
1708 GetLRUOrigin(kTemp);
1709 base::RunLoop().RunUntilIdle();
1710 EXPECT_TRUE(lru_origin().is_empty());
1711
1712 NotifyStorageAccessed(client, GURL("http://a.com/"), kTemp);
1713 GetLRUOrigin(kTemp);
1714 base::RunLoop().RunUntilIdle();
1715 EXPECT_EQ("http://a.com/", lru_origin().spec());
1716
1717 NotifyStorageAccessed(client, GURL("http://b.com/"), kPerm);
1718 NotifyStorageAccessed(client, GURL("https://a.com/"), kTemp);
1719 NotifyStorageAccessed(client, GURL("http://c.com/"), kTemp);
1720 GetLRUOrigin(kTemp);
1721 base::RunLoop().RunUntilIdle();
1722 EXPECT_EQ("http://a.com/", lru_origin().spec());
1723
1724 DeleteOriginFromDatabase(lru_origin(), kTemp);
1725 GetLRUOrigin(kTemp);
1726 base::RunLoop().RunUntilIdle();
1727 EXPECT_EQ("https://a.com/", lru_origin().spec());
1728
1729 DeleteOriginFromDatabase(lru_origin(), kTemp);
1730 GetLRUOrigin(kTemp);
1731 base::RunLoop().RunUntilIdle();
1732 EXPECT_EQ("http://c.com/", lru_origin().spec());
1733 }
1734
TEST_F(QuotaManagerTest,GetLRUOriginWithOriginInUse)1735 TEST_F(QuotaManagerTest, GetLRUOriginWithOriginInUse) {
1736 static const MockOriginData kData[] = {
1737 { "http://a.com/", kTemp, 0 },
1738 { "http://a.com:1/", kTemp, 0 },
1739 { "https://a.com/", kTemp, 0 },
1740 { "http://b.com/", kPerm, 0 }, // persistent
1741 { "http://c.com/", kTemp, 0 },
1742 };
1743 MockStorageClient* client = CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
1744 QuotaClient::kFileSystem);
1745 RegisterClient(client);
1746
1747 GURL origin;
1748 GetLRUOrigin(kTemp);
1749 base::RunLoop().RunUntilIdle();
1750 EXPECT_TRUE(lru_origin().is_empty());
1751
1752 NotifyStorageAccessed(client, GURL("http://a.com/"), kTemp);
1753 NotifyStorageAccessed(client, GURL("http://b.com/"), kPerm);
1754 NotifyStorageAccessed(client, GURL("https://a.com/"), kTemp);
1755 NotifyStorageAccessed(client, GURL("http://c.com/"), kTemp);
1756
1757 GetLRUOrigin(kTemp);
1758 base::RunLoop().RunUntilIdle();
1759 EXPECT_EQ("http://a.com/", lru_origin().spec());
1760
1761 // Notify origin http://a.com is in use.
1762 NotifyOriginInUse(GURL("http://a.com/"));
1763 GetLRUOrigin(kTemp);
1764 base::RunLoop().RunUntilIdle();
1765 EXPECT_EQ("https://a.com/", lru_origin().spec());
1766
1767 // Notify origin https://a.com is in use while GetLRUOrigin is running.
1768 GetLRUOrigin(kTemp);
1769 NotifyOriginInUse(GURL("https://a.com/"));
1770 base::RunLoop().RunUntilIdle();
1771 // Post-filtering must have excluded the returned origin, so we will
1772 // see empty result here.
1773 EXPECT_TRUE(lru_origin().is_empty());
1774
1775 // Notify access for http://c.com while GetLRUOrigin is running.
1776 GetLRUOrigin(kTemp);
1777 NotifyStorageAccessed(client, GURL("http://c.com/"), kTemp);
1778 base::RunLoop().RunUntilIdle();
1779 // Post-filtering must have excluded the returned origin, so we will
1780 // see empty result here.
1781 EXPECT_TRUE(lru_origin().is_empty());
1782
1783 NotifyOriginNoLongerInUse(GURL("http://a.com/"));
1784 NotifyOriginNoLongerInUse(GURL("https://a.com/"));
1785 GetLRUOrigin(kTemp);
1786 base::RunLoop().RunUntilIdle();
1787 EXPECT_EQ("http://a.com/", lru_origin().spec());
1788 }
1789
TEST_F(QuotaManagerTest,GetOriginsModifiedSince)1790 TEST_F(QuotaManagerTest, GetOriginsModifiedSince) {
1791 static const MockOriginData kData[] = {
1792 { "http://a.com/", kTemp, 0 },
1793 { "http://a.com:1/", kTemp, 0 },
1794 { "https://a.com/", kTemp, 0 },
1795 { "http://b.com/", kPerm, 0 }, // persistent
1796 { "http://c.com/", kTemp, 0 },
1797 };
1798 MockStorageClient* client = CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
1799 QuotaClient::kFileSystem);
1800 RegisterClient(client);
1801
1802 GetOriginsModifiedSince(kTemp, base::Time());
1803 base::RunLoop().RunUntilIdle();
1804 EXPECT_TRUE(modified_origins().empty());
1805 EXPECT_EQ(modified_origins_type(), kTemp);
1806
1807 base::Time time1 = client->IncrementMockTime();
1808 client->ModifyOriginAndNotify(GURL("http://a.com/"), kTemp, 10);
1809 client->ModifyOriginAndNotify(GURL("http://a.com:1/"), kTemp, 10);
1810 client->ModifyOriginAndNotify(GURL("http://b.com/"), kPerm, 10);
1811 base::Time time2 = client->IncrementMockTime();
1812 client->ModifyOriginAndNotify(GURL("https://a.com/"), kTemp, 10);
1813 client->ModifyOriginAndNotify(GURL("http://c.com/"), kTemp, 10);
1814 base::Time time3 = client->IncrementMockTime();
1815
1816 GetOriginsModifiedSince(kTemp, time1);
1817 base::RunLoop().RunUntilIdle();
1818 EXPECT_EQ(4U, modified_origins().size());
1819 EXPECT_EQ(modified_origins_type(), kTemp);
1820 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kData); ++i) {
1821 if (kData[i].type == kTemp)
1822 EXPECT_EQ(1U, modified_origins().count(GURL(kData[i].origin)));
1823 }
1824
1825 GetOriginsModifiedSince(kTemp, time2);
1826 base::RunLoop().RunUntilIdle();
1827 EXPECT_EQ(2U, modified_origins().size());
1828
1829 GetOriginsModifiedSince(kTemp, time3);
1830 base::RunLoop().RunUntilIdle();
1831 EXPECT_TRUE(modified_origins().empty());
1832 EXPECT_EQ(modified_origins_type(), kTemp);
1833
1834 client->ModifyOriginAndNotify(GURL("http://a.com/"), kTemp, 10);
1835
1836 GetOriginsModifiedSince(kTemp, time3);
1837 base::RunLoop().RunUntilIdle();
1838 EXPECT_EQ(1U, modified_origins().size());
1839 EXPECT_EQ(1U, modified_origins().count(GURL("http://a.com/")));
1840 EXPECT_EQ(modified_origins_type(), kTemp);
1841 }
1842
TEST_F(QuotaManagerTest,DumpQuotaTable)1843 TEST_F(QuotaManagerTest, DumpQuotaTable) {
1844 SetPersistentHostQuota("example1.com", 1);
1845 SetPersistentHostQuota("example2.com", 20);
1846 SetPersistentHostQuota("example3.com", 300);
1847 base::RunLoop().RunUntilIdle();
1848
1849 DumpQuotaTable();
1850 base::RunLoop().RunUntilIdle();
1851
1852 const QuotaTableEntry kEntries[] = {
1853 QuotaTableEntry("example1.com", kPerm, 1),
1854 QuotaTableEntry("example2.com", kPerm, 20),
1855 QuotaTableEntry("example3.com", kPerm, 300),
1856 };
1857 std::set<QuotaTableEntry> entries
1858 (kEntries, kEntries + ARRAYSIZE_UNSAFE(kEntries));
1859
1860 typedef QuotaTableEntries::const_iterator iterator;
1861 for (iterator itr(quota_entries().begin()), end(quota_entries().end());
1862 itr != end; ++itr) {
1863 SCOPED_TRACE(testing::Message()
1864 << "host = " << itr->host << ", "
1865 << "quota = " << itr->quota);
1866 EXPECT_EQ(1u, entries.erase(*itr));
1867 }
1868 EXPECT_TRUE(entries.empty());
1869 }
1870
TEST_F(QuotaManagerTest,DumpOriginInfoTable)1871 TEST_F(QuotaManagerTest, DumpOriginInfoTable) {
1872 using std::make_pair;
1873
1874 quota_manager()->NotifyStorageAccessed(
1875 QuotaClient::kUnknown,
1876 GURL("http://example.com/"),
1877 kTemp);
1878 quota_manager()->NotifyStorageAccessed(
1879 QuotaClient::kUnknown,
1880 GURL("http://example.com/"),
1881 kPerm);
1882 quota_manager()->NotifyStorageAccessed(
1883 QuotaClient::kUnknown,
1884 GURL("http://example.com/"),
1885 kPerm);
1886 base::RunLoop().RunUntilIdle();
1887
1888 DumpOriginInfoTable();
1889 base::RunLoop().RunUntilIdle();
1890
1891 typedef std::pair<GURL, StorageType> TypedOrigin;
1892 typedef std::pair<TypedOrigin, int> Entry;
1893 const Entry kEntries[] = {
1894 make_pair(make_pair(GURL("http://example.com/"), kTemp), 1),
1895 make_pair(make_pair(GURL("http://example.com/"), kPerm), 2),
1896 };
1897 std::set<Entry> entries
1898 (kEntries, kEntries + ARRAYSIZE_UNSAFE(kEntries));
1899
1900 typedef OriginInfoTableEntries::const_iterator iterator;
1901 for (iterator itr(origin_info_entries().begin()),
1902 end(origin_info_entries().end());
1903 itr != end; ++itr) {
1904 SCOPED_TRACE(testing::Message()
1905 << "host = " << itr->origin << ", "
1906 << "type = " << itr->type << ", "
1907 << "used_count = " << itr->used_count);
1908 EXPECT_EQ(1u, entries.erase(
1909 make_pair(make_pair(itr->origin, itr->type),
1910 itr->used_count)));
1911 }
1912 EXPECT_TRUE(entries.empty());
1913 }
1914
TEST_F(QuotaManagerTest,QuotaForEmptyHost)1915 TEST_F(QuotaManagerTest, QuotaForEmptyHost) {
1916 GetPersistentHostQuota(std::string());
1917 base::RunLoop().RunUntilIdle();
1918 EXPECT_EQ(kQuotaStatusOk, status());
1919 EXPECT_EQ(0, quota());
1920
1921 SetPersistentHostQuota(std::string(), 10);
1922 base::RunLoop().RunUntilIdle();
1923 EXPECT_EQ(kQuotaErrorNotSupported, status());
1924 }
1925
TEST_F(QuotaManagerTest,DeleteSpecificClientTypeSingleOrigin)1926 TEST_F(QuotaManagerTest, DeleteSpecificClientTypeSingleOrigin) {
1927 static const MockOriginData kData1[] = {
1928 { "http://foo.com/", kTemp, 1 },
1929 };
1930 static const MockOriginData kData2[] = {
1931 { "http://foo.com/", kTemp, 2 },
1932 };
1933 static const MockOriginData kData3[] = {
1934 { "http://foo.com/", kTemp, 4 },
1935 };
1936 static const MockOriginData kData4[] = {
1937 { "http://foo.com/", kTemp, 8 },
1938 };
1939 MockStorageClient* client1 = CreateClient(kData1, ARRAYSIZE_UNSAFE(kData1),
1940 QuotaClient::kFileSystem);
1941 MockStorageClient* client2 = CreateClient(kData2, ARRAYSIZE_UNSAFE(kData2),
1942 QuotaClient::kAppcache);
1943 MockStorageClient* client3 = CreateClient(kData3, ARRAYSIZE_UNSAFE(kData3),
1944 QuotaClient::kDatabase);
1945 MockStorageClient* client4 = CreateClient(kData4, ARRAYSIZE_UNSAFE(kData4),
1946 QuotaClient::kIndexedDatabase);
1947 RegisterClient(client1);
1948 RegisterClient(client2);
1949 RegisterClient(client3);
1950 RegisterClient(client4);
1951
1952 GetHostUsage("foo.com", kTemp);
1953 base::RunLoop().RunUntilIdle();
1954 const int64 predelete_foo_tmp = usage();
1955
1956 DeleteOriginData(GURL("http://foo.com/"), kTemp, QuotaClient::kFileSystem);
1957 base::RunLoop().RunUntilIdle();
1958 GetHostUsage("foo.com", kTemp);
1959 base::RunLoop().RunUntilIdle();
1960 EXPECT_EQ(predelete_foo_tmp - 1, usage());
1961
1962 DeleteOriginData(GURL("http://foo.com/"), kTemp, QuotaClient::kAppcache);
1963 base::RunLoop().RunUntilIdle();
1964 GetHostUsage("foo.com", kTemp);
1965 base::RunLoop().RunUntilIdle();
1966 EXPECT_EQ(predelete_foo_tmp - 2 - 1, usage());
1967
1968 DeleteOriginData(GURL("http://foo.com/"), kTemp, QuotaClient::kDatabase);
1969 base::RunLoop().RunUntilIdle();
1970 GetHostUsage("foo.com", kTemp);
1971 base::RunLoop().RunUntilIdle();
1972 EXPECT_EQ(predelete_foo_tmp - 4 - 2 - 1, usage());
1973
1974 DeleteOriginData(GURL("http://foo.com/"), kTemp,
1975 QuotaClient::kIndexedDatabase);
1976 base::RunLoop().RunUntilIdle();
1977 GetHostUsage("foo.com", kTemp);
1978 base::RunLoop().RunUntilIdle();
1979 EXPECT_EQ(predelete_foo_tmp - 8 - 4 - 2 - 1, usage());
1980 }
1981
TEST_F(QuotaManagerTest,DeleteSpecificClientTypeSingleHost)1982 TEST_F(QuotaManagerTest, DeleteSpecificClientTypeSingleHost) {
1983 static const MockOriginData kData1[] = {
1984 { "http://foo.com:1111/", kTemp, 1 },
1985 };
1986 static const MockOriginData kData2[] = {
1987 { "http://foo.com:2222/", kTemp, 2 },
1988 };
1989 static const MockOriginData kData3[] = {
1990 { "http://foo.com:3333/", kTemp, 4 },
1991 };
1992 static const MockOriginData kData4[] = {
1993 { "http://foo.com:4444/", kTemp, 8 },
1994 };
1995 MockStorageClient* client1 = CreateClient(kData1, ARRAYSIZE_UNSAFE(kData1),
1996 QuotaClient::kFileSystem);
1997 MockStorageClient* client2 = CreateClient(kData2, ARRAYSIZE_UNSAFE(kData2),
1998 QuotaClient::kAppcache);
1999 MockStorageClient* client3 = CreateClient(kData3, ARRAYSIZE_UNSAFE(kData3),
2000 QuotaClient::kDatabase);
2001 MockStorageClient* client4 = CreateClient(kData4, ARRAYSIZE_UNSAFE(kData4),
2002 QuotaClient::kIndexedDatabase);
2003 RegisterClient(client1);
2004 RegisterClient(client2);
2005 RegisterClient(client3);
2006 RegisterClient(client4);
2007
2008 GetHostUsage("foo.com", kTemp);
2009 base::RunLoop().RunUntilIdle();
2010 const int64 predelete_foo_tmp = usage();
2011
2012 DeleteHostData("foo.com", kTemp, QuotaClient::kFileSystem);
2013 base::RunLoop().RunUntilIdle();
2014 GetHostUsage("foo.com", kTemp);
2015 base::RunLoop().RunUntilIdle();
2016 EXPECT_EQ(predelete_foo_tmp - 1, usage());
2017
2018 DeleteHostData("foo.com", kTemp, QuotaClient::kAppcache);
2019 base::RunLoop().RunUntilIdle();
2020 GetHostUsage("foo.com", kTemp);
2021 base::RunLoop().RunUntilIdle();
2022 EXPECT_EQ(predelete_foo_tmp - 2 - 1, usage());
2023
2024 DeleteHostData("foo.com", kTemp, QuotaClient::kDatabase);
2025 base::RunLoop().RunUntilIdle();
2026 GetHostUsage("foo.com", kTemp);
2027 base::RunLoop().RunUntilIdle();
2028 EXPECT_EQ(predelete_foo_tmp - 4 - 2 - 1, usage());
2029
2030 DeleteHostData("foo.com", kTemp, QuotaClient::kIndexedDatabase);
2031 base::RunLoop().RunUntilIdle();
2032 GetHostUsage("foo.com", kTemp);
2033 base::RunLoop().RunUntilIdle();
2034 EXPECT_EQ(predelete_foo_tmp - 8 - 4 - 2 - 1, usage());
2035 }
2036
TEST_F(QuotaManagerTest,DeleteMultipleClientTypesSingleOrigin)2037 TEST_F(QuotaManagerTest, DeleteMultipleClientTypesSingleOrigin) {
2038 static const MockOriginData kData1[] = {
2039 { "http://foo.com/", kTemp, 1 },
2040 };
2041 static const MockOriginData kData2[] = {
2042 { "http://foo.com/", kTemp, 2 },
2043 };
2044 static const MockOriginData kData3[] = {
2045 { "http://foo.com/", kTemp, 4 },
2046 };
2047 static const MockOriginData kData4[] = {
2048 { "http://foo.com/", kTemp, 8 },
2049 };
2050 MockStorageClient* client1 = CreateClient(kData1, ARRAYSIZE_UNSAFE(kData1),
2051 QuotaClient::kFileSystem);
2052 MockStorageClient* client2 = CreateClient(kData2, ARRAYSIZE_UNSAFE(kData2),
2053 QuotaClient::kAppcache);
2054 MockStorageClient* client3 = CreateClient(kData3, ARRAYSIZE_UNSAFE(kData3),
2055 QuotaClient::kDatabase);
2056 MockStorageClient* client4 = CreateClient(kData4, ARRAYSIZE_UNSAFE(kData4),
2057 QuotaClient::kIndexedDatabase);
2058 RegisterClient(client1);
2059 RegisterClient(client2);
2060 RegisterClient(client3);
2061 RegisterClient(client4);
2062
2063 GetHostUsage("foo.com", kTemp);
2064 base::RunLoop().RunUntilIdle();
2065 const int64 predelete_foo_tmp = usage();
2066
2067 DeleteOriginData(GURL("http://foo.com/"), kTemp,
2068 QuotaClient::kFileSystem | QuotaClient::kDatabase);
2069 base::RunLoop().RunUntilIdle();
2070 GetHostUsage("foo.com", kTemp);
2071 base::RunLoop().RunUntilIdle();
2072 EXPECT_EQ(predelete_foo_tmp - 4 - 1, usage());
2073
2074 DeleteOriginData(GURL("http://foo.com/"), kTemp,
2075 QuotaClient::kAppcache | QuotaClient::kIndexedDatabase);
2076 base::RunLoop().RunUntilIdle();
2077 GetHostUsage("foo.com", kTemp);
2078 base::RunLoop().RunUntilIdle();
2079 EXPECT_EQ(predelete_foo_tmp - 8 - 4 - 2 - 1, usage());
2080 }
2081
TEST_F(QuotaManagerTest,DeleteMultipleClientTypesSingleHost)2082 TEST_F(QuotaManagerTest, DeleteMultipleClientTypesSingleHost) {
2083 static const MockOriginData kData1[] = {
2084 { "http://foo.com:1111/", kTemp, 1 },
2085 };
2086 static const MockOriginData kData2[] = {
2087 { "http://foo.com:2222/", kTemp, 2 },
2088 };
2089 static const MockOriginData kData3[] = {
2090 { "http://foo.com:3333/", kTemp, 4 },
2091 };
2092 static const MockOriginData kData4[] = {
2093 { "http://foo.com:4444/", kTemp, 8 },
2094 };
2095 MockStorageClient* client1 = CreateClient(kData1, ARRAYSIZE_UNSAFE(kData1),
2096 QuotaClient::kFileSystem);
2097 MockStorageClient* client2 = CreateClient(kData2, ARRAYSIZE_UNSAFE(kData2),
2098 QuotaClient::kAppcache);
2099 MockStorageClient* client3 = CreateClient(kData3, ARRAYSIZE_UNSAFE(kData3),
2100 QuotaClient::kDatabase);
2101 MockStorageClient* client4 = CreateClient(kData4, ARRAYSIZE_UNSAFE(kData4),
2102 QuotaClient::kIndexedDatabase);
2103 RegisterClient(client1);
2104 RegisterClient(client2);
2105 RegisterClient(client3);
2106 RegisterClient(client4);
2107
2108 GetHostUsage("foo.com", kTemp);
2109 base::RunLoop().RunUntilIdle();
2110 const int64 predelete_foo_tmp = usage();
2111
2112 DeleteHostData("foo.com", kTemp,
2113 QuotaClient::kFileSystem | QuotaClient::kAppcache);
2114 base::RunLoop().RunUntilIdle();
2115 GetHostUsage("foo.com", kTemp);
2116 base::RunLoop().RunUntilIdle();
2117 EXPECT_EQ(predelete_foo_tmp - 2 - 1, usage());
2118
2119 DeleteHostData("foo.com", kTemp,
2120 QuotaClient::kDatabase | QuotaClient::kIndexedDatabase);
2121 base::RunLoop().RunUntilIdle();
2122 GetHostUsage("foo.com", kTemp);
2123 base::RunLoop().RunUntilIdle();
2124 EXPECT_EQ(predelete_foo_tmp - 8 - 4 - 2 - 1, usage());
2125 }
2126
TEST_F(QuotaManagerTest,GetUsageAndQuota_Incognito)2127 TEST_F(QuotaManagerTest, GetUsageAndQuota_Incognito) {
2128 ResetQuotaManager(true);
2129
2130 static const MockOriginData kData[] = {
2131 { "http://foo.com/", kTemp, 10 },
2132 { "http://foo.com/", kPerm, 80 },
2133 };
2134 RegisterClient(CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
2135 QuotaClient::kFileSystem));
2136
2137 GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kPerm);
2138 base::RunLoop().RunUntilIdle();
2139 EXPECT_EQ(kQuotaStatusOk, status());
2140 EXPECT_EQ(80, usage());
2141 EXPECT_EQ(0, quota());
2142
2143 SetTemporaryGlobalQuota(100);
2144 GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kTemp);
2145 base::RunLoop().RunUntilIdle();
2146 EXPECT_EQ(kQuotaStatusOk, status());
2147 EXPECT_EQ(10, usage());
2148 EXPECT_LE(std::min(static_cast<int64>(100 / kPerHostTemporaryPortion),
2149 QuotaManager::kIncognitoDefaultQuotaLimit), quota());
2150
2151 mock_special_storage_policy()->AddUnlimited(GURL("http://foo.com/"));
2152 GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kPerm);
2153 base::RunLoop().RunUntilIdle();
2154 EXPECT_EQ(kQuotaStatusOk, status());
2155 EXPECT_EQ(80, usage());
2156 EXPECT_EQ(QuotaManager::kIncognitoDefaultQuotaLimit, quota());
2157
2158 GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kTemp);
2159 base::RunLoop().RunUntilIdle();
2160 EXPECT_EQ(kQuotaStatusOk, status());
2161 EXPECT_EQ(10, usage());
2162 EXPECT_EQ(QuotaManager::kIncognitoDefaultQuotaLimit, quota());
2163 }
2164
2165 } // namespace quota
2166