Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(237)

Side by Side Diff: webkit/appcache/appcache_quota_client_unittest.cc

Issue 7031065: AppCache + Quota integration (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
Property Changes:
Added: svn:eol-style
+ LF
OLDNEW
(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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698