Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / content / browser / quota / mock_quota_manager_unittest.cc
1 // Copyright 2014 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
7 #include "base/bind.h"
8 #include "base/files/file_util.h"
9 #include "base/files/scoped_temp_dir.h"
10 #include "base/memory/scoped_ptr.h"
11 #include "base/message_loop/message_loop_proxy.h"
12 #include "base/run_loop.h"
13 #include "content/browser/quota/mock_quota_manager.h"
14 #include "content/public/test/mock_special_storage_policy.h"
15 #include "content/public/test/mock_storage_client.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17
18 using storage::kQuotaStatusOk;
19 using storage::kStorageTypePersistent;
20 using storage::kStorageTypeTemporary;
21
22 namespace content {
23
24 const char kTestOrigin1[] = "http://host1:1/";
25 const char kTestOrigin2[] = "http://host2:1/";
26 const char kTestOrigin3[] = "http://host3:1/";
27
28 const GURL kOrigin1(kTestOrigin1);
29 const GURL kOrigin2(kTestOrigin2);
30 const GURL kOrigin3(kTestOrigin3);
31
32 const StorageType kTemporary = kStorageTypeTemporary;
33 const StorageType kPersistent = kStorageTypePersistent;
34
35 const QuotaClient::ID kClientFile = QuotaClient::kFileSystem;
36 const QuotaClient::ID kClientDB = QuotaClient::kIndexedDatabase;
37
38 class MockQuotaManagerTest : public testing::Test {
39  public:
40   MockQuotaManagerTest()
41     : deletion_callback_count_(0),
42       weak_factory_(this) {
43   }
44
45   virtual void SetUp() {
46     ASSERT_TRUE(data_dir_.CreateUniqueTempDir());
47     policy_ = new MockSpecialStoragePolicy;
48     manager_ = new MockQuotaManager(false /* is_incognito */,
49                                     data_dir_.path(),
50                                     base::MessageLoopProxy::current().get(),
51                                     base::MessageLoopProxy::current().get(),
52                                     policy_.get());
53   }
54
55   virtual void TearDown() {
56     // Make sure the quota manager cleans up correctly.
57     manager_ = NULL;
58     base::RunLoop().RunUntilIdle();
59   }
60
61   void GetModifiedOrigins(StorageType type, base::Time since) {
62     manager_->GetOriginsModifiedSince(
63         type, since,
64         base::Bind(&MockQuotaManagerTest::GotModifiedOrigins,
65                    weak_factory_.GetWeakPtr()));
66   }
67
68   void GotModifiedOrigins(const std::set<GURL>& origins, StorageType type) {
69     origins_ = origins;
70     type_ = type;
71   }
72
73   void DeleteOriginData(const GURL& origin, StorageType type,
74       int quota_client_mask) {
75     manager_->DeleteOriginData(
76         origin, type, quota_client_mask,
77         base::Bind(&MockQuotaManagerTest::DeletedOriginData,
78                    weak_factory_.GetWeakPtr()));
79   }
80
81   void DeletedOriginData(QuotaStatusCode status) {
82     ++deletion_callback_count_;
83     EXPECT_EQ(kQuotaStatusOk, status);
84   }
85
86   int deletion_callback_count() const {
87     return deletion_callback_count_;
88   }
89
90   MockQuotaManager* manager() const {
91     return manager_.get();
92   }
93
94   const std::set<GURL>& origins() const {
95     return origins_;
96   }
97
98   const StorageType& type() const {
99     return type_;
100   }
101
102  private:
103   base::MessageLoop message_loop_;
104   base::ScopedTempDir data_dir_;
105   scoped_refptr<MockQuotaManager> manager_;
106   scoped_refptr<MockSpecialStoragePolicy> policy_;
107
108   int deletion_callback_count_;
109
110   std::set<GURL> origins_;
111   StorageType type_;
112
113   base::WeakPtrFactory<MockQuotaManagerTest> weak_factory_;
114
115   DISALLOW_COPY_AND_ASSIGN(MockQuotaManagerTest);
116 };
117
118 TEST_F(MockQuotaManagerTest, BasicOriginManipulation) {
119   EXPECT_FALSE(manager()->OriginHasData(kOrigin1, kTemporary, kClientFile));
120   EXPECT_FALSE(manager()->OriginHasData(kOrigin1, kTemporary, kClientDB));
121   EXPECT_FALSE(manager()->OriginHasData(kOrigin1, kPersistent, kClientFile));
122   EXPECT_FALSE(manager()->OriginHasData(kOrigin1, kPersistent, kClientDB));
123   EXPECT_FALSE(manager()->OriginHasData(kOrigin2, kTemporary, kClientFile));
124   EXPECT_FALSE(manager()->OriginHasData(kOrigin2, kTemporary, kClientDB));
125   EXPECT_FALSE(manager()->OriginHasData(kOrigin2, kPersistent, kClientFile));
126   EXPECT_FALSE(manager()->OriginHasData(kOrigin2, kPersistent, kClientDB));
127
128   manager()->AddOrigin(kOrigin1, kTemporary, kClientFile, base::Time::Now());
129   EXPECT_TRUE(manager()->OriginHasData(kOrigin1, kTemporary, kClientFile));
130   EXPECT_FALSE(manager()->OriginHasData(kOrigin1, kTemporary, kClientDB));
131   EXPECT_FALSE(manager()->OriginHasData(kOrigin1, kPersistent, kClientFile));
132   EXPECT_FALSE(manager()->OriginHasData(kOrigin1, kPersistent, kClientDB));
133   EXPECT_FALSE(manager()->OriginHasData(kOrigin2, kTemporary, kClientFile));
134   EXPECT_FALSE(manager()->OriginHasData(kOrigin2, kTemporary, kClientDB));
135   EXPECT_FALSE(manager()->OriginHasData(kOrigin2, kPersistent, kClientFile));
136   EXPECT_FALSE(manager()->OriginHasData(kOrigin2, kPersistent, kClientDB));
137
138   manager()->AddOrigin(kOrigin1, kPersistent, kClientFile, base::Time::Now());
139   EXPECT_TRUE(manager()->OriginHasData(kOrigin1, kTemporary, kClientFile));
140   EXPECT_FALSE(manager()->OriginHasData(kOrigin1, kTemporary, kClientDB));
141   EXPECT_TRUE(manager()->OriginHasData(kOrigin1, kPersistent, kClientFile));
142   EXPECT_FALSE(manager()->OriginHasData(kOrigin1, kPersistent, kClientDB));
143   EXPECT_FALSE(manager()->OriginHasData(kOrigin2, kTemporary, kClientFile));
144   EXPECT_FALSE(manager()->OriginHasData(kOrigin2, kTemporary, kClientDB));
145   EXPECT_FALSE(manager()->OriginHasData(kOrigin2, kPersistent, kClientFile));
146   EXPECT_FALSE(manager()->OriginHasData(kOrigin2, kPersistent, kClientDB));
147
148   manager()->AddOrigin(kOrigin2, kTemporary, kClientFile | kClientDB,
149       base::Time::Now());
150   EXPECT_TRUE(manager()->OriginHasData(kOrigin1, kTemporary, kClientFile));
151   EXPECT_FALSE(manager()->OriginHasData(kOrigin1, kTemporary, kClientDB));
152   EXPECT_TRUE(manager()->OriginHasData(kOrigin1, kPersistent, kClientFile));
153   EXPECT_FALSE(manager()->OriginHasData(kOrigin1, kPersistent, kClientDB));
154   EXPECT_TRUE(manager()->OriginHasData(kOrigin2, kTemporary, kClientFile));
155   EXPECT_TRUE(manager()->OriginHasData(kOrigin2, kTemporary, kClientDB));
156   EXPECT_FALSE(manager()->OriginHasData(kOrigin2, kPersistent, kClientFile));
157   EXPECT_FALSE(manager()->OriginHasData(kOrigin2, kPersistent, kClientDB));
158 }
159
160 TEST_F(MockQuotaManagerTest, OriginDeletion) {
161   manager()->AddOrigin(kOrigin1, kTemporary, kClientFile, base::Time::Now());
162   manager()->AddOrigin(kOrigin2, kTemporary, kClientFile | kClientDB,
163       base::Time::Now());
164   manager()->AddOrigin(kOrigin3, kTemporary, kClientFile | kClientDB,
165       base::Time::Now());
166
167   DeleteOriginData(kOrigin2, kTemporary, kClientFile);
168   base::RunLoop().RunUntilIdle();
169
170   EXPECT_EQ(1, deletion_callback_count());
171   EXPECT_TRUE(manager()->OriginHasData(kOrigin1, kTemporary, kClientFile));
172   EXPECT_FALSE(manager()->OriginHasData(kOrigin2, kTemporary, kClientFile));
173   EXPECT_TRUE(manager()->OriginHasData(kOrigin2, kTemporary, kClientDB));
174   EXPECT_TRUE(manager()->OriginHasData(kOrigin3, kTemporary, kClientFile));
175   EXPECT_TRUE(manager()->OriginHasData(kOrigin3, kTemporary, kClientDB));
176
177   DeleteOriginData(kOrigin3, kTemporary, kClientFile | kClientDB);
178   base::RunLoop().RunUntilIdle();
179
180   EXPECT_EQ(2, deletion_callback_count());
181   EXPECT_TRUE(manager()->OriginHasData(kOrigin1, kTemporary, kClientFile));
182   EXPECT_FALSE(manager()->OriginHasData(kOrigin2, kTemporary, kClientFile));
183   EXPECT_TRUE(manager()->OriginHasData(kOrigin2, kTemporary, kClientDB));
184   EXPECT_FALSE(manager()->OriginHasData(kOrigin3, kTemporary, kClientFile));
185   EXPECT_FALSE(manager()->OriginHasData(kOrigin3, kTemporary, kClientDB));
186 }
187
188 TEST_F(MockQuotaManagerTest, ModifiedOrigins) {
189   base::Time now = base::Time::Now();
190   base::Time then = base::Time();
191   base::TimeDelta an_hour = base::TimeDelta::FromMilliseconds(3600000);
192   base::TimeDelta a_minute = base::TimeDelta::FromMilliseconds(60000);
193
194   GetModifiedOrigins(kTemporary, then);
195   base::RunLoop().RunUntilIdle();
196   EXPECT_TRUE(origins().empty());
197
198   manager()->AddOrigin(kOrigin1, kTemporary, kClientFile, now - an_hour);
199
200   GetModifiedOrigins(kTemporary, then);
201   base::RunLoop().RunUntilIdle();
202
203   EXPECT_EQ(kTemporary, type());
204   EXPECT_EQ(1UL, origins().size());
205   EXPECT_EQ(1UL, origins().count(kOrigin1));
206   EXPECT_EQ(0UL, origins().count(kOrigin2));
207
208   manager()->AddOrigin(kOrigin2, kTemporary, kClientFile, now);
209
210   GetModifiedOrigins(kTemporary, then);
211   base::RunLoop().RunUntilIdle();
212
213   EXPECT_EQ(kTemporary, type());
214   EXPECT_EQ(2UL, origins().size());
215   EXPECT_EQ(1UL, origins().count(kOrigin1));
216   EXPECT_EQ(1UL, origins().count(kOrigin2));
217
218   GetModifiedOrigins(kTemporary, now - a_minute);
219   base::RunLoop().RunUntilIdle();
220
221   EXPECT_EQ(kTemporary, type());
222   EXPECT_EQ(1UL, origins().size());
223   EXPECT_EQ(0UL, origins().count(kOrigin1));
224   EXPECT_EQ(1UL, origins().count(kOrigin2));
225 }
226 }  // namespace content