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

Side by Side Diff: content/browser/service_worker/service_worker_database_unittest.cc

Issue 355163003: Don't prematurely delete script resources when registration is deleted (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: patch for landing Created 6 years, 5 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/service_worker/service_worker_database.h" 5 #include "content/browser/service_worker/service_worker_database.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/file_util.h" 9 #include "base/file_util.h"
10 #include "base/files/scoped_temp_dir.h" 10 #include "base/files/scoped_temp_dir.h"
11 #include "base/stl_util.h" 11 #include "base/stl_util.h"
12 #include "content/browser/service_worker/service_worker_database.pb.h" 12 #include "content/browser/service_worker/service_worker_database.pb.h"
13 #include "content/common/service_worker/service_worker_types.h"
13 #include "testing/gtest/include/gtest/gtest.h" 14 #include "testing/gtest/include/gtest/gtest.h"
14 15
15 namespace content { 16 namespace content {
16 17
17 namespace { 18 namespace {
18 19
19 typedef ServiceWorkerDatabase::RegistrationData RegistrationData; 20 typedef ServiceWorkerDatabase::RegistrationData RegistrationData;
20 typedef ServiceWorkerDatabase::ResourceRecord Resource; 21 typedef ServiceWorkerDatabase::ResourceRecord Resource;
21 22
22 struct AvailableIds { 23 struct AvailableIds {
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 // Opening a new database does not write anything, so its schema version 113 // Opening a new database does not write anything, so its schema version
113 // should be 0. 114 // should be 0.
114 int64 db_version = -1; 115 int64 db_version = -1;
115 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 116 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
116 database->ReadDatabaseVersion(&db_version)); 117 database->ReadDatabaseVersion(&db_version));
117 EXPECT_EQ(0u, db_version); 118 EXPECT_EQ(0u, db_version);
118 119
119 // First writing triggers database initialization and bumps the schema 120 // First writing triggers database initialization and bumps the schema
120 // version. 121 // version.
121 std::vector<ServiceWorkerDatabase::ResourceRecord> resources; 122 std::vector<ServiceWorkerDatabase::ResourceRecord> resources;
123 int64 deleted_version_id;
122 std::vector<int64> newly_purgeable_resources; 124 std::vector<int64> newly_purgeable_resources;
123 ServiceWorkerDatabase::RegistrationData data; 125 ServiceWorkerDatabase::RegistrationData data;
124 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, 126 ASSERT_EQ(
125 database->WriteRegistration(data, resources, 127 ServiceWorkerDatabase::STATUS_OK,
126 &newly_purgeable_resources)); 128 database->WriteRegistration(
129 data, resources, &deleted_version_id, &newly_purgeable_resources));
127 130
128 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 131 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
129 database->ReadDatabaseVersion(&db_version)); 132 database->ReadDatabaseVersion(&db_version));
130 EXPECT_LT(0, db_version); 133 EXPECT_LT(0, db_version);
131 } 134 }
132 135
133 TEST(ServiceWorkerDatabaseTest, GetNextAvailableIds) { 136 TEST(ServiceWorkerDatabaseTest, GetNextAvailableIds) {
134 base::ScopedTempDir database_dir; 137 base::ScopedTempDir database_dir;
135 ASSERT_TRUE(database_dir.CreateUniqueTempDir()); 138 ASSERT_TRUE(database_dir.CreateUniqueTempDir());
136 scoped_ptr<ServiceWorkerDatabase> database( 139 scoped_ptr<ServiceWorkerDatabase> database(
(...skipping 12 matching lines...) Expand all
149 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, database->LazyOpen(true)); 152 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, database->LazyOpen(true));
150 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, database->GetNextAvailableIds( 153 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, database->GetNextAvailableIds(
151 &ids.reg_id, &ids.ver_id, &ids.res_id)); 154 &ids.reg_id, &ids.ver_id, &ids.res_id));
152 EXPECT_EQ(0, ids.reg_id); 155 EXPECT_EQ(0, ids.reg_id);
153 EXPECT_EQ(0, ids.ver_id); 156 EXPECT_EQ(0, ids.ver_id);
154 EXPECT_EQ(0, ids.res_id); 157 EXPECT_EQ(0, ids.res_id);
155 158
156 // Writing a registration bumps the next available ids. 159 // Writing a registration bumps the next available ids.
157 std::vector<Resource> resources; 160 std::vector<Resource> resources;
158 RegistrationData data1; 161 RegistrationData data1;
162 int64 deleted_version_id;
159 std::vector<int64> newly_purgeable_resources; 163 std::vector<int64> newly_purgeable_resources;
160 data1.registration_id = 100; 164 data1.registration_id = 100;
161 data1.scope = URL(origin, "/foo"); 165 data1.scope = URL(origin, "/foo");
162 data1.script = URL(origin, "/script1.js"); 166 data1.script = URL(origin, "/script1.js");
163 data1.version_id = 200; 167 data1.version_id = 200;
164 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, 168 ASSERT_EQ(
165 database->WriteRegistration(data1, resources, 169 ServiceWorkerDatabase::STATUS_OK,
166 &newly_purgeable_resources)); 170 database->WriteRegistration(
171 data1, resources, &deleted_version_id, &newly_purgeable_resources));
167 172
168 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, database->GetNextAvailableIds( 173 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, database->GetNextAvailableIds(
169 &ids.reg_id, &ids.ver_id, &ids.res_id)); 174 &ids.reg_id, &ids.ver_id, &ids.res_id));
170 EXPECT_EQ(101, ids.reg_id); 175 EXPECT_EQ(101, ids.reg_id);
171 EXPECT_EQ(201, ids.ver_id); 176 EXPECT_EQ(201, ids.ver_id);
172 EXPECT_EQ(0, ids.res_id); 177 EXPECT_EQ(0, ids.res_id);
173 178
174 // Writing a registration whose ids are lower than the stored ones should not 179 // Writing a registration whose ids are lower than the stored ones should not
175 // bump the next available ids. 180 // bump the next available ids.
176 RegistrationData data2; 181 RegistrationData data2;
177 data2.registration_id = 10; 182 data2.registration_id = 10;
178 data2.scope = URL(origin, "/bar"); 183 data2.scope = URL(origin, "/bar");
179 data2.script = URL(origin, "/script2.js"); 184 data2.script = URL(origin, "/script2.js");
180 data2.version_id = 20; 185 data2.version_id = 20;
181 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, 186 ASSERT_EQ(
182 database->WriteRegistration(data2, resources, 187 ServiceWorkerDatabase::STATUS_OK,
183 &newly_purgeable_resources)); 188 database->WriteRegistration(
189 data2, resources, &deleted_version_id, &newly_purgeable_resources));
184 190
185 // Close and reopen the database to verify the stored values. 191 // Close and reopen the database to verify the stored values.
186 database.reset(CreateDatabase(database_dir.path())); 192 database.reset(CreateDatabase(database_dir.path()));
187 193
188 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, database->GetNextAvailableIds( 194 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, database->GetNextAvailableIds(
189 &ids.reg_id, &ids.ver_id, &ids.res_id)); 195 &ids.reg_id, &ids.ver_id, &ids.res_id));
190 EXPECT_EQ(101, ids.reg_id); 196 EXPECT_EQ(101, ids.reg_id);
191 EXPECT_EQ(201, ids.ver_id); 197 EXPECT_EQ(201, ids.ver_id);
192 EXPECT_EQ(0, ids.res_id); 198 EXPECT_EQ(0, ids.res_id);
193 } 199 }
194 200
195 TEST(ServiceWorkerDatabaseTest, GetOriginsWithRegistrations) { 201 TEST(ServiceWorkerDatabaseTest, GetOriginsWithRegistrations) {
196 scoped_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); 202 scoped_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory());
197 203
198 std::set<GURL> origins; 204 std::set<GURL> origins;
199 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 205 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
200 database->GetOriginsWithRegistrations(&origins)); 206 database->GetOriginsWithRegistrations(&origins));
201 EXPECT_TRUE(origins.empty()); 207 EXPECT_TRUE(origins.empty());
202 208
203 std::vector<Resource> resources; 209 std::vector<Resource> resources;
210 int64 deleted_version_id;
204 std::vector<int64> newly_purgeable_resources; 211 std::vector<int64> newly_purgeable_resources;
205 212
206 GURL origin1("http://example.com"); 213 GURL origin1("http://example.com");
207 RegistrationData data1; 214 RegistrationData data1;
208 data1.registration_id = 123; 215 data1.registration_id = 123;
209 data1.scope = URL(origin1, "/foo"); 216 data1.scope = URL(origin1, "/foo");
210 data1.script = URL(origin1, "/script1.js"); 217 data1.script = URL(origin1, "/script1.js");
211 data1.version_id = 456; 218 data1.version_id = 456;
212 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, 219 ASSERT_EQ(
213 database->WriteRegistration(data1, resources, 220 ServiceWorkerDatabase::STATUS_OK,
214 &newly_purgeable_resources)); 221 database->WriteRegistration(
222 data1, resources, &deleted_version_id, &newly_purgeable_resources));
215 223
216 GURL origin2("https://www.example.com"); 224 GURL origin2("https://www.example.com");
217 RegistrationData data2; 225 RegistrationData data2;
218 data2.registration_id = 234; 226 data2.registration_id = 234;
219 data2.scope = URL(origin2, "/bar"); 227 data2.scope = URL(origin2, "/bar");
220 data2.script = URL(origin2, "/script2.js"); 228 data2.script = URL(origin2, "/script2.js");
221 data2.version_id = 567; 229 data2.version_id = 567;
222 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, 230 ASSERT_EQ(
223 database->WriteRegistration(data2, resources, 231 ServiceWorkerDatabase::STATUS_OK,
224 &newly_purgeable_resources)); 232 database->WriteRegistration(
233 data2, resources, &deleted_version_id, &newly_purgeable_resources));
225 234
226 GURL origin3("https://example.org"); 235 GURL origin3("https://example.org");
227 RegistrationData data3; 236 RegistrationData data3;
228 data3.registration_id = 345; 237 data3.registration_id = 345;
229 data3.scope = URL(origin3, "/hoge"); 238 data3.scope = URL(origin3, "/hoge");
230 data3.script = URL(origin3, "/script3.js"); 239 data3.script = URL(origin3, "/script3.js");
231 data3.version_id = 678; 240 data3.version_id = 678;
232 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, 241 ASSERT_EQ(
233 database->WriteRegistration(data3, resources, 242 ServiceWorkerDatabase::STATUS_OK,
234 &newly_purgeable_resources)); 243 database->WriteRegistration(
244 data3, resources, &deleted_version_id, &newly_purgeable_resources));
235 245
236 // |origin3| has two registrations. 246 // |origin3| has two registrations.
237 RegistrationData data4; 247 RegistrationData data4;
238 data4.registration_id = 456; 248 data4.registration_id = 456;
239 data4.scope = URL(origin3, "/fuga"); 249 data4.scope = URL(origin3, "/fuga");
240 data4.script = URL(origin3, "/script4.js"); 250 data4.script = URL(origin3, "/script4.js");
241 data4.version_id = 789; 251 data4.version_id = 789;
242 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, 252 ASSERT_EQ(
243 database->WriteRegistration(data4, resources, 253 ServiceWorkerDatabase::STATUS_OK,
244 &newly_purgeable_resources)); 254 database->WriteRegistration(
255 data4, resources, &deleted_version_id, &newly_purgeable_resources));
245 256
246 origins.clear(); 257 origins.clear();
247 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 258 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
248 database->GetOriginsWithRegistrations(&origins)); 259 database->GetOriginsWithRegistrations(&origins));
249 EXPECT_EQ(3U, origins.size()); 260 EXPECT_EQ(3U, origins.size());
250 EXPECT_TRUE(ContainsKey(origins, origin1)); 261 EXPECT_TRUE(ContainsKey(origins, origin1));
251 EXPECT_TRUE(ContainsKey(origins, origin2)); 262 EXPECT_TRUE(ContainsKey(origins, origin2));
252 EXPECT_TRUE(ContainsKey(origins, origin3)); 263 EXPECT_TRUE(ContainsKey(origins, origin3));
253 264
254 // |origin3| has another registration, so should not remove it from the 265 // |origin3| has another registration, so should not remove it from the
255 // unique origin list. 266 // unique origin list.
267 int64 version_id;
256 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, 268 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK,
257 database->DeleteRegistration(data4.registration_id, origin3, 269 database->DeleteRegistration(data4.registration_id,
270 origin3,
271 &version_id,
258 &newly_purgeable_resources)); 272 &newly_purgeable_resources));
259 273
260 origins.clear(); 274 origins.clear();
261 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 275 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
262 database->GetOriginsWithRegistrations(&origins)); 276 database->GetOriginsWithRegistrations(&origins));
263 EXPECT_EQ(3U, origins.size()); 277 EXPECT_EQ(3U, origins.size());
264 EXPECT_TRUE(ContainsKey(origins, origin1)); 278 EXPECT_TRUE(ContainsKey(origins, origin1));
265 EXPECT_TRUE(ContainsKey(origins, origin2)); 279 EXPECT_TRUE(ContainsKey(origins, origin2));
266 EXPECT_TRUE(ContainsKey(origins, origin3)); 280 EXPECT_TRUE(ContainsKey(origins, origin3));
267 281
268 // |origin3| should be removed from the unique origin list. 282 // |origin3| should be removed from the unique origin list.
269 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, 283 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK,
270 database->DeleteRegistration(data3.registration_id, origin3, 284 database->DeleteRegistration(data3.registration_id,
285 origin3,
286 &version_id,
271 &newly_purgeable_resources)); 287 &newly_purgeable_resources));
272 288
273 origins.clear(); 289 origins.clear();
274 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 290 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
275 database->GetOriginsWithRegistrations(&origins)); 291 database->GetOriginsWithRegistrations(&origins));
276 EXPECT_EQ(2U, origins.size()); 292 EXPECT_EQ(2U, origins.size());
277 EXPECT_TRUE(ContainsKey(origins, origin1)); 293 EXPECT_TRUE(ContainsKey(origins, origin1));
278 EXPECT_TRUE(ContainsKey(origins, origin2)); 294 EXPECT_TRUE(ContainsKey(origins, origin2));
279 } 295 }
280 296
281 TEST(ServiceWorkerDatabaseTest, GetRegistrationsForOrigin) { 297 TEST(ServiceWorkerDatabaseTest, GetRegistrationsForOrigin) {
282 scoped_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); 298 scoped_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory());
283 299
284 GURL origin1("http://example.com"); 300 GURL origin1("http://example.com");
285 GURL origin2("https://www.example.com"); 301 GURL origin2("https://www.example.com");
286 GURL origin3("https://example.org"); 302 GURL origin3("https://example.org");
287 303
288 std::vector<RegistrationData> registrations; 304 std::vector<RegistrationData> registrations;
289 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 305 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
290 database->GetRegistrationsForOrigin(origin1, &registrations)); 306 database->GetRegistrationsForOrigin(origin1, &registrations));
291 EXPECT_TRUE(registrations.empty()); 307 EXPECT_TRUE(registrations.empty());
292 308
293 std::vector<Resource> resources; 309 std::vector<Resource> resources;
310 int64 deleted_version_id;
294 std::vector<int64> newly_purgeable_resources; 311 std::vector<int64> newly_purgeable_resources;
295 312
296 RegistrationData data1; 313 RegistrationData data1;
297 data1.registration_id = 100; 314 data1.registration_id = 100;
298 data1.scope = URL(origin1, "/foo"); 315 data1.scope = URL(origin1, "/foo");
299 data1.script = URL(origin1, "/script1.js"); 316 data1.script = URL(origin1, "/script1.js");
300 data1.version_id = 1000; 317 data1.version_id = 1000;
301 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, 318 ASSERT_EQ(
302 database->WriteRegistration(data1, resources, 319 ServiceWorkerDatabase::STATUS_OK,
303 &newly_purgeable_resources)); 320 database->WriteRegistration(
321 data1, resources, &deleted_version_id, &newly_purgeable_resources));
304 322
305 RegistrationData data2; 323 RegistrationData data2;
306 data2.registration_id = 200; 324 data2.registration_id = 200;
307 data2.scope = URL(origin2, "/bar"); 325 data2.scope = URL(origin2, "/bar");
308 data2.script = URL(origin2, "/script2.js"); 326 data2.script = URL(origin2, "/script2.js");
309 data2.version_id = 2000; 327 data2.version_id = 2000;
310 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, 328 ASSERT_EQ(
311 database->WriteRegistration(data2, resources, 329 ServiceWorkerDatabase::STATUS_OK,
312 &newly_purgeable_resources)); 330 database->WriteRegistration(
331 data2, resources, &deleted_version_id, &newly_purgeable_resources));
313 332
314 RegistrationData data3; 333 RegistrationData data3;
315 data3.registration_id = 300; 334 data3.registration_id = 300;
316 data3.scope = URL(origin3, "/hoge"); 335 data3.scope = URL(origin3, "/hoge");
317 data3.script = URL(origin3, "/script3.js"); 336 data3.script = URL(origin3, "/script3.js");
318 data3.version_id = 3000; 337 data3.version_id = 3000;
319 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, 338 ASSERT_EQ(
320 database->WriteRegistration(data3, resources, 339 ServiceWorkerDatabase::STATUS_OK,
321 &newly_purgeable_resources)); 340 database->WriteRegistration(
341 data3, resources, &deleted_version_id, &newly_purgeable_resources));
322 342
323 // |origin3| has two registrations. 343 // |origin3| has two registrations.
324 RegistrationData data4; 344 RegistrationData data4;
325 data4.registration_id = 400; 345 data4.registration_id = 400;
326 data4.scope = URL(origin3, "/fuga"); 346 data4.scope = URL(origin3, "/fuga");
327 data4.script = URL(origin3, "/script4.js"); 347 data4.script = URL(origin3, "/script4.js");
328 data4.version_id = 4000; 348 data4.version_id = 4000;
329 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, 349 ASSERT_EQ(
330 database->WriteRegistration(data4, resources, 350 ServiceWorkerDatabase::STATUS_OK,
331 &newly_purgeable_resources)); 351 database->WriteRegistration(
352 data4, resources, &deleted_version_id, &newly_purgeable_resources));
332 353
333 registrations.clear(); 354 registrations.clear();
334 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 355 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
335 database->GetRegistrationsForOrigin(origin3, &registrations)); 356 database->GetRegistrationsForOrigin(origin3, &registrations));
336 EXPECT_EQ(2U, registrations.size()); 357 EXPECT_EQ(2U, registrations.size());
337 VerifyRegistrationData(data3, registrations[0]); 358 VerifyRegistrationData(data3, registrations[0]);
338 VerifyRegistrationData(data4, registrations[1]); 359 VerifyRegistrationData(data4, registrations[1]);
339 } 360 }
340 361
341 TEST(ServiceWorkerDatabaseTest, GetAllRegistrations) { 362 TEST(ServiceWorkerDatabaseTest, GetAllRegistrations) {
342 scoped_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); 363 scoped_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory());
343 364
344 std::vector<RegistrationData> registrations; 365 std::vector<RegistrationData> registrations;
345 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 366 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
346 database->GetAllRegistrations(&registrations)); 367 database->GetAllRegistrations(&registrations));
347 EXPECT_TRUE(registrations.empty()); 368 EXPECT_TRUE(registrations.empty());
348 369
349 std::vector<Resource> resources; 370 std::vector<Resource> resources;
371 int64 deleted_version_id;
350 std::vector<int64> newly_purgeable_resources; 372 std::vector<int64> newly_purgeable_resources;
351 373
352 GURL origin1("http://www1.example.com"); 374 GURL origin1("http://www1.example.com");
353 RegistrationData data1; 375 RegistrationData data1;
354 data1.registration_id = 100; 376 data1.registration_id = 100;
355 data1.scope = URL(origin1, "/foo"); 377 data1.scope = URL(origin1, "/foo");
356 data1.script = URL(origin1, "/script1.js"); 378 data1.script = URL(origin1, "/script1.js");
357 data1.version_id = 1000; 379 data1.version_id = 1000;
358 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, 380 ASSERT_EQ(
359 database->WriteRegistration(data1, resources, 381 ServiceWorkerDatabase::STATUS_OK,
360 &newly_purgeable_resources)); 382 database->WriteRegistration(
383 data1, resources, &deleted_version_id, &newly_purgeable_resources));
361 384
362 GURL origin2("http://www2.example.com"); 385 GURL origin2("http://www2.example.com");
363 RegistrationData data2; 386 RegistrationData data2;
364 data2.registration_id = 200; 387 data2.registration_id = 200;
365 data2.scope = URL(origin2, "/bar"); 388 data2.scope = URL(origin2, "/bar");
366 data2.script = URL(origin2, "/script2.js"); 389 data2.script = URL(origin2, "/script2.js");
367 data2.version_id = 2000; 390 data2.version_id = 2000;
368 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, 391 ASSERT_EQ(
369 database->WriteRegistration(data2, resources, 392 ServiceWorkerDatabase::STATUS_OK,
370 &newly_purgeable_resources)); 393 database->WriteRegistration(
394 data2, resources, &deleted_version_id, &newly_purgeable_resources));
371 395
372 GURL origin3("http://www3.example.com"); 396 GURL origin3("http://www3.example.com");
373 RegistrationData data3; 397 RegistrationData data3;
374 data3.registration_id = 300; 398 data3.registration_id = 300;
375 data3.scope = URL(origin3, "/hoge"); 399 data3.scope = URL(origin3, "/hoge");
376 data3.script = URL(origin3, "/script3.js"); 400 data3.script = URL(origin3, "/script3.js");
377 data3.version_id = 3000; 401 data3.version_id = 3000;
378 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, 402 ASSERT_EQ(
379 database->WriteRegistration(data3, resources, 403 ServiceWorkerDatabase::STATUS_OK,
380 &newly_purgeable_resources)); 404 database->WriteRegistration(
405 data3, resources, &deleted_version_id, &newly_purgeable_resources));
381 406
382 // |origin3| has two registrations. 407 // |origin3| has two registrations.
383 RegistrationData data4; 408 RegistrationData data4;
384 data4.registration_id = 400; 409 data4.registration_id = 400;
385 data4.scope = URL(origin3, "/fuga"); 410 data4.scope = URL(origin3, "/fuga");
386 data4.script = URL(origin3, "/script4.js"); 411 data4.script = URL(origin3, "/script4.js");
387 data4.version_id = 4000; 412 data4.version_id = 4000;
388 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, 413 ASSERT_EQ(
389 database->WriteRegistration(data4, resources, 414 ServiceWorkerDatabase::STATUS_OK,
390 &newly_purgeable_resources)); 415 database->WriteRegistration(
416 data4, resources, &deleted_version_id, &newly_purgeable_resources));
391 417
392 registrations.clear(); 418 registrations.clear();
393 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 419 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
394 database->GetAllRegistrations(&registrations)); 420 database->GetAllRegistrations(&registrations));
395 EXPECT_EQ(4U, registrations.size()); 421 EXPECT_EQ(4U, registrations.size());
396 VerifyRegistrationData(data1, registrations[0]); 422 VerifyRegistrationData(data1, registrations[0]);
397 VerifyRegistrationData(data2, registrations[1]); 423 VerifyRegistrationData(data2, registrations[1]);
398 VerifyRegistrationData(data3, registrations[2]); 424 VerifyRegistrationData(data3, registrations[2]);
399 VerifyRegistrationData(data4, registrations[3]); 425 VerifyRegistrationData(data4, registrations[3]);
400 } 426 }
(...skipping 17 matching lines...) Expand all
418 // the uncommitted list. 444 // the uncommitted list.
419 std::set<int64> uncommitted_ids; 445 std::set<int64> uncommitted_ids;
420 uncommitted_ids.insert(resources[0].resource_id); 446 uncommitted_ids.insert(resources[0].resource_id);
421 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 447 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
422 database->WriteUncommittedResourceIds(uncommitted_ids)); 448 database->WriteUncommittedResourceIds(uncommitted_ids));
423 std::set<int64> uncommitted_ids_out; 449 std::set<int64> uncommitted_ids_out;
424 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 450 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
425 database->GetUncommittedResourceIds(&uncommitted_ids_out)); 451 database->GetUncommittedResourceIds(&uncommitted_ids_out));
426 EXPECT_EQ(uncommitted_ids, uncommitted_ids_out); 452 EXPECT_EQ(uncommitted_ids, uncommitted_ids_out);
427 453
454 int64 deleted_version_id = 222; // Dummy initial value
428 std::vector<int64> newly_purgeable_resources; 455 std::vector<int64> newly_purgeable_resources;
429 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 456
430 database->WriteRegistration(data, resources, 457 EXPECT_EQ(
431 &newly_purgeable_resources)); 458 ServiceWorkerDatabase::STATUS_OK,
459 database->WriteRegistration(
460 data, resources, &deleted_version_id, &newly_purgeable_resources));
461 EXPECT_EQ(kInvalidServiceWorkerVersionId, deleted_version_id);
462 EXPECT_TRUE(newly_purgeable_resources.empty());
432 463
433 // Make sure that the registration and resource records are stored. 464 // Make sure that the registration and resource records are stored.
434 RegistrationData data_out; 465 RegistrationData data_out;
435 std::vector<Resource> resources_out; 466 std::vector<Resource> resources_out;
436 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 467 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
437 database->ReadRegistration( 468 database->ReadRegistration(
438 data.registration_id, origin, &data_out, &resources_out)); 469 data.registration_id, origin, &data_out, &resources_out));
439 VerifyRegistrationData(data, data_out); 470 VerifyRegistrationData(data, data_out);
440 VerifyResourceRecords(resources, resources_out); 471 VerifyResourceRecords(resources, resources_out);
441 472
442 // Make sure that the resource is removed from the uncommitted list. 473 // Make sure that the resource is removed from the uncommitted list.
443 uncommitted_ids_out.clear(); 474 uncommitted_ids_out.clear();
444 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 475 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
445 database->GetUncommittedResourceIds(&uncommitted_ids_out)); 476 database->GetUncommittedResourceIds(&uncommitted_ids_out));
446 EXPECT_TRUE(uncommitted_ids_out.empty()); 477 EXPECT_TRUE(uncommitted_ids_out.empty());
447 478
448 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 479 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
449 database->DeleteRegistration(data.registration_id, origin, 480 database->DeleteRegistration(data.registration_id,
481 origin,
482 &deleted_version_id,
450 &newly_purgeable_resources)); 483 &newly_purgeable_resources));
484 EXPECT_EQ(data.version_id, deleted_version_id);
451 ASSERT_EQ(resources.size(), newly_purgeable_resources.size()); 485 ASSERT_EQ(resources.size(), newly_purgeable_resources.size());
452 for (size_t i = 0; i < resources.size(); ++i) 486 for (size_t i = 0; i < resources.size(); ++i)
453 EXPECT_EQ(newly_purgeable_resources[i], resources[i].resource_id); 487 EXPECT_EQ(newly_purgeable_resources[i], resources[i].resource_id);
454 488
455 // Make sure that the registration and resource records are gone. 489 // Make sure that the registration and resource records are gone.
456 resources_out.clear(); 490 resources_out.clear();
457 EXPECT_EQ(ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND, 491 EXPECT_EQ(ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND,
458 database->ReadRegistration( 492 database->ReadRegistration(
459 data.registration_id, origin, &data_out, &resources_out)); 493 data.registration_id, origin, &data_out, &resources_out));
460 EXPECT_TRUE(resources_out.empty()); 494 EXPECT_TRUE(resources_out.empty());
461 495
462 // Resources should be purgeable because these are no longer referred. 496 // Resources should be purgeable because these are no longer referred.
463 std::set<int64> purgeable_ids_out; 497 std::set<int64> purgeable_ids_out;
464 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 498 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
465 database->GetPurgeableResourceIds(&purgeable_ids_out)); 499 database->GetPurgeableResourceIds(&purgeable_ids_out));
466 EXPECT_EQ(2u, purgeable_ids_out.size()); 500 EXPECT_EQ(2u, purgeable_ids_out.size());
467 EXPECT_TRUE(ContainsKey(purgeable_ids_out, resources[0].resource_id)); 501 EXPECT_TRUE(ContainsKey(purgeable_ids_out, resources[0].resource_id));
468 EXPECT_TRUE(ContainsKey(purgeable_ids_out, resources[1].resource_id)); 502 EXPECT_TRUE(ContainsKey(purgeable_ids_out, resources[1].resource_id));
469 } 503 }
470 504
505 TEST(ServiceWorkerDatabaseTest, DeleteNonExistentRegistration) {
506 scoped_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory());
507
508 GURL origin("http://example.com");
509 RegistrationData data;
510 data.registration_id = 100;
511 data.scope = URL(origin, "/foo");
512 data.script = URL(origin, "/script.js");
513 data.version_id = 200;
514
515 std::vector<Resource> resources;
516 resources.push_back(CreateResource(1, URL(origin, "/resource1")));
517 resources.push_back(CreateResource(2, URL(origin, "/resource2")));
518
519 const int64 kNonExistentRegistrationId = 999;
520 const int64 kArbitraryVersionId = 222; // Used as a dummy initial value
521
522 int64 deleted_version_id = kArbitraryVersionId;
523 std::vector<int64> newly_purgeable_resources;
524 EXPECT_EQ(
525 ServiceWorkerDatabase::STATUS_OK,
526 database->WriteRegistration(
527 data, resources, &deleted_version_id, &newly_purgeable_resources));
528 EXPECT_EQ(kInvalidServiceWorkerVersionId, deleted_version_id);
529 EXPECT_TRUE(newly_purgeable_resources.empty());
530
531 // Delete from an origin that has a registration.
532 deleted_version_id = kArbitraryVersionId;
533 newly_purgeable_resources.clear();
534 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
535 database->DeleteRegistration(kNonExistentRegistrationId,
536 origin,
537 &deleted_version_id,
538 &newly_purgeable_resources));
539 EXPECT_EQ(kInvalidServiceWorkerVersionId, deleted_version_id);
540 EXPECT_TRUE(newly_purgeable_resources.empty());
541
542 // Delete from an origin that has no registration.
543 deleted_version_id = kArbitraryVersionId;
544 newly_purgeable_resources.clear();
545 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
546 database->DeleteRegistration(kNonExistentRegistrationId,
547 GURL("http://example.net"),
548 &deleted_version_id,
549 &newly_purgeable_resources));
550 EXPECT_EQ(kInvalidServiceWorkerVersionId, deleted_version_id);
551 EXPECT_TRUE(newly_purgeable_resources.empty());
552 }
553
471 TEST(ServiceWorkerDatabaseTest, Registration_Overwrite) { 554 TEST(ServiceWorkerDatabaseTest, Registration_Overwrite) {
472 scoped_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); 555 scoped_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory());
473 556
474 GURL origin("http://example.com"); 557 GURL origin("http://example.com");
475 RegistrationData data; 558 RegistrationData data;
476 data.registration_id = 100; 559 data.registration_id = 100;
477 data.scope = URL(origin, "/foo"); 560 data.scope = URL(origin, "/foo");
478 data.script = URL(origin, "/script.js"); 561 data.script = URL(origin, "/script.js");
479 data.version_id = 200; 562 data.version_id = 200;
480 563
481 std::vector<Resource> resources1; 564 std::vector<Resource> resources1;
482 resources1.push_back(CreateResource(1, URL(origin, "/resource1"))); 565 resources1.push_back(CreateResource(1, URL(origin, "/resource1")));
483 resources1.push_back(CreateResource(2, URL(origin, "/resource2"))); 566 resources1.push_back(CreateResource(2, URL(origin, "/resource2")));
567
568 int64 deleted_version_id = 222; // Dummy inital value
484 std::vector<int64> newly_purgeable_resources; 569 std::vector<int64> newly_purgeable_resources;
485 570
486 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 571 EXPECT_EQ(
487 database->WriteRegistration(data, resources1, 572 ServiceWorkerDatabase::STATUS_OK,
488 &newly_purgeable_resources)); 573 database->WriteRegistration(
574 data, resources1, &deleted_version_id, &newly_purgeable_resources));
575 EXPECT_EQ(kInvalidServiceWorkerVersionId, deleted_version_id);
489 EXPECT_TRUE(newly_purgeable_resources.empty()); 576 EXPECT_TRUE(newly_purgeable_resources.empty());
490 577
491 // Make sure that the registration and resource records are stored. 578 // Make sure that the registration and resource records are stored.
492 RegistrationData data_out; 579 RegistrationData data_out;
493 std::vector<Resource> resources_out; 580 std::vector<Resource> resources_out;
494 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, database->ReadRegistration( 581 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, database->ReadRegistration(
495 data.registration_id, origin, &data_out, &resources_out)); 582 data.registration_id, origin, &data_out, &resources_out));
496 VerifyRegistrationData(data, data_out); 583 VerifyRegistrationData(data, data_out);
497 VerifyResourceRecords(resources1, resources_out); 584 VerifyResourceRecords(resources1, resources_out);
498 585
499 // Update the registration. 586 // Update the registration.
500 RegistrationData updated_data = data; 587 RegistrationData updated_data = data;
501 updated_data.version_id = data.version_id + 1; 588 updated_data.version_id = data.version_id + 1;
502 std::vector<Resource> resources2; 589 std::vector<Resource> resources2;
503 resources2.push_back(CreateResource(3, URL(origin, "/resource3"))); 590 resources2.push_back(CreateResource(3, URL(origin, "/resource3")));
504 resources2.push_back(CreateResource(4, URL(origin, "/resource4"))); 591 resources2.push_back(CreateResource(4, URL(origin, "/resource4")));
505 592
506 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 593 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
507 database->WriteRegistration(updated_data, resources2, 594 database->WriteRegistration(updated_data,
595 resources2,
596 &deleted_version_id,
508 &newly_purgeable_resources)); 597 &newly_purgeable_resources));
598 EXPECT_EQ(data.version_id, deleted_version_id);
509 ASSERT_EQ(resources1.size(), newly_purgeable_resources.size()); 599 ASSERT_EQ(resources1.size(), newly_purgeable_resources.size());
510 for(size_t i = 0; i < resources1.size(); ++i) 600 for(size_t i = 0; i < resources1.size(); ++i)
511 EXPECT_EQ(newly_purgeable_resources[i], resources1[i].resource_id); 601 EXPECT_EQ(newly_purgeable_resources[i], resources1[i].resource_id);
512 602
513 // Make sure that |updated_data| is stored and resources referred from |data| 603 // Make sure that |updated_data| is stored and resources referred from |data|
514 // is moved to the purgeable list. 604 // is moved to the purgeable list.
515 resources_out.clear(); 605 resources_out.clear();
516 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, database->ReadRegistration( 606 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, database->ReadRegistration(
517 updated_data.registration_id, origin, &data_out, &resources_out)); 607 updated_data.registration_id, origin, &data_out, &resources_out));
518 VerifyRegistrationData(updated_data, data_out); 608 VerifyRegistrationData(updated_data, data_out);
519 VerifyResourceRecords(resources2, resources_out); 609 VerifyResourceRecords(resources2, resources_out);
520 610
521 std::set<int64> purgeable_ids_out; 611 std::set<int64> purgeable_ids_out;
522 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 612 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
523 database->GetPurgeableResourceIds(&purgeable_ids_out)); 613 database->GetPurgeableResourceIds(&purgeable_ids_out));
524 EXPECT_EQ(2u, purgeable_ids_out.size()); 614 EXPECT_EQ(2u, purgeable_ids_out.size());
525 EXPECT_TRUE(ContainsKey(purgeable_ids_out, resources1[0].resource_id)); 615 EXPECT_TRUE(ContainsKey(purgeable_ids_out, resources1[0].resource_id));
526 EXPECT_TRUE(ContainsKey(purgeable_ids_out, resources1[1].resource_id)); 616 EXPECT_TRUE(ContainsKey(purgeable_ids_out, resources1[1].resource_id));
527 } 617 }
528 618
529 TEST(ServiceWorkerDatabaseTest, Registration_Multiple) { 619 TEST(ServiceWorkerDatabaseTest, Registration_Multiple) {
530 scoped_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); 620 scoped_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory());
531 GURL origin("http://example.com"); 621 GURL origin("http://example.com");
532 622
623 int64 deleted_version_id;
533 std::vector<int64> newly_purgeable_resources; 624 std::vector<int64> newly_purgeable_resources;
534 625
535 // Add registration1. 626 // Add registration1.
536 RegistrationData data1; 627 RegistrationData data1;
537 data1.registration_id = 100; 628 data1.registration_id = 100;
538 data1.scope = URL(origin, "/foo"); 629 data1.scope = URL(origin, "/foo");
539 data1.script = URL(origin, "/script1.js"); 630 data1.script = URL(origin, "/script1.js");
540 data1.version_id = 200; 631 data1.version_id = 200;
541 632
542 std::vector<Resource> resources1; 633 std::vector<Resource> resources1;
543 resources1.push_back(CreateResource(1, URL(origin, "/resource1"))); 634 resources1.push_back(CreateResource(1, URL(origin, "/resource1")));
544 resources1.push_back(CreateResource(2, URL(origin, "/resource2"))); 635 resources1.push_back(CreateResource(2, URL(origin, "/resource2")));
545 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 636 EXPECT_EQ(
546 database->WriteRegistration(data1, resources1, 637 ServiceWorkerDatabase::STATUS_OK,
547 &newly_purgeable_resources)); 638 database->WriteRegistration(
639 data1, resources1, &deleted_version_id, &newly_purgeable_resources));
548 640
549 // Add registration2. 641 // Add registration2.
550 RegistrationData data2; 642 RegistrationData data2;
551 data2.registration_id = 101; 643 data2.registration_id = 101;
552 data2.scope = URL(origin, "/bar"); 644 data2.scope = URL(origin, "/bar");
553 data2.script = URL(origin, "/script2.js"); 645 data2.script = URL(origin, "/script2.js");
554 data2.version_id = 201; 646 data2.version_id = 201;
555 647
556 std::vector<Resource> resources2; 648 std::vector<Resource> resources2;
557 resources2.push_back(CreateResource(3, URL(origin, "/resource3"))); 649 resources2.push_back(CreateResource(3, URL(origin, "/resource3")));
558 resources2.push_back(CreateResource(4, URL(origin, "/resource4"))); 650 resources2.push_back(CreateResource(4, URL(origin, "/resource4")));
559 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 651 EXPECT_EQ(
560 database->WriteRegistration(data2, resources2, 652 ServiceWorkerDatabase::STATUS_OK,
561 &newly_purgeable_resources)); 653 database->WriteRegistration(
654 data2, resources2, &deleted_version_id, &newly_purgeable_resources));
562 655
563 // Make sure that registration1 is stored. 656 // Make sure that registration1 is stored.
564 RegistrationData data_out; 657 RegistrationData data_out;
565 std::vector<Resource> resources_out; 658 std::vector<Resource> resources_out;
566 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, database->ReadRegistration( 659 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, database->ReadRegistration(
567 data1.registration_id, origin, &data_out, &resources_out)); 660 data1.registration_id, origin, &data_out, &resources_out));
568 VerifyRegistrationData(data1, data_out); 661 VerifyRegistrationData(data1, data_out);
569 VerifyResourceRecords(resources1, resources_out); 662 VerifyResourceRecords(resources1, resources_out);
570 663
571 // Make sure that registration2 is also stored. 664 // Make sure that registration2 is also stored.
572 resources_out.clear(); 665 resources_out.clear();
573 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, database->ReadRegistration( 666 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, database->ReadRegistration(
574 data2.registration_id, origin, &data_out, &resources_out)); 667 data2.registration_id, origin, &data_out, &resources_out));
575 VerifyRegistrationData(data2, data_out); 668 VerifyRegistrationData(data2, data_out);
576 VerifyResourceRecords(resources2, resources_out); 669 VerifyResourceRecords(resources2, resources_out);
577 670
578 std::set<int64> purgeable_ids_out; 671 std::set<int64> purgeable_ids_out;
579 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 672 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
580 database->GetPurgeableResourceIds(&purgeable_ids_out)); 673 database->GetPurgeableResourceIds(&purgeable_ids_out));
581 EXPECT_TRUE(purgeable_ids_out.empty()); 674 EXPECT_TRUE(purgeable_ids_out.empty());
582 675
583 // Delete registration1. 676 // Delete registration1.
677 int64 version_id;
584 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 678 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
585 database->DeleteRegistration(data1.registration_id, origin, 679 database->DeleteRegistration(data1.registration_id,
680 origin,
681 &version_id,
586 &newly_purgeable_resources)); 682 &newly_purgeable_resources));
587 683
588 // Make sure that registration1 is gone. 684 // Make sure that registration1 is gone.
589 resources_out.clear(); 685 resources_out.clear();
590 EXPECT_EQ(ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND, 686 EXPECT_EQ(ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND,
591 database->ReadRegistration( 687 database->ReadRegistration(
592 data1.registration_id, origin, &data_out, &resources_out)); 688 data1.registration_id, origin, &data_out, &resources_out));
593 EXPECT_TRUE(resources_out.empty()); 689 EXPECT_TRUE(resources_out.empty());
594 690
595 purgeable_ids_out.clear(); 691 purgeable_ids_out.clear();
596 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 692 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
597 database->GetPurgeableResourceIds(&purgeable_ids_out)); 693 database->GetPurgeableResourceIds(&purgeable_ids_out));
598 EXPECT_EQ(2u, purgeable_ids_out.size()); 694 EXPECT_EQ(2u, purgeable_ids_out.size());
599 EXPECT_TRUE(ContainsKey(purgeable_ids_out, resources1[0].resource_id)); 695 EXPECT_TRUE(ContainsKey(purgeable_ids_out, resources1[0].resource_id));
600 EXPECT_TRUE(ContainsKey(purgeable_ids_out, resources1[1].resource_id)); 696 EXPECT_TRUE(ContainsKey(purgeable_ids_out, resources1[1].resource_id));
601 697
602 // Make sure that registration2 is still alive. 698 // Make sure that registration2 is still alive.
603 resources_out.clear(); 699 resources_out.clear();
604 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, database->ReadRegistration( 700 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, database->ReadRegistration(
605 data2.registration_id, origin, &data_out, &resources_out)); 701 data2.registration_id, origin, &data_out, &resources_out));
606 VerifyRegistrationData(data2, data_out); 702 VerifyRegistrationData(data2, data_out);
607 VerifyResourceRecords(resources2, resources_out); 703 VerifyResourceRecords(resources2, resources_out);
608 } 704 }
609 705
610 TEST(ServiceWorkerDatabaseTest, UpdateVersionToActive) { 706 TEST(ServiceWorkerDatabaseTest, UpdateVersionToActive) {
611 scoped_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); 707 scoped_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory());
612 GURL origin("http://example.com"); 708 GURL origin("http://example.com");
613 709
710 int64 deleted_version_id;
614 std::vector<int64> newly_purgeable_resources; 711 std::vector<int64> newly_purgeable_resources;
615 712
616 // Should be false because a registration does not exist. 713 // Should be false because a registration does not exist.
617 EXPECT_EQ(ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND, 714 EXPECT_EQ(ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND,
618 database->UpdateVersionToActive(0, origin)); 715 database->UpdateVersionToActive(0, origin));
619 716
620 // Add a registration. 717 // Add a registration.
621 RegistrationData data; 718 RegistrationData data;
622 data.registration_id = 100; 719 data.registration_id = 100;
623 data.scope = URL(origin, "/foo"); 720 data.scope = URL(origin, "/foo");
624 data.script = URL(origin, "/script.js"); 721 data.script = URL(origin, "/script.js");
625 data.version_id = 200; 722 data.version_id = 200;
626 data.is_active = false; 723 data.is_active = false;
627 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 724 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
628 database->WriteRegistration(data, std::vector<Resource>(), 725 database->WriteRegistration(data,
726 std::vector<Resource>(),
727 &deleted_version_id,
629 &newly_purgeable_resources)); 728 &newly_purgeable_resources));
630 729
631 // Make sure that the registration is stored. 730 // Make sure that the registration is stored.
632 RegistrationData data_out; 731 RegistrationData data_out;
633 std::vector<Resource> resources_out; 732 std::vector<Resource> resources_out;
634 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 733 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
635 database->ReadRegistration( 734 database->ReadRegistration(
636 data.registration_id, origin, &data_out, &resources_out)); 735 data.registration_id, origin, &data_out, &resources_out));
637 VerifyRegistrationData(data, data_out); 736 VerifyRegistrationData(data, data_out);
638 EXPECT_TRUE(resources_out.empty()); 737 EXPECT_TRUE(resources_out.empty());
639 738
640 // Activate the registration. 739 // Activate the registration.
641 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 740 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
642 database->UpdateVersionToActive(data.registration_id, origin)); 741 database->UpdateVersionToActive(data.registration_id, origin));
643 742
644 // Make sure that the registration is activated. 743 // Make sure that the registration is activated.
645 resources_out.clear(); 744 resources_out.clear();
646 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 745 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
647 database->ReadRegistration( 746 database->ReadRegistration(
648 data.registration_id, origin, &data_out, &resources_out)); 747 data.registration_id, origin, &data_out, &resources_out));
649 RegistrationData expected_data = data; 748 RegistrationData expected_data = data;
650 expected_data.is_active = true; 749 expected_data.is_active = true;
651 VerifyRegistrationData(expected_data, data_out); 750 VerifyRegistrationData(expected_data, data_out);
652 EXPECT_TRUE(resources_out.empty()); 751 EXPECT_TRUE(resources_out.empty());
653 752
654 // Delete the registration. 753 // Delete the registration.
754 int64 version_id;
655 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 755 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
656 database->DeleteRegistration(data.registration_id, origin, 756 database->DeleteRegistration(data.registration_id,
757 origin,
758 &version_id,
657 &newly_purgeable_resources)); 759 &newly_purgeable_resources));
658 760
659 // Should be false because the registration is gone. 761 // Should be false because the registration is gone.
660 EXPECT_EQ(ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND, 762 EXPECT_EQ(ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND,
661 database->UpdateVersionToActive(data.registration_id, origin)); 763 database->UpdateVersionToActive(data.registration_id, origin));
662 } 764 }
663 765
664 TEST(ServiceWorkerDatabaseTest, UpdateLastCheckTime) { 766 TEST(ServiceWorkerDatabaseTest, UpdateLastCheckTime) {
665 scoped_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); 767 scoped_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory());
666 GURL origin("http://example.com"); 768 GURL origin("http://example.com");
769 int64 deleted_version_id;
667 std::vector<int64> newly_purgeable_resources; 770 std::vector<int64> newly_purgeable_resources;
668 771
669 // Should be false because a registration does not exist. 772 // Should be false because a registration does not exist.
670 EXPECT_EQ(ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND, 773 EXPECT_EQ(ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND,
671 database->UpdateLastCheckTime(0, origin, base::Time::Now())); 774 database->UpdateLastCheckTime(0, origin, base::Time::Now()));
672 775
673 // Add a registration. 776 // Add a registration.
674 RegistrationData data; 777 RegistrationData data;
675 data.registration_id = 100; 778 data.registration_id = 100;
676 data.scope = URL(origin, "/foo"); 779 data.scope = URL(origin, "/foo");
677 data.script = URL(origin, "/script.js"); 780 data.script = URL(origin, "/script.js");
678 data.version_id = 200; 781 data.version_id = 200;
679 data.last_update_check = base::Time::Now(); 782 data.last_update_check = base::Time::Now();
680 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 783 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
681 database->WriteRegistration(data, std::vector<Resource>(), 784 database->WriteRegistration(data,
785 std::vector<Resource>(),
786 &deleted_version_id,
682 &newly_purgeable_resources)); 787 &newly_purgeable_resources));
683 788
684 // Make sure that the registration is stored. 789 // Make sure that the registration is stored.
685 RegistrationData data_out; 790 RegistrationData data_out;
686 std::vector<Resource> resources_out; 791 std::vector<Resource> resources_out;
687 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 792 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
688 database->ReadRegistration( 793 database->ReadRegistration(
689 data.registration_id, origin, &data_out, &resources_out)); 794 data.registration_id, origin, &data_out, &resources_out));
690 VerifyRegistrationData(data, data_out); 795 VerifyRegistrationData(data, data_out);
691 EXPECT_TRUE(resources_out.empty()); 796 EXPECT_TRUE(resources_out.empty());
692 797
693 // Update the last check time. 798 // Update the last check time.
694 base::Time updated_time = base::Time::Now(); 799 base::Time updated_time = base::Time::Now();
695 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 800 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
696 database->UpdateLastCheckTime( 801 database->UpdateLastCheckTime(
697 data.registration_id, origin, updated_time)); 802 data.registration_id, origin, updated_time));
698 803
699 // Make sure that the registration is updated. 804 // Make sure that the registration is updated.
700 resources_out.clear(); 805 resources_out.clear();
701 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 806 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
702 database->ReadRegistration( 807 database->ReadRegistration(
703 data.registration_id, origin, &data_out, &resources_out)); 808 data.registration_id, origin, &data_out, &resources_out));
704 RegistrationData expected_data = data; 809 RegistrationData expected_data = data;
705 expected_data.last_update_check = updated_time; 810 expected_data.last_update_check = updated_time;
706 VerifyRegistrationData(expected_data, data_out); 811 VerifyRegistrationData(expected_data, data_out);
707 EXPECT_TRUE(resources_out.empty()); 812 EXPECT_TRUE(resources_out.empty());
708 813
709 // Delete the registration. 814 // Delete the registration.
815 int64 version_id;
710 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 816 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
711 database->DeleteRegistration(data.registration_id, origin, 817 database->DeleteRegistration(data.registration_id,
818 origin,
819 &version_id,
712 &newly_purgeable_resources)); 820 &newly_purgeable_resources));
713 821
714 // Should be false because the registration is gone. 822 // Should be false because the registration is gone.
715 EXPECT_EQ(ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND, 823 EXPECT_EQ(ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND,
716 database->UpdateLastCheckTime( 824 database->UpdateLastCheckTime(
717 data.registration_id, origin, base::Time::Now())); 825 data.registration_id, origin, base::Time::Now()));
718 } 826 }
719 827
720 TEST(ServiceWorkerDatabaseTest, UncommittedResourceIds) { 828 TEST(ServiceWorkerDatabaseTest, UncommittedResourceIds) {
721 scoped_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); 829 scoped_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory());
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
798 906
799 ids_out.clear(); 907 ids_out.clear();
800 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 908 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
801 database->GetPurgeableResourceIds(&ids_out)); 909 database->GetPurgeableResourceIds(&ids_out));
802 expected = base::STLSetDifference<std::set<int64> >(expected, ids3); 910 expected = base::STLSetDifference<std::set<int64> >(expected, ids3);
803 EXPECT_EQ(expected, ids_out); 911 EXPECT_EQ(expected, ids_out);
804 } 912 }
805 913
806 TEST(ServiceWorkerDatabaseTest, DeleteAllDataForOrigin) { 914 TEST(ServiceWorkerDatabaseTest, DeleteAllDataForOrigin) {
807 scoped_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); 915 scoped_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory());
916 int64 deleted_version_id;
808 std::vector<int64> newly_purgeable_resources; 917 std::vector<int64> newly_purgeable_resources;
809 918
810 // Data associated with |origin1| will be removed. 919 // Data associated with |origin1| will be removed.
811 GURL origin1("http://example.com"); 920 GURL origin1("http://example.com");
812 GURL origin2("http://example.org"); 921 GURL origin2("http://example.org");
813 922
814 // |origin1| has two registrations. 923 // |origin1| has two registrations.
815 RegistrationData data1; 924 RegistrationData data1;
816 data1.registration_id = 10; 925 data1.registration_id = 10;
817 data1.scope = URL(origin1, "/foo"); 926 data1.scope = URL(origin1, "/foo");
818 data1.script = URL(origin1, "/script1.js"); 927 data1.script = URL(origin1, "/script1.js");
819 data1.version_id = 100; 928 data1.version_id = 100;
820 929
821 std::vector<Resource> resources1; 930 std::vector<Resource> resources1;
822 resources1.push_back(CreateResource(1, URL(origin1, "/resource1"))); 931 resources1.push_back(CreateResource(1, URL(origin1, "/resource1")));
823 resources1.push_back(CreateResource(2, URL(origin1, "/resource2"))); 932 resources1.push_back(CreateResource(2, URL(origin1, "/resource2")));
824 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, 933 ASSERT_EQ(
825 database->WriteRegistration(data1, resources1, 934 ServiceWorkerDatabase::STATUS_OK,
826 &newly_purgeable_resources)); 935 database->WriteRegistration(
936 data1, resources1, &deleted_version_id, &newly_purgeable_resources));
827 937
828 RegistrationData data2; 938 RegistrationData data2;
829 data2.registration_id = 11; 939 data2.registration_id = 11;
830 data2.scope = URL(origin1, "/bar"); 940 data2.scope = URL(origin1, "/bar");
831 data2.script = URL(origin1, "/script2.js"); 941 data2.script = URL(origin1, "/script2.js");
832 data2.version_id = 101; 942 data2.version_id = 101;
833 943
834 std::vector<Resource> resources2; 944 std::vector<Resource> resources2;
835 resources2.push_back(CreateResource(3, URL(origin1, "/resource3"))); 945 resources2.push_back(CreateResource(3, URL(origin1, "/resource3")));
836 resources2.push_back(CreateResource(4, URL(origin1, "/resource4"))); 946 resources2.push_back(CreateResource(4, URL(origin1, "/resource4")));
837 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, 947 ASSERT_EQ(
838 database->WriteRegistration(data2, resources2, 948 ServiceWorkerDatabase::STATUS_OK,
839 &newly_purgeable_resources)); 949 database->WriteRegistration(
950 data2, resources2, &deleted_version_id, &newly_purgeable_resources));
840 951
841 // |origin2| has one registration. 952 // |origin2| has one registration.
842 RegistrationData data3; 953 RegistrationData data3;
843 data3.registration_id = 12; 954 data3.registration_id = 12;
844 data3.scope = URL(origin2, "/hoge"); 955 data3.scope = URL(origin2, "/hoge");
845 data3.script = URL(origin2, "/script3.js"); 956 data3.script = URL(origin2, "/script3.js");
846 data3.version_id = 102; 957 data3.version_id = 102;
847 958
848 std::vector<Resource> resources3; 959 std::vector<Resource> resources3;
849 resources3.push_back(CreateResource(5, URL(origin2, "/resource5"))); 960 resources3.push_back(CreateResource(5, URL(origin2, "/resource5")));
850 resources3.push_back(CreateResource(6, URL(origin2, "/resource6"))); 961 resources3.push_back(CreateResource(6, URL(origin2, "/resource6")));
851 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, 962 ASSERT_EQ(
852 database->WriteRegistration(data3, resources3, 963 ServiceWorkerDatabase::STATUS_OK,
853 &newly_purgeable_resources)); 964 database->WriteRegistration(
965 data3, resources3, &deleted_version_id, &newly_purgeable_resources));
854 966
855 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 967 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
856 database->DeleteAllDataForOrigin(origin1, 968 database->DeleteAllDataForOrigin(origin1,
857 &newly_purgeable_resources)); 969 &newly_purgeable_resources));
858 970
859 // |origin1| should be removed from the unique origin list. 971 // |origin1| should be removed from the unique origin list.
860 std::set<GURL> unique_origins; 972 std::set<GURL> unique_origins;
861 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, 973 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK,
862 database->GetOriginsWithRegistrations(&unique_origins)); 974 database->GetOriginsWithRegistrations(&unique_origins));
863 EXPECT_EQ(1u, unique_origins.size()); 975 EXPECT_EQ(1u, unique_origins.size());
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
895 CreateDatabase(database_dir.path())); 1007 CreateDatabase(database_dir.path()));
896 1008
897 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, database->LazyOpen(true)); 1009 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, database->LazyOpen(true));
898 ASSERT_TRUE(base::DirectoryExists(database_dir.path())); 1010 ASSERT_TRUE(base::DirectoryExists(database_dir.path()));
899 1011
900 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, database->DestroyDatabase()); 1012 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, database->DestroyDatabase());
901 ASSERT_FALSE(base::DirectoryExists(database_dir.path())); 1013 ASSERT_FALSE(base::DirectoryExists(database_dir.path()));
902 } 1014 }
903 1015
904 } // namespace content 1016 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/service_worker/service_worker_database.cc ('k') | content/browser/service_worker/service_worker_handle.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698