OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 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 <map> | |
6 | |
7 #include "base/bind.h" | |
8 #include "base/files/file_path.h" | |
9 #include "base/message_loop/message_loop_proxy.h" | |
10 #include "base/run_loop.h" | |
11 #include "base/strings/utf_string_conversions.h" | |
12 #include "net/base/completion_callback.h" | |
13 #include "net/base/net_errors.h" | |
14 #include "testing/gtest/include/gtest/gtest.h" | |
15 #include "webkit/browser/database/database_quota_client.h" | |
16 #include "webkit/browser/database/database_tracker.h" | |
17 #include "webkit/browser/database/database_util.h" | |
18 #include "webkit/common/database/database_identifier.h" | |
19 | |
20 namespace webkit_database { | |
21 | |
22 // Declared to shorten the line lengths. | |
23 static const quota::StorageType kTemp = quota::kStorageTypeTemporary; | |
24 static const quota::StorageType kPerm = quota::kStorageTypePersistent; | |
25 | |
26 // Mock tracker class the mocks up those methods of the tracker | |
27 // that are used by the QuotaClient. | |
28 class MockDatabaseTracker : public DatabaseTracker { | |
29 public: | |
30 MockDatabaseTracker() | |
31 : DatabaseTracker(base::FilePath(), false, NULL, NULL, NULL), | |
32 delete_called_count_(0), | |
33 async_delete_(false) {} | |
34 | |
35 virtual bool GetOriginInfo( | |
36 const std::string& origin_identifier, | |
37 OriginInfo* info) OVERRIDE { | |
38 std::map<GURL, MockOriginInfo>::const_iterator found = | |
39 mock_origin_infos_.find( | |
40 webkit_database::GetOriginFromIdentifier(origin_identifier)); | |
41 if (found == mock_origin_infos_.end()) | |
42 return false; | |
43 *info = OriginInfo(found->second); | |
44 return true; | |
45 } | |
46 | |
47 virtual bool GetAllOriginIdentifiers( | |
48 std::vector<std::string>* origins_identifiers) OVERRIDE { | |
49 std::map<GURL, MockOriginInfo>::const_iterator iter; | |
50 for (iter = mock_origin_infos_.begin(); | |
51 iter != mock_origin_infos_.end(); | |
52 ++iter) { | |
53 origins_identifiers->push_back(iter->second.GetOriginIdentifier()); | |
54 } | |
55 return true; | |
56 } | |
57 | |
58 virtual bool GetAllOriginsInfo( | |
59 std::vector<OriginInfo>* origins_info) OVERRIDE { | |
60 std::map<GURL, MockOriginInfo>::const_iterator iter; | |
61 for (iter = mock_origin_infos_.begin(); | |
62 iter != mock_origin_infos_.end(); | |
63 ++iter) { | |
64 origins_info->push_back(OriginInfo(iter->second)); | |
65 } | |
66 return true; | |
67 } | |
68 | |
69 virtual int DeleteDataForOrigin( | |
70 const std::string& origin_identifier, | |
71 const net::CompletionCallback& callback) OVERRIDE { | |
72 ++delete_called_count_; | |
73 if (async_delete()) { | |
74 base::MessageLoopProxy::current()->PostTask( | |
75 FROM_HERE, | |
76 base::Bind(&MockDatabaseTracker::AsyncDeleteDataForOrigin, this, | |
77 callback)); | |
78 return net::ERR_IO_PENDING; | |
79 } | |
80 return net::OK; | |
81 } | |
82 | |
83 void AsyncDeleteDataForOrigin(const net::CompletionCallback& callback) { | |
84 callback.Run(net::OK); | |
85 } | |
86 | |
87 void AddMockDatabase(const GURL& origin, const char* name, int size) { | |
88 MockOriginInfo& info = mock_origin_infos_[origin]; | |
89 info.set_origin(webkit_database::GetIdentifierFromOrigin(origin)); | |
90 info.AddMockDatabase(base::ASCIIToUTF16(name), size); | |
91 } | |
92 | |
93 int delete_called_count() { return delete_called_count_; } | |
94 bool async_delete() { return async_delete_; } | |
95 void set_async_delete(bool async) { async_delete_ = async; } | |
96 | |
97 protected: | |
98 virtual ~MockDatabaseTracker() {} | |
99 | |
100 private: | |
101 class MockOriginInfo : public OriginInfo { | |
102 public: | |
103 void set_origin(const std::string& origin_identifier) { | |
104 origin_identifier_ = origin_identifier; | |
105 } | |
106 | |
107 void AddMockDatabase(const base::string16& name, int size) { | |
108 EXPECT_TRUE(database_info_.find(name) == database_info_.end()); | |
109 database_info_[name].first = size; | |
110 total_size_ += size; | |
111 } | |
112 }; | |
113 | |
114 int delete_called_count_; | |
115 bool async_delete_; | |
116 std::map<GURL, MockOriginInfo> mock_origin_infos_; | |
117 }; | |
118 | |
119 | |
120 // Base class for our test fixtures. | |
121 class DatabaseQuotaClientTest : public testing::Test { | |
122 public: | |
123 const GURL kOriginA; | |
124 const GURL kOriginB; | |
125 const GURL kOriginOther; | |
126 | |
127 DatabaseQuotaClientTest() | |
128 : kOriginA("http://host"), | |
129 kOriginB("http://host:8000"), | |
130 kOriginOther("http://other"), | |
131 usage_(0), | |
132 mock_tracker_(new MockDatabaseTracker), | |
133 weak_factory_(this) { | |
134 } | |
135 | |
136 int64 GetOriginUsage( | |
137 quota::QuotaClient* client, | |
138 const GURL& origin, | |
139 quota::StorageType type) { | |
140 usage_ = 0; | |
141 client->GetOriginUsage( | |
142 origin, type, | |
143 base::Bind(&DatabaseQuotaClientTest::OnGetOriginUsageComplete, | |
144 weak_factory_.GetWeakPtr())); | |
145 base::RunLoop().RunUntilIdle(); | |
146 return usage_; | |
147 } | |
148 | |
149 const std::set<GURL>& GetOriginsForType( | |
150 quota::QuotaClient* client, | |
151 quota::StorageType type) { | |
152 origins_.clear(); | |
153 client->GetOriginsForType( | |
154 type, | |
155 base::Bind(&DatabaseQuotaClientTest::OnGetOriginsComplete, | |
156 weak_factory_.GetWeakPtr())); | |
157 base::RunLoop().RunUntilIdle(); | |
158 return origins_; | |
159 } | |
160 | |
161 const std::set<GURL>& GetOriginsForHost( | |
162 quota::QuotaClient* client, | |
163 quota::StorageType type, | |
164 const std::string& host) { | |
165 origins_.clear(); | |
166 client->GetOriginsForHost( | |
167 type, host, | |
168 base::Bind(&DatabaseQuotaClientTest::OnGetOriginsComplete, | |
169 weak_factory_.GetWeakPtr())); | |
170 base::RunLoop().RunUntilIdle(); | |
171 return origins_; | |
172 } | |
173 | |
174 bool DeleteOriginData( | |
175 quota::QuotaClient* client, | |
176 quota::StorageType type, | |
177 const GURL& origin) { | |
178 delete_status_ = quota::kQuotaStatusUnknown; | |
179 client->DeleteOriginData( | |
180 origin, type, | |
181 base::Bind(&DatabaseQuotaClientTest::OnDeleteOriginDataComplete, | |
182 weak_factory_.GetWeakPtr())); | |
183 base::RunLoop().RunUntilIdle(); | |
184 return delete_status_ == quota::kQuotaStatusOk; | |
185 } | |
186 | |
187 MockDatabaseTracker* mock_tracker() { return mock_tracker_.get(); } | |
188 | |
189 | |
190 private: | |
191 void OnGetOriginUsageComplete(int64 usage) { | |
192 usage_ = usage; | |
193 } | |
194 | |
195 void OnGetOriginsComplete(const std::set<GURL>& origins) { | |
196 origins_ = origins; | |
197 } | |
198 | |
199 void OnDeleteOriginDataComplete(quota::QuotaStatusCode status) { | |
200 delete_status_ = status; | |
201 } | |
202 | |
203 base::MessageLoop message_loop_; | |
204 int64 usage_; | |
205 std::set<GURL> origins_; | |
206 quota::QuotaStatusCode delete_status_; | |
207 scoped_refptr<MockDatabaseTracker> mock_tracker_; | |
208 base::WeakPtrFactory<DatabaseQuotaClientTest> weak_factory_; | |
209 }; | |
210 | |
211 | |
212 TEST_F(DatabaseQuotaClientTest, GetOriginUsage) { | |
213 DatabaseQuotaClient client(base::MessageLoopProxy::current().get(), | |
214 mock_tracker()); | |
215 | |
216 EXPECT_EQ(0, GetOriginUsage(&client, kOriginA, kTemp)); | |
217 EXPECT_EQ(0, GetOriginUsage(&client, kOriginA, kPerm)); | |
218 | |
219 mock_tracker()->AddMockDatabase(kOriginA, "fooDB", 1000); | |
220 EXPECT_EQ(1000, GetOriginUsage(&client, kOriginA, kTemp)); | |
221 EXPECT_EQ(0, GetOriginUsage(&client, kOriginA, kPerm)); | |
222 | |
223 EXPECT_EQ(0, GetOriginUsage(&client, kOriginB, kPerm)); | |
224 EXPECT_EQ(0, GetOriginUsage(&client, kOriginB, kTemp)); | |
225 } | |
226 | |
227 TEST_F(DatabaseQuotaClientTest, GetOriginsForHost) { | |
228 DatabaseQuotaClient client(base::MessageLoopProxy::current().get(), | |
229 mock_tracker()); | |
230 | |
231 EXPECT_EQ(kOriginA.host(), kOriginB.host()); | |
232 EXPECT_NE(kOriginA.host(), kOriginOther.host()); | |
233 | |
234 std::set<GURL> origins = GetOriginsForHost(&client, kTemp, kOriginA.host()); | |
235 EXPECT_TRUE(origins.empty()); | |
236 | |
237 mock_tracker()->AddMockDatabase(kOriginA, "fooDB", 1000); | |
238 origins = GetOriginsForHost(&client, kTemp, kOriginA.host()); | |
239 EXPECT_EQ(origins.size(), 1ul); | |
240 EXPECT_TRUE(origins.find(kOriginA) != origins.end()); | |
241 | |
242 mock_tracker()->AddMockDatabase(kOriginB, "barDB", 1000); | |
243 origins = GetOriginsForHost(&client, kTemp, kOriginA.host()); | |
244 EXPECT_EQ(origins.size(), 2ul); | |
245 EXPECT_TRUE(origins.find(kOriginA) != origins.end()); | |
246 EXPECT_TRUE(origins.find(kOriginB) != origins.end()); | |
247 | |
248 EXPECT_TRUE(GetOriginsForHost(&client, kPerm, kOriginA.host()).empty()); | |
249 EXPECT_TRUE(GetOriginsForHost(&client, kTemp, kOriginOther.host()).empty()); | |
250 } | |
251 | |
252 TEST_F(DatabaseQuotaClientTest, GetOriginsForType) { | |
253 DatabaseQuotaClient client(base::MessageLoopProxy::current().get(), | |
254 mock_tracker()); | |
255 | |
256 EXPECT_TRUE(GetOriginsForType(&client, kTemp).empty()); | |
257 EXPECT_TRUE(GetOriginsForType(&client, kPerm).empty()); | |
258 | |
259 mock_tracker()->AddMockDatabase(kOriginA, "fooDB", 1000); | |
260 std::set<GURL> origins = GetOriginsForType(&client, kTemp); | |
261 EXPECT_EQ(origins.size(), 1ul); | |
262 EXPECT_TRUE(origins.find(kOriginA) != origins.end()); | |
263 | |
264 EXPECT_TRUE(GetOriginsForType(&client, kPerm).empty()); | |
265 } | |
266 | |
267 TEST_F(DatabaseQuotaClientTest, DeleteOriginData) { | |
268 DatabaseQuotaClient client(base::MessageLoopProxy::current().get(), | |
269 mock_tracker()); | |
270 | |
271 // Perm deletions are short circuited in the Client and | |
272 // should not reach the DatabaseTracker. | |
273 EXPECT_TRUE(DeleteOriginData(&client, kPerm, kOriginA)); | |
274 EXPECT_EQ(0, mock_tracker()->delete_called_count()); | |
275 | |
276 mock_tracker()->set_async_delete(false); | |
277 EXPECT_TRUE(DeleteOriginData(&client, kTemp, kOriginA)); | |
278 EXPECT_EQ(1, mock_tracker()->delete_called_count()); | |
279 | |
280 mock_tracker()->set_async_delete(true); | |
281 EXPECT_TRUE(DeleteOriginData(&client, kTemp, kOriginA)); | |
282 EXPECT_EQ(2, mock_tracker()->delete_called_count()); | |
283 } | |
284 | |
285 } // namespace webkit_database | |
OLD | NEW |