|
OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2011 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/memory/scoped_callback_factory.h" | |
8 #include "base/message_loop.h" | |
9 #include "base/message_loop_proxy.h" | |
10 #include "net/base/net_errors.h" | |
11 #include "testing/gtest/include/gtest/gtest.h" | |
12 #include "webkit/appcache/appcache_quota_client.h" | |
13 #include "webkit/appcache/mock_appcache_service.h" | |
14 | |
15 namespace appcache { | |
16 | |
17 // Declared to shorten the line lengths. | |
18 static const quota::StorageType kTemp = quota::kStorageTypeTemporary; | |
19 static const quota::StorageType kPerm = quota::kStorageTypePersistent; | |
20 | |
21 | |
22 // Base class for our test fixtures. | |
23 class AppCacheQuotaClientTest : public testing::Test { | |
24 public: | |
25 const GURL kOriginA; | |
26 const GURL kOriginB; | |
27 const GURL kOriginOther; | |
28 | |
29 | |
30 AppCacheQuotaClientTest() | |
31 : kOriginA("http://host"), | |
32 kOriginB("http://host:8000"), | |
33 kOriginOther("http://other"), | |
34 usage_(0), | |
35 delete_status_(quota::kQuotaStatusUnknown), | |
36 num_get_origin_usage_completions_(0), | |
37 num_get_origins_completions_(0), | |
38 num_delete_origins_completions_(0), | |
39 callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { | |
40 } | |
41 | |
42 int64 GetOriginUsage( | |
43 quota::QuotaClient* client, | |
44 const GURL& origin, | |
45 quota::StorageType type) { | |
46 usage_ = -1; | |
47 AsyncGetOriginUsage(client, origin, type); | |
48 MessageLoop::current()->RunAllPending(); | |
49 return usage_; | |
50 } | |
51 | |
52 const std::set<GURL>& GetOriginsForType( | |
53 quota::QuotaClient* client, | |
54 quota::StorageType type) { | |
55 origins_.clear(); | |
56 AsyncGetOriginsForType(client, type); | |
57 MessageLoop::current()->RunAllPending(); | |
58 return origins_; | |
59 } | |
60 | |
61 const std::set<GURL>& GetOriginsForHost( | |
62 quota::QuotaClient* client, | |
63 quota::StorageType type, | |
64 const std::string& host) { | |
65 origins_.clear(); | |
66 AsyncGetOriginsForHost(client, type, host); | |
67 MessageLoop::current()->RunAllPending(); | |
68 return origins_; | |
69 } | |
70 | |
71 quota::QuotaStatusCode DeleteOriginData( | |
72 quota::QuotaClient* client, | |
73 quota::StorageType type, | |
74 const GURL& origin) { | |
75 delete_status_ = quota::kQuotaStatusUnknown; | |
76 AsyncDeleteOriginData(client, type, origin); | |
77 MessageLoop::current()->RunAllPending(); | |
78 return delete_status_; | |
79 } | |
80 | |
81 void AsyncGetOriginUsage( | |
82 quota::QuotaClient* client, | |
83 const GURL& origin, | |
84 quota::StorageType type) { | |
85 client->GetOriginUsage(origin, type, | |
86 callback_factory_.NewCallback( | |
87 &AppCacheQuotaClientTest::OnGetOriginUsageComplete)); | |
88 } | |
89 | |
90 void AsyncGetOriginsForType( | |
91 quota::QuotaClient* client, | |
92 quota::StorageType type) { | |
93 client->GetOriginsForType(type, | |
94 callback_factory_.NewCallback( | |
95 &AppCacheQuotaClientTest::OnGetOriginsComplete)); | |
96 } | |
97 | |
98 void AsyncGetOriginsForHost( | |
99 quota::QuotaClient* client, | |
100 quota::StorageType type, | |
101 const std::string& host) { | |
102 client->GetOriginsForHost(type, host, | |
103 callback_factory_.NewCallback( | |
104 &AppCacheQuotaClientTest::OnGetOriginsComplete)); | |
105 } | |
106 | |
107 void AsyncDeleteOriginData( | |
108 quota::QuotaClient* client, | |
109 quota::StorageType type, | |
110 const GURL& origin) { | |
111 client->DeleteOriginData(origin, type, | |
112 callback_factory_.NewCallback( | |
113 &AppCacheQuotaClientTest::OnDeleteOriginDataComplete)); | |
114 } | |
115 | |
116 void SetUsageMapEntry(const GURL& origin, int64 usage) { | |
117 mock_service_.storage()->usage_map_[origin] = usage; | |
118 } | |
119 | |
120 AppCacheQuotaClient* CreateClient() { | |
121 return new AppCacheQuotaClient(&mock_service_); | |
122 } | |
123 | |
124 void Call_NotifyAppCacheReady(AppCacheQuotaClient* client) { | |
125 client->NotifyAppCacheReady(); | |
126 } | |
127 | |
128 void Call_NotifyAppCacheDestroyed(AppCacheQuotaClient* client) { | |
129 client->NotifyAppCacheDestroyed(); | |
130 } | |
131 | |
132 void Call_OnQuotaManagerDestroyed(AppCacheQuotaClient* client) { | |
133 client->OnQuotaManagerDestroyed(); | |
134 } | |
135 | |
136 void OnGetOriginUsageComplete(int64 usage) { | |
137 ++num_get_origin_usage_completions_; | |
138 usage_ = usage; | |
139 } | |
140 | |
141 void OnGetOriginsComplete(const std::set<GURL>& origins) { | |
142 ++num_get_origins_completions_; | |
143 origins_ = origins; | |
144 } | |
145 | |
146 void OnDeleteOriginDataComplete(quota::QuotaStatusCode status) { | |
147 ++num_delete_origins_completions_; | |
148 delete_status_ = status; | |
149 } | |
150 | |
151 int64 usage_; | |
152 std::set<GURL> origins_; | |
153 quota::QuotaStatusCode delete_status_; | |
154 int num_get_origin_usage_completions_; | |
155 int num_get_origins_completions_; | |
156 int num_delete_origins_completions_; | |
157 MockAppCacheService mock_service_; | |
158 base::ScopedCallbackFactory<AppCacheQuotaClientTest> callback_factory_; | |
159 }; | |
160 | |
161 | |
162 TEST_F(AppCacheQuotaClientTest, BasicCreateDestroy) { | |
163 AppCacheQuotaClient* client = CreateClient(); | |
164 Call_NotifyAppCacheReady(client); | |
165 Call_OnQuotaManagerDestroyed(client); | |
166 Call_NotifyAppCacheDestroyed(client); | |
167 } | |
168 | |
169 TEST_F(AppCacheQuotaClientTest, EmptyService) { | |
170 AppCacheQuotaClient* client = CreateClient(); | |
171 Call_NotifyAppCacheReady(client); | |
172 | |
173 EXPECT_EQ(0, GetOriginUsage(client, kOriginA, kTemp)); | |
174 EXPECT_EQ(0, GetOriginUsage(client, kOriginA, kPerm)); | |
175 EXPECT_TRUE(GetOriginsForType(client, kTemp).empty()); | |
176 EXPECT_TRUE(GetOriginsForType(client, kPerm).empty()); | |
177 EXPECT_TRUE(GetOriginsForHost(client, kTemp, kOriginA.host()).empty()); | |
178 EXPECT_TRUE(GetOriginsForHost(client, kPerm, kOriginA.host()).empty()); | |
179 EXPECT_EQ(quota::kQuotaStatusOk, DeleteOriginData(client, kTemp, kOriginA)); | |
180 EXPECT_EQ(quota::kQuotaStatusOk, DeleteOriginData(client, kPerm, kOriginA)); | |
181 | |
182 Call_NotifyAppCacheDestroyed(client); | |
183 Call_OnQuotaManagerDestroyed(client); | |
184 } | |
185 | |
186 TEST_F(AppCacheQuotaClientTest, NoService) { | |
187 AppCacheQuotaClient* client = CreateClient(); | |
188 Call_NotifyAppCacheReady(client); | |
189 Call_NotifyAppCacheDestroyed(client); | |
190 | |
191 EXPECT_EQ(0, GetOriginUsage(client, kOriginA, kTemp)); | |
192 EXPECT_EQ(0, GetOriginUsage(client, kOriginA, kPerm)); | |
193 EXPECT_TRUE(GetOriginsForType(client, kTemp).empty()); | |
194 EXPECT_TRUE(GetOriginsForType(client, kPerm).empty()); | |
195 EXPECT_TRUE(GetOriginsForHost(client, kTemp, kOriginA.host()).empty()); | |
196 EXPECT_TRUE(GetOriginsForHost(client, kPerm, kOriginA.host()).empty()); | |
197 EXPECT_EQ(quota::kQuotaErrorAbort, | |
198 DeleteOriginData(client, kTemp, kOriginA)); | |
199 EXPECT_EQ(quota::kQuotaErrorAbort, | |
200 DeleteOriginData(client, kPerm, kOriginA)); | |
201 | |
202 Call_OnQuotaManagerDestroyed(client); | |
203 } | |
204 | |
205 | |
kinuko
2011/06/08 13:49:25
nit: extra empty line
michaeln
2011/06/08 18:09:54
Done.
| |
206 TEST_F(AppCacheQuotaClientTest, GetOriginUsage) { | |
207 AppCacheQuotaClient* client = CreateClient(); | |
208 Call_NotifyAppCacheReady(client); | |
209 | |
210 SetUsageMapEntry(kOriginA, 1000); | |
211 EXPECT_EQ(1000, GetOriginUsage(client, kOriginA, kTemp)); | |
212 EXPECT_EQ(0, GetOriginUsage(client, kOriginA, kPerm)); | |
213 | |
214 Call_NotifyAppCacheDestroyed(client); | |
215 Call_OnQuotaManagerDestroyed(client); | |
216 } | |
217 | |
218 TEST_F(AppCacheQuotaClientTest, GetOriginsForHost) { | |
219 AppCacheQuotaClient* client = CreateClient(); | |
220 Call_NotifyAppCacheReady(client); | |
221 | |
222 EXPECT_EQ(kOriginA.host(), kOriginB.host()); | |
223 EXPECT_NE(kOriginA.host(), kOriginOther.host()); | |
224 | |
225 std::set<GURL> origins = GetOriginsForHost(client, kTemp, kOriginA.host()); | |
226 EXPECT_TRUE(origins.empty()); | |
227 | |
228 SetUsageMapEntry(kOriginA, 1000); | |
229 SetUsageMapEntry(kOriginB, 10); | |
230 SetUsageMapEntry(kOriginOther, 500); | |
231 | |
232 origins = GetOriginsForHost(client, kTemp, kOriginA.host()); | |
233 EXPECT_EQ(2ul, origins.size()); | |
234 EXPECT_TRUE(origins.find(kOriginA) != origins.end()); | |
235 EXPECT_TRUE(origins.find(kOriginB) != origins.end()); | |
236 | |
237 origins = GetOriginsForHost(client, kTemp, kOriginOther.host()); | |
238 EXPECT_EQ(1ul, origins.size()); | |
239 EXPECT_TRUE(origins.find(kOriginOther) != origins.end()); | |
240 | |
241 origins = GetOriginsForHost(client, kPerm, kOriginA.host()); | |
242 EXPECT_TRUE(origins.empty()); | |
243 | |
244 Call_NotifyAppCacheDestroyed(client); | |
245 Call_OnQuotaManagerDestroyed(client); | |
246 } | |
247 | |
248 TEST_F(AppCacheQuotaClientTest, GetOriginsForType) { | |
249 AppCacheQuotaClient* client = CreateClient(); | |
250 Call_NotifyAppCacheReady(client); | |
251 | |
252 EXPECT_TRUE(GetOriginsForType(client, kTemp).empty()); | |
253 EXPECT_TRUE(GetOriginsForType(client, kPerm).empty()); | |
254 | |
255 SetUsageMapEntry(kOriginA, 1000); | |
256 SetUsageMapEntry(kOriginB, 10); | |
257 | |
258 std::set<GURL> origins = GetOriginsForType(client, kTemp); | |
259 EXPECT_EQ(2ul, origins.size()); | |
260 EXPECT_TRUE(origins.find(kOriginA) != origins.end()); | |
261 EXPECT_TRUE(origins.find(kOriginB) != origins.end()); | |
262 | |
263 EXPECT_TRUE(GetOriginsForType(client, kPerm).empty()); | |
264 | |
265 Call_NotifyAppCacheDestroyed(client); | |
266 Call_OnQuotaManagerDestroyed(client); | |
267 } | |
268 | |
269 TEST_F(AppCacheQuotaClientTest, DeleteOriginData) { | |
270 AppCacheQuotaClient* client = CreateClient(); | |
271 Call_NotifyAppCacheReady(client); | |
272 | |
273 // Perm deletions are short circuited in the Client and | |
274 // should not reach the AppCacheService. | |
275 EXPECT_EQ(quota::kQuotaStatusOk, | |
276 DeleteOriginData(client, kPerm, kOriginA)); | |
277 EXPECT_EQ(0, mock_service_.delete_called_count()); | |
278 | |
279 EXPECT_EQ(quota::kQuotaStatusOk, | |
280 DeleteOriginData(client, kTemp, kOriginA)); | |
281 EXPECT_EQ(1, mock_service_.delete_called_count()); | |
282 | |
283 mock_service_.set_mock_delete_appcaches_for_origin_result( | |
284 net::ERR_ABORTED); | |
285 EXPECT_EQ(quota::kQuotaErrorAbort, | |
286 DeleteOriginData(client, kTemp, kOriginA)); | |
287 EXPECT_EQ(2, mock_service_.delete_called_count()); | |
kinuko
2011/06/08 13:49:25
don't we need to call Call_NotifyAppCacheDestroyed
michaeln
2011/06/08 18:09:54
Yes... done... thnx
| |
288 } | |
289 | |
290 TEST_F(AppCacheQuotaClientTest, PendingRequests) { | |
291 AppCacheQuotaClient* client = CreateClient(); | |
292 | |
293 SetUsageMapEntry(kOriginA, 1000); | |
294 SetUsageMapEntry(kOriginB, 10); | |
295 SetUsageMapEntry(kOriginOther, 500); | |
296 | |
297 // Queue up some reqeusts. | |
298 AsyncGetOriginUsage(client, kOriginA, kPerm); | |
299 AsyncGetOriginUsage(client, kOriginB, kTemp); | |
300 AsyncGetOriginsForType(client, kPerm); | |
301 AsyncGetOriginsForType(client, kTemp); | |
302 AsyncGetOriginsForHost(client, kTemp, kOriginA.host()); | |
303 AsyncGetOriginsForHost(client, kTemp, kOriginOther.host()); | |
304 AsyncDeleteOriginData(client, kTemp, kOriginA); | |
305 AsyncDeleteOriginData(client, kPerm, kOriginA); | |
306 AsyncDeleteOriginData(client, kTemp, kOriginB); | |
307 | |
308 EXPECT_EQ(0, num_get_origin_usage_completions_); | |
309 EXPECT_EQ(0, num_get_origins_completions_); | |
310 EXPECT_EQ(0, num_delete_origins_completions_); | |
311 MessageLoop::current()->RunAllPending(); | |
312 EXPECT_EQ(0, num_get_origin_usage_completions_); | |
313 EXPECT_EQ(0, num_get_origins_completions_); | |
314 EXPECT_EQ(0, num_delete_origins_completions_); | |
315 | |
316 // Pending requests should get serviced when the appcache is ready. | |
317 Call_NotifyAppCacheReady(client); | |
318 EXPECT_EQ(2, num_get_origin_usage_completions_); | |
319 EXPECT_EQ(4, num_get_origins_completions_); | |
320 EXPECT_EQ(0, num_delete_origins_completions_); | |
321 MessageLoop::current()->RunAllPending(); | |
322 EXPECT_EQ(3, num_delete_origins_completions_); // deletes are really async | |
323 | |
324 // They should be serviced in order requested. | |
325 EXPECT_EQ(10, usage_); | |
326 EXPECT_EQ(1ul, origins_.size()); | |
327 EXPECT_TRUE(origins_.find(kOriginOther) != origins_.end()); | |
328 | |
329 Call_NotifyAppCacheDestroyed(client); | |
330 Call_OnQuotaManagerDestroyed(client); | |
331 } | |
332 | |
333 TEST_F(AppCacheQuotaClientTest, DestroyServiceWithPending) { | |
334 } | |
335 | |
336 TEST_F(AppCacheQuotaClientTest, DestroyQuotaManagerWithPending) { | |
337 } | |
338 | |
339 | |
340 } // namespace appcache | |
OLD | NEW |