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

Side by Side Diff: content/browser/notifications/notification_database_unittest.cc

Issue 2300093002: Make //content responsible for generating notification Ids (Closed)
Patch Set: comments Created 4 years, 3 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
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/notifications/notification_database.h" 5 #include "content/browser/notifications/notification_database.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include "base/files/scoped_temp_dir.h" 10 #include "base/files/scoped_temp_dir.h"
11 #include "base/guid.h"
11 #include "base/macros.h" 12 #include "base/macros.h"
12 #include "base/strings/string_number_conversions.h" 13 #include "base/strings/string_number_conversions.h"
13 #include "base/strings/utf_string_conversions.h" 14 #include "base/strings/utf_string_conversions.h"
14 #include "content/public/browser/notification_database_data.h" 15 #include "content/public/browser/notification_database_data.h"
15 #include "content/public/common/platform_notification_data.h" 16 #include "content/public/common/platform_notification_data.h"
16 #include "testing/gtest/include/gtest/gtest.h" 17 #include "testing/gtest/include/gtest/gtest.h"
17 #include "third_party/leveldatabase/src/include/leveldb/db.h" 18 #include "third_party/leveldatabase/src/include/leveldb/db.h"
18 #include "third_party/leveldatabase/src/include/leveldb/write_batch.h" 19 #include "third_party/leveldatabase/src/include/leveldb/write_batch.h"
19 #include "url/gurl.h" 20 #include "url/gurl.h"
20 21
(...skipping 28 matching lines...) Expand all
49 return new NotificationDatabase(path); 50 return new NotificationDatabase(path);
50 } 51 }
51 52
52 // Creates a new notification for |service_worker_registration_id| belonging 53 // Creates a new notification for |service_worker_registration_id| belonging
53 // to |origin| and writes it to the database. The written notification id 54 // to |origin| and writes it to the database. The written notification id
54 // will be stored in |notification_id|. 55 // will be stored in |notification_id|.
55 void CreateAndWriteNotification(NotificationDatabase* database, 56 void CreateAndWriteNotification(NotificationDatabase* database,
56 const GURL& origin, 57 const GURL& origin,
57 const std::string& tag, 58 const std::string& tag,
58 int64_t service_worker_registration_id, 59 int64_t service_worker_registration_id,
59 int64_t* notification_id) { 60 std::string* notification_id) {
61 DCHECK(notification_id);
62
60 NotificationDatabaseData database_data; 63 NotificationDatabaseData database_data;
64 database_data.notification_id = GenerateNotificationId();
61 database_data.origin = origin; 65 database_data.origin = origin;
62 database_data.service_worker_registration_id = 66 database_data.service_worker_registration_id =
63 service_worker_registration_id; 67 service_worker_registration_id;
64 database_data.notification_data.tag = tag; 68 database_data.notification_data.tag = tag;
65 69
66 ASSERT_EQ(NotificationDatabase::STATUS_OK, 70 ASSERT_EQ(NotificationDatabase::STATUS_OK,
67 database->WriteNotificationData(origin, database_data, 71 database->WriteNotificationData(origin, database_data));
68 notification_id)); 72
73 *notification_id = database_data.notification_id;
69 } 74 }
70 75
71 // Populates |database| with a series of example notifications that differ in 76 // Populates |database| with a series of example notifications that differ in
72 // their origin and Service Worker registration id. 77 // their origin and Service Worker registration id.
73 void PopulateDatabaseWithExampleData(NotificationDatabase* database) { 78 void PopulateDatabaseWithExampleData(NotificationDatabase* database) {
74 int64_t notification_id; 79 std::string notification_id;
75 for (size_t i = 0; i < arraysize(kExampleNotificationData); ++i) { 80 for (size_t i = 0; i < arraysize(kExampleNotificationData); ++i) {
76 ASSERT_NO_FATAL_FAILURE(CreateAndWriteNotification( 81 ASSERT_NO_FATAL_FAILURE(CreateAndWriteNotification(
77 database, GURL(kExampleNotificationData[i].origin), 82 database, GURL(kExampleNotificationData[i].origin),
78 kExampleNotificationData[i].tag, 83 kExampleNotificationData[i].tag,
79 kExampleNotificationData[i].service_worker_registration_id, 84 kExampleNotificationData[i].service_worker_registration_id,
80 &notification_id)); 85 &notification_id));
81 } 86 }
82 } 87 }
83 88
84 // Returns if |database| has been opened. 89 // Returns if |database| has been opened.
85 bool IsDatabaseOpen(NotificationDatabase* database) { 90 bool IsDatabaseOpen(NotificationDatabase* database) {
86 return database->IsOpen(); 91 return database->IsOpen();
87 } 92 }
88 93
89 // Returns if |database| is an in-memory only database. 94 // Returns if |database| is an in-memory only database.
90 bool IsInMemoryDatabase(NotificationDatabase* database) { 95 bool IsInMemoryDatabase(NotificationDatabase* database) {
91 return database->IsInMemoryDatabase(); 96 return database->IsInMemoryDatabase();
92 } 97 }
93 98
94 // Writes a LevelDB key-value pair directly to the LevelDB backing the 99 // Writes a LevelDB key-value pair directly to the LevelDB backing the
95 // notification database in |database|. 100 // notification database in |database|.
96 void WriteLevelDBKeyValuePair(NotificationDatabase* database, 101 void WriteLevelDBKeyValuePair(NotificationDatabase* database,
97 const std::string& key, 102 const std::string& key,
98 const std::string& value) { 103 const std::string& value) {
99 leveldb::Status status = 104 leveldb::Status status =
100 database->GetDBForTesting()->Put(leveldb::WriteOptions(), key, value); 105 database->GetDBForTesting()->Put(leveldb::WriteOptions(), key, value);
101 ASSERT_TRUE(status.ok()); 106 ASSERT_TRUE(status.ok());
102 } 107 }
108
109 // Generates a random notification ID. The format of the ID is opaque.
110 std::string GenerateNotificationId() { return base::GenerateGUID(); }
103 }; 111 };
104 112
105 TEST_F(NotificationDatabaseTest, OpenCloseMemory) { 113 TEST_F(NotificationDatabaseTest, OpenCloseMemory) {
106 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); 114 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory());
107 115
108 // Should return false because the database does not exist in memory. 116 // Should return false because the database does not exist in memory.
109 EXPECT_EQ(NotificationDatabase::STATUS_ERROR_NOT_FOUND, 117 EXPECT_EQ(NotificationDatabase::STATUS_ERROR_NOT_FOUND,
110 database->Open(false /* create_if_missing */)); 118 database->Open(false /* create_if_missing */));
111 119
112 // Should return true, indicating that the database could be created. 120 // Should return true, indicating that the database could be created.
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
173 TEST_F(NotificationDatabaseTest, NotificationIdIncrements) { 181 TEST_F(NotificationDatabaseTest, NotificationIdIncrements) {
174 base::ScopedTempDir database_dir; 182 base::ScopedTempDir database_dir;
175 ASSERT_TRUE(database_dir.CreateUniqueTempDir()); 183 ASSERT_TRUE(database_dir.CreateUniqueTempDir());
176 184
177 std::unique_ptr<NotificationDatabase> database( 185 std::unique_ptr<NotificationDatabase> database(
178 CreateDatabaseOnFileSystem(database_dir.path())); 186 CreateDatabaseOnFileSystem(database_dir.path()));
179 187
180 ASSERT_EQ(NotificationDatabase::STATUS_OK, 188 ASSERT_EQ(NotificationDatabase::STATUS_OK,
181 database->Open(true /* create_if_missing */)); 189 database->Open(true /* create_if_missing */));
182 190
191 EXPECT_EQ(database->GetNextPersistentNotificationId(), 1);
192 EXPECT_EQ(database->GetNextPersistentNotificationId(), 2);
193 EXPECT_EQ(database->GetNextPersistentNotificationId(), 3);
194
183 GURL origin("https://example.com"); 195 GURL origin("https://example.com");
184 196
185 int64_t notification_id = 0; 197 std::string notification_id;
186
187 // Verify that getting two ids on the same database instance results in
188 // incrementing values. Notification ids will start at 1.
189 ASSERT_NO_FATAL_FAILURE( 198 ASSERT_NO_FATAL_FAILURE(
190 CreateAndWriteNotification(database.get(), origin, "" /* tag */, 199 CreateAndWriteNotification(database.get(), origin, "" /* tag */,
191 0 /* sw_registration_id */, &notification_id)); 200 0 /* sw_registration_id */, &notification_id));
192 EXPECT_EQ(notification_id, 1);
193
194 ASSERT_NO_FATAL_FAILURE(
195 CreateAndWriteNotification(database.get(), origin, "" /* tag */,
196 0 /* sw_registration_id */, &notification_id));
197 EXPECT_EQ(notification_id, 2);
198 201
199 database.reset(CreateDatabaseOnFileSystem(database_dir.path())); 202 database.reset(CreateDatabaseOnFileSystem(database_dir.path()));
200 ASSERT_EQ(NotificationDatabase::STATUS_OK, 203 ASSERT_EQ(NotificationDatabase::STATUS_OK,
201 database->Open(false /* create_if_missing */)); 204 database->Open(false /* create_if_missing */));
202 205
203 // Verify that the next notification id was stored in the database, and 206 // Verify that the next persistent notification id was stored in the database,
204 // continues where we expect it to be, even after closing and opening it. 207 // and continues where we expect it to be, even after closing and opening it.
205 ASSERT_NO_FATAL_FAILURE( 208 EXPECT_EQ(database->GetNextPersistentNotificationId(), 4);
206 CreateAndWriteNotification(database.get(), origin, "" /* tag */,
207 0 /* sw_registration_id */, &notification_id));
208 EXPECT_EQ(notification_id, 3);
209 } 209 }
210 210
211 TEST_F(NotificationDatabaseTest, NotificationIdIncrementsStorage) { 211 TEST_F(NotificationDatabaseTest, NotificationIdIncrementsStorage) {
212 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); 212 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory());
213 ASSERT_EQ(NotificationDatabase::STATUS_OK, 213 ASSERT_EQ(NotificationDatabase::STATUS_OK,
214 database->Open(true /* create_if_missing */)); 214 database->Open(true /* create_if_missing */));
215 215
216 GURL origin("https://example.com"); 216 GURL origin("https://example.com");
217 217
218 NotificationDatabaseData database_data; 218 NotificationDatabaseData database_data, read_database_data;
219 database_data.notification_id = -1; 219 database_data.notification_id = GenerateNotificationId();
220 220
221 int64_t notification_id = 0; 221 ASSERT_EQ(NotificationDatabase::STATUS_OK,
222 ASSERT_EQ( 222 database->WriteNotificationData(origin, database_data));
223 NotificationDatabase::STATUS_OK,
224 database->WriteNotificationData(origin, database_data, &notification_id));
225 223
226 ASSERT_EQ( 224 ASSERT_EQ(NotificationDatabase::STATUS_OK,
227 NotificationDatabase::STATUS_OK, 225 database->ReadNotificationData(database_data.notification_id,
228 database->ReadNotificationData(notification_id, origin, &database_data)); 226 origin, &read_database_data));
229 227
230 EXPECT_EQ(notification_id, database_data.notification_id); 228 EXPECT_EQ(database_data.notification_id, read_database_data.notification_id);
231 } 229 }
232 230
233 TEST_F(NotificationDatabaseTest, NotificationIdCorruption) { 231 TEST_F(NotificationDatabaseTest, NotificationIdCorruption) {
234 base::ScopedTempDir database_dir; 232 base::ScopedTempDir database_dir;
235 ASSERT_TRUE(database_dir.CreateUniqueTempDir()); 233 ASSERT_TRUE(database_dir.CreateUniqueTempDir());
236 234
237 std::unique_ptr<NotificationDatabase> database( 235 std::unique_ptr<NotificationDatabase> database(
238 CreateDatabaseOnFileSystem(database_dir.path())); 236 CreateDatabaseOnFileSystem(database_dir.path()));
239 237
240 ASSERT_EQ(NotificationDatabase::STATUS_OK, 238 ASSERT_EQ(NotificationDatabase::STATUS_OK,
241 database->Open(true /* create_if_missing */)); 239 database->Open(true /* create_if_missing */));
242 240
243 GURL origin("https://example.com"); 241 GURL origin("https://example.com");
244 242
245 NotificationDatabaseData database_data; 243 NotificationDatabaseData database_data;
246 int64_t notification_id = 0; 244 database_data.notification_id = GenerateNotificationId();
247 245
248 ASSERT_EQ( 246 ASSERT_EQ(NotificationDatabase::STATUS_OK,
249 NotificationDatabase::STATUS_OK, 247 database->WriteNotificationData(origin, database_data));
250 database->WriteNotificationData(origin, database_data, &notification_id));
251 EXPECT_EQ(notification_id, 1);
252 248
253 // Deliberately write an invalid value as the next notification id. When 249 // Deliberately write an invalid value as the next notification id. When
254 // re-opening the database, the Open() method should realize that an invalid 250 // re-opening the database, the Open() method should realize that an invalid
255 // value is being read, and mark the database as corrupted. 251 // value is being read, and mark the database as corrupted.
256 ASSERT_NO_FATAL_FAILURE( 252 ASSERT_NO_FATAL_FAILURE(
257 WriteLevelDBKeyValuePair(database.get(), "NEXT_NOTIFICATION_ID", "-42")); 253 WriteLevelDBKeyValuePair(database.get(), "NEXT_NOTIFICATION_ID", "-42"));
258 254
259 database.reset(CreateDatabaseOnFileSystem(database_dir.path())); 255 database.reset(CreateDatabaseOnFileSystem(database_dir.path()));
260 EXPECT_EQ(NotificationDatabase::STATUS_ERROR_CORRUPTED, 256 EXPECT_EQ(NotificationDatabase::STATUS_ERROR_CORRUPTED,
261 database->Open(false /* create_if_missing */)); 257 database->Open(false /* create_if_missing */));
262 } 258 }
263 259
264 TEST_F(NotificationDatabaseTest, ReadInvalidNotificationData) { 260 TEST_F(NotificationDatabaseTest, ReadInvalidNotificationData) {
265 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); 261 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory());
266 ASSERT_EQ(NotificationDatabase::STATUS_OK, 262 ASSERT_EQ(NotificationDatabase::STATUS_OK,
267 database->Open(true /* create_if_missing */)); 263 database->Open(true /* create_if_missing */));
268 264
269 NotificationDatabaseData database_data; 265 NotificationDatabaseData database_data;
270 266
271 // Reading the notification data for a notification that does not exist should 267 // Reading the notification data for a notification that does not exist should
272 // return the ERROR_NOT_FOUND status code. 268 // return the ERROR_NOT_FOUND status code.
273 EXPECT_EQ(NotificationDatabase::STATUS_ERROR_NOT_FOUND, 269 EXPECT_EQ(NotificationDatabase::STATUS_ERROR_NOT_FOUND,
274 database->ReadNotificationData(9001, GURL("https://chrome.com"), 270 database->ReadNotificationData("bad-id", GURL("https://chrome.com"),
275 &database_data)); 271 &database_data));
276 } 272 }
277 273
278 TEST_F(NotificationDatabaseTest, ReadNotificationDataDifferentOrigin) { 274 TEST_F(NotificationDatabaseTest, ReadNotificationDataDifferentOrigin) {
279 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); 275 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory());
280 ASSERT_EQ(NotificationDatabase::STATUS_OK, 276 ASSERT_EQ(NotificationDatabase::STATUS_OK,
281 database->Open(true /* create_if_missing */)); 277 database->Open(true /* create_if_missing */));
282 278
283 int64_t notification_id = 0;
284 GURL origin("https://example.com"); 279 GURL origin("https://example.com");
285 280
286 NotificationDatabaseData database_data, read_database_data; 281 NotificationDatabaseData database_data, read_database_data;
282 database_data.notification_id = GenerateNotificationId();
287 database_data.notification_data.title = base::UTF8ToUTF16("My Notification"); 283 database_data.notification_data.title = base::UTF8ToUTF16("My Notification");
288 284
289 ASSERT_EQ( 285 ASSERT_EQ(NotificationDatabase::STATUS_OK,
290 NotificationDatabase::STATUS_OK, 286 database->WriteNotificationData(origin, database_data));
291 database->WriteNotificationData(origin, database_data, &notification_id));
292 287
293 // Reading the notification from the database when given a different origin 288 // Reading the notification from the database when given a different origin
294 // should return the ERROR_NOT_FOUND status code. 289 // should return the ERROR_NOT_FOUND status code.
295 EXPECT_EQ( 290 EXPECT_EQ(NotificationDatabase::STATUS_ERROR_NOT_FOUND,
296 NotificationDatabase::STATUS_ERROR_NOT_FOUND, 291 database->ReadNotificationData(database_data.notification_id,
297 database->ReadNotificationData( 292 GURL("https://chrome.com"),
298 notification_id, GURL("https://chrome.com"), &read_database_data)); 293 &read_database_data));
299 294
300 // However, reading the notification from the database with the same origin 295 // However, reading the notification from the database with the same origin
301 // should return STATUS_OK and the associated notification data. 296 // should return STATUS_OK and the associated notification data.
302 ASSERT_EQ(NotificationDatabase::STATUS_OK, 297 ASSERT_EQ(NotificationDatabase::STATUS_OK,
303 database->ReadNotificationData(notification_id, origin, 298 database->ReadNotificationData(database_data.notification_id,
304 &read_database_data)); 299 origin, &read_database_data));
305 300
306 EXPECT_EQ(database_data.notification_data.title, 301 EXPECT_EQ(database_data.notification_data.title,
307 read_database_data.notification_data.title); 302 read_database_data.notification_data.title);
308 } 303 }
309 304
310 TEST_F(NotificationDatabaseTest, ReadNotificationDataReflection) { 305 TEST_F(NotificationDatabaseTest, ReadNotificationDataReflection) {
311 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); 306 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory());
312 ASSERT_EQ(NotificationDatabase::STATUS_OK, 307 ASSERT_EQ(NotificationDatabase::STATUS_OK,
313 database->Open(true /* create_if_missing */)); 308 database->Open(true /* create_if_missing */));
314 309
315 int64_t notification_id = 0;
316
317 GURL origin("https://example.com"); 310 GURL origin("https://example.com");
318 311
319 PlatformNotificationData notification_data; 312 PlatformNotificationData notification_data;
320 notification_data.title = base::UTF8ToUTF16("My Notification"); 313 notification_data.title = base::UTF8ToUTF16("My Notification");
321 notification_data.direction = 314 notification_data.direction =
322 PlatformNotificationData::DIRECTION_RIGHT_TO_LEFT; 315 PlatformNotificationData::DIRECTION_RIGHT_TO_LEFT;
323 notification_data.lang = "nl-NL"; 316 notification_data.lang = "nl-NL";
324 notification_data.body = base::UTF8ToUTF16("Hello, world!"); 317 notification_data.body = base::UTF8ToUTF16("Hello, world!");
325 notification_data.tag = "replace id"; 318 notification_data.tag = "replace id";
326 notification_data.icon = GURL("https://example.com/icon.png"); 319 notification_data.icon = GURL("https://example.com/icon.png");
327 notification_data.silent = true; 320 notification_data.silent = true;
328 321
329 NotificationDatabaseData database_data; 322 NotificationDatabaseData database_data;
330 database_data.notification_id = notification_id; 323 database_data.notification_id = GenerateNotificationId();
331 database_data.origin = origin; 324 database_data.origin = origin;
332 database_data.service_worker_registration_id = 42; 325 database_data.service_worker_registration_id = 42;
333 database_data.notification_data = notification_data; 326 database_data.notification_data = notification_data;
334 327
335 // Write the constructed notification to the database, and then immediately 328 // Write the constructed notification to the database, and then immediately
336 // read it back from the database again as well. 329 // read it back from the database again as well.
337 ASSERT_EQ( 330 ASSERT_EQ(NotificationDatabase::STATUS_OK,
338 NotificationDatabase::STATUS_OK, 331 database->WriteNotificationData(origin, database_data));
339 database->WriteNotificationData(origin, database_data, &notification_id));
340 332
341 NotificationDatabaseData read_database_data; 333 NotificationDatabaseData read_database_data;
342 ASSERT_EQ(NotificationDatabase::STATUS_OK, 334 ASSERT_EQ(NotificationDatabase::STATUS_OK,
343 database->ReadNotificationData(notification_id, origin, 335 database->ReadNotificationData(database_data.notification_id,
344 &read_database_data)); 336 origin, &read_database_data));
345 337
346 // Verify that all members retrieved from the database are exactly the same 338 // Verify that all members retrieved from the database are exactly the same
347 // as the ones that were written to it. This tests the serialization behavior. 339 // as the ones that were written to it. This tests the serialization behavior.
348 340
349 EXPECT_EQ(notification_id, read_database_data.notification_id); 341 EXPECT_EQ(database_data.notification_id, read_database_data.notification_id);
350 342
351 EXPECT_EQ(database_data.origin, read_database_data.origin); 343 EXPECT_EQ(database_data.origin, read_database_data.origin);
352 EXPECT_EQ(database_data.service_worker_registration_id, 344 EXPECT_EQ(database_data.service_worker_registration_id,
353 read_database_data.service_worker_registration_id); 345 read_database_data.service_worker_registration_id);
354 346
355 const PlatformNotificationData& read_notification_data = 347 const PlatformNotificationData& read_notification_data =
356 read_database_data.notification_data; 348 read_database_data.notification_data;
357 349
358 EXPECT_EQ(notification_data.title, read_notification_data.title); 350 EXPECT_EQ(notification_data.title, read_notification_data.title);
359 EXPECT_EQ(notification_data.direction, read_notification_data.direction); 351 EXPECT_EQ(notification_data.direction, read_notification_data.direction);
360 EXPECT_EQ(notification_data.lang, read_notification_data.lang); 352 EXPECT_EQ(notification_data.lang, read_notification_data.lang);
361 EXPECT_EQ(notification_data.body, read_notification_data.body); 353 EXPECT_EQ(notification_data.body, read_notification_data.body);
362 EXPECT_EQ(notification_data.tag, read_notification_data.tag); 354 EXPECT_EQ(notification_data.tag, read_notification_data.tag);
363 EXPECT_EQ(notification_data.icon, read_notification_data.icon); 355 EXPECT_EQ(notification_data.icon, read_notification_data.icon);
364 EXPECT_EQ(notification_data.silent, read_notification_data.silent); 356 EXPECT_EQ(notification_data.silent, read_notification_data.silent);
365 } 357 }
366 358
367 TEST_F(NotificationDatabaseTest, ReadWriteMultipleNotificationData) { 359 TEST_F(NotificationDatabaseTest, ReadWriteMultipleNotificationData) {
368 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); 360 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory());
369 ASSERT_EQ(NotificationDatabase::STATUS_OK, 361 ASSERT_EQ(NotificationDatabase::STATUS_OK,
370 database->Open(true /* create_if_missing */)); 362 database->Open(true /* create_if_missing */));
371 363
372 GURL origin("https://example.com"); 364 GURL origin("https://example.com");
373 int64_t notification_id = 0; 365
366 std::vector<std::string> notification_ids;
367 std::string notification_id;
374 368
375 // Write ten notifications to the database, each with a unique title and 369 // Write ten notifications to the database, each with a unique title and
376 // notification id (it is the responsibility of the user to increment this). 370 // notification id (it is the responsibility of the user to increment this).
377 for (int i = 1; i <= 10; ++i) { 371 for (int i = 1; i <= 10; ++i) {
378 ASSERT_NO_FATAL_FAILURE(CreateAndWriteNotification( 372 ASSERT_NO_FATAL_FAILURE(CreateAndWriteNotification(
379 database.get(), origin, "" /* tag */, i /* sw_registration_id */, 373 database.get(), origin, "" /* tag */, i /* sw_registration_id */,
380 &notification_id)); 374 &notification_id));
381 EXPECT_EQ(notification_id, i); 375
376 EXPECT_FALSE(notification_id.empty());
377
378 notification_ids.push_back(notification_id);
382 } 379 }
383 380
384 NotificationDatabaseData database_data; 381 NotificationDatabaseData database_data;
385 382
383 int64_t service_worker_registration_id = 1;
384
386 // Read the ten notifications from the database, and verify that the titles 385 // Read the ten notifications from the database, and verify that the titles
387 // of each of them matches with how they were created. 386 // of each of them matches with how they were created.
388 for (int i = 1; i <= 10; ++i) { 387 for (const std::string& notification_id : notification_ids) {
389 ASSERT_EQ(NotificationDatabase::STATUS_OK, 388 ASSERT_EQ(NotificationDatabase::STATUS_OK,
390 database->ReadNotificationData(i /* notification_id */, origin, 389 database->ReadNotificationData(notification_id, origin,
391 &database_data)); 390 &database_data));
392 391
393 EXPECT_EQ(i, database_data.service_worker_registration_id); 392 EXPECT_EQ(service_worker_registration_id++,
393 database_data.service_worker_registration_id);
394 } 394 }
395 } 395 }
396 396
397 TEST_F(NotificationDatabaseTest, DeleteInvalidNotificationData) { 397 TEST_F(NotificationDatabaseTest, DeleteInvalidNotificationData) {
398 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); 398 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory());
399 ASSERT_EQ(NotificationDatabase::STATUS_OK, 399 ASSERT_EQ(NotificationDatabase::STATUS_OK,
400 database->Open(true /* create_if_missing */)); 400 database->Open(true /* create_if_missing */));
401 401
402 // Deleting non-existing notifications is not considered to be a failure. 402 // Deleting non-existing notifications is not considered to be a failure.
403 ASSERT_EQ(NotificationDatabase::STATUS_OK, 403 ASSERT_EQ(
404 database->DeleteNotificationData(9001, GURL("https://chrome.com"))); 404 NotificationDatabase::STATUS_OK,
405 database->DeleteNotificationData("bad-id", GURL("https://chrome.com")));
405 } 406 }
406 407
407 TEST_F(NotificationDatabaseTest, DeleteNotificationDataSameOrigin) { 408 TEST_F(NotificationDatabaseTest, DeleteNotificationDataSameOrigin) {
408 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); 409 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory());
409 ASSERT_EQ(NotificationDatabase::STATUS_OK, 410 ASSERT_EQ(NotificationDatabase::STATUS_OK,
410 database->Open(true /* create_if_missing */)); 411 database->Open(true /* create_if_missing */));
411 412
412 int64_t notification_id = 0; 413 const std::string notification_id = GenerateNotificationId();
413 414
414 NotificationDatabaseData database_data; 415 NotificationDatabaseData database_data;
416 database_data.notification_id = notification_id;
417
415 GURL origin("https://example.com"); 418 GURL origin("https://example.com");
416 419
417 ASSERT_EQ( 420 ASSERT_EQ(NotificationDatabase::STATUS_OK,
418 NotificationDatabase::STATUS_OK, 421 database->WriteNotificationData(origin, database_data));
419 database->WriteNotificationData(origin, database_data, &notification_id));
420 422
421 // Reading a notification after writing one should succeed. 423 // Reading a notification after writing one should succeed.
422 EXPECT_EQ( 424 EXPECT_EQ(
423 NotificationDatabase::STATUS_OK, 425 NotificationDatabase::STATUS_OK,
424 database->ReadNotificationData(notification_id, origin, &database_data)); 426 database->ReadNotificationData(notification_id, origin, &database_data));
425 427
426 // Delete the notification which was just written to the database, and verify 428 // Delete the notification which was just written to the database, and verify
427 // that reading it again will fail. 429 // that reading it again will fail.
428 EXPECT_EQ(NotificationDatabase::STATUS_OK, 430 EXPECT_EQ(NotificationDatabase::STATUS_OK,
429 database->DeleteNotificationData(notification_id, origin)); 431 database->DeleteNotificationData(notification_id, origin));
430 EXPECT_EQ( 432 EXPECT_EQ(
431 NotificationDatabase::STATUS_ERROR_NOT_FOUND, 433 NotificationDatabase::STATUS_ERROR_NOT_FOUND,
432 database->ReadNotificationData(notification_id, origin, &database_data)); 434 database->ReadNotificationData(notification_id, origin, &database_data));
433 } 435 }
434 436
435 TEST_F(NotificationDatabaseTest, DeleteNotificationDataDifferentOrigin) { 437 TEST_F(NotificationDatabaseTest, DeleteNotificationDataDifferentOrigin) {
436 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); 438 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory());
437 ASSERT_EQ(NotificationDatabase::STATUS_OK, 439 ASSERT_EQ(NotificationDatabase::STATUS_OK,
438 database->Open(true /* create_if_missing */)); 440 database->Open(true /* create_if_missing */));
439 441
440 int64_t notification_id = 0; 442 const std::string notification_id = GenerateNotificationId();
441 443
442 NotificationDatabaseData database_data; 444 NotificationDatabaseData database_data;
445 database_data.notification_id = notification_id;
446
443 GURL origin("https://example.com"); 447 GURL origin("https://example.com");
444 448
445 ASSERT_EQ( 449 ASSERT_EQ(NotificationDatabase::STATUS_OK,
446 NotificationDatabase::STATUS_OK, 450 database->WriteNotificationData(origin, database_data));
447 database->WriteNotificationData(origin, database_data, &notification_id));
448 451
449 // Attempting to delete the notification with a different origin, but with the 452 // Attempting to delete the notification with a different origin, but with the
450 // same |notification_id|, should not return an error (the notification could 453 // same |notification_id|, should not return an error (the notification could
451 // not be found, but that's not considered a failure). However, it should not 454 // not be found, but that's not considered a failure). However, it should not
452 // remove the notification either. 455 // remove the notification either.
453 EXPECT_EQ(NotificationDatabase::STATUS_OK, 456 EXPECT_EQ(NotificationDatabase::STATUS_OK,
454 database->DeleteNotificationData(notification_id, 457 database->DeleteNotificationData(notification_id,
455 GURL("https://chrome.com"))); 458 GURL("https://chrome.com")));
456 459
457 EXPECT_EQ( 460 EXPECT_EQ(
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
521 524
522 TEST_F(NotificationDatabaseTest, DeleteAllNotificationDataForOrigin) { 525 TEST_F(NotificationDatabaseTest, DeleteAllNotificationDataForOrigin) {
523 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); 526 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory());
524 ASSERT_EQ(NotificationDatabase::STATUS_OK, 527 ASSERT_EQ(NotificationDatabase::STATUS_OK,
525 database->Open(true /* create_if_missing */)); 528 database->Open(true /* create_if_missing */));
526 529
527 ASSERT_NO_FATAL_FAILURE(PopulateDatabaseWithExampleData(database.get())); 530 ASSERT_NO_FATAL_FAILURE(PopulateDatabaseWithExampleData(database.get()));
528 531
529 GURL origin("https://example.com:443"); 532 GURL origin("https://example.com:443");
530 533
531 std::set<int64_t> deleted_notification_set; 534 std::set<std::string> deleted_notification_ids;
532 ASSERT_EQ(NotificationDatabase::STATUS_OK, 535 ASSERT_EQ(NotificationDatabase::STATUS_OK,
533 database->DeleteAllNotificationDataForOrigin( 536 database->DeleteAllNotificationDataForOrigin(
534 origin, "" /* tag */, &deleted_notification_set)); 537 origin, "" /* tag */, &deleted_notification_ids));
535 538
536 EXPECT_EQ(4u, deleted_notification_set.size()); 539 EXPECT_EQ(4u, deleted_notification_ids.size());
537 540
538 std::vector<NotificationDatabaseData> notifications; 541 std::vector<NotificationDatabaseData> notifications;
539 ASSERT_EQ(NotificationDatabase::STATUS_OK, 542 ASSERT_EQ(NotificationDatabase::STATUS_OK,
540 database->ReadAllNotificationDataForOrigin(origin, &notifications)); 543 database->ReadAllNotificationDataForOrigin(origin, &notifications));
541 544
542 EXPECT_EQ(0u, notifications.size()); 545 EXPECT_EQ(0u, notifications.size());
543 } 546 }
544 547
545 TEST_F(NotificationDatabaseTest, DeleteAllNotificationDataForOriginWithTag) { 548 TEST_F(NotificationDatabaseTest, DeleteAllNotificationDataForOriginWithTag) {
546 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); 549 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory());
(...skipping 16 matching lines...) Expand all
563 for (const auto& database_data : notifications) { 566 for (const auto& database_data : notifications) {
564 if (database_data.notification_data.tag == tag) 567 if (database_data.notification_data.tag == tag)
565 ++notifications_with_tag; 568 ++notifications_with_tag;
566 else 569 else
567 ++notifications_without_tag; 570 ++notifications_without_tag;
568 } 571 }
569 572
570 ASSERT_GT(notifications_with_tag, 0u); 573 ASSERT_GT(notifications_with_tag, 0u);
571 ASSERT_GT(notifications_without_tag, 0u); 574 ASSERT_GT(notifications_without_tag, 0u);
572 575
573 std::set<int64_t> deleted_notification_set; 576 std::set<std::string> deleted_notification_ids;
574 ASSERT_EQ(NotificationDatabase::STATUS_OK, 577 ASSERT_EQ(NotificationDatabase::STATUS_OK,
575 database->DeleteAllNotificationDataForOrigin( 578 database->DeleteAllNotificationDataForOrigin(
576 origin, "foo" /* tag */, &deleted_notification_set)); 579 origin, "foo" /* tag */, &deleted_notification_ids));
577 580
578 EXPECT_EQ(notifications_with_tag, deleted_notification_set.size()); 581 EXPECT_EQ(notifications_with_tag, deleted_notification_ids.size());
579 582
580 std::vector<NotificationDatabaseData> updated_notifications; 583 std::vector<NotificationDatabaseData> updated_notifications;
581 ASSERT_EQ(NotificationDatabase::STATUS_OK, 584 ASSERT_EQ(NotificationDatabase::STATUS_OK,
582 database->ReadAllNotificationDataForOrigin(origin, 585 database->ReadAllNotificationDataForOrigin(origin,
583 &updated_notifications)); 586 &updated_notifications));
584 587
585 EXPECT_EQ(notifications_without_tag, updated_notifications.size()); 588 EXPECT_EQ(notifications_without_tag, updated_notifications.size());
586 589
587 size_t updated_notifications_with_tag = 0; 590 size_t updated_notifications_with_tag = 0;
588 size_t updated_notifications_without_tag = 0; 591 size_t updated_notifications_without_tag = 0;
589 592
590 for (const auto& database_data : updated_notifications) { 593 for (const auto& database_data : updated_notifications) {
591 if (database_data.notification_data.tag == tag) 594 if (database_data.notification_data.tag == tag)
592 ++updated_notifications_with_tag; 595 ++updated_notifications_with_tag;
593 else 596 else
594 ++updated_notifications_without_tag; 597 ++updated_notifications_without_tag;
595 } 598 }
596 599
597 EXPECT_EQ(0u, updated_notifications_with_tag); 600 EXPECT_EQ(0u, updated_notifications_with_tag);
598 EXPECT_EQ(notifications_without_tag, updated_notifications_without_tag); 601 EXPECT_EQ(notifications_without_tag, updated_notifications_without_tag);
599 } 602 }
600 603
601 TEST_F(NotificationDatabaseTest, DeleteAllNotificationDataForOriginEmpty) { 604 TEST_F(NotificationDatabaseTest, DeleteAllNotificationDataForOriginEmpty) {
602 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); 605 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory());
603 ASSERT_EQ(NotificationDatabase::STATUS_OK, 606 ASSERT_EQ(NotificationDatabase::STATUS_OK,
604 database->Open(true /* create_if_missing */)); 607 database->Open(true /* create_if_missing */));
605 608
606 GURL origin("https://example.com"); 609 GURL origin("https://example.com");
607 610
608 std::set<int64_t> deleted_notification_set; 611 std::set<std::string> deleted_notification_ids;
609 ASSERT_EQ(NotificationDatabase::STATUS_OK, 612 ASSERT_EQ(NotificationDatabase::STATUS_OK,
610 database->DeleteAllNotificationDataForOrigin( 613 database->DeleteAllNotificationDataForOrigin(
611 origin, "" /* tag */, &deleted_notification_set)); 614 origin, "" /* tag */, &deleted_notification_ids));
612 615
613 EXPECT_EQ(0u, deleted_notification_set.size()); 616 EXPECT_EQ(0u, deleted_notification_ids.size());
614 } 617 }
615 618
616 TEST_F(NotificationDatabaseTest, 619 TEST_F(NotificationDatabaseTest,
617 DeleteAllNotificationDataForServiceWorkerRegistration) { 620 DeleteAllNotificationDataForServiceWorkerRegistration) {
618 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); 621 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory());
619 ASSERT_EQ(NotificationDatabase::STATUS_OK, 622 ASSERT_EQ(NotificationDatabase::STATUS_OK,
620 database->Open(true /* create_if_missing */)); 623 database->Open(true /* create_if_missing */));
621 624
622 ASSERT_NO_FATAL_FAILURE(PopulateDatabaseWithExampleData(database.get())); 625 ASSERT_NO_FATAL_FAILURE(PopulateDatabaseWithExampleData(database.get()));
623 626
624 GURL origin("https://example.com:443"); 627 GURL origin("https://example.com:443");
625 std::set<int64_t> deleted_notification_set; 628 std::set<std::string> deleted_notification_ids;
626 ASSERT_EQ(NotificationDatabase::STATUS_OK, 629 ASSERT_EQ(NotificationDatabase::STATUS_OK,
627 database->DeleteAllNotificationDataForServiceWorkerRegistration( 630 database->DeleteAllNotificationDataForServiceWorkerRegistration(
628 origin, kExampleServiceWorkerRegistrationId, 631 origin, kExampleServiceWorkerRegistrationId,
629 &deleted_notification_set)); 632 &deleted_notification_ids));
630 633
631 EXPECT_EQ(2u, deleted_notification_set.size()); 634 EXPECT_EQ(2u, deleted_notification_ids.size());
632 635
633 std::vector<NotificationDatabaseData> notifications; 636 std::vector<NotificationDatabaseData> notifications;
634 ASSERT_EQ(NotificationDatabase::STATUS_OK, 637 ASSERT_EQ(NotificationDatabase::STATUS_OK,
635 database->ReadAllNotificationDataForServiceWorkerRegistration( 638 database->ReadAllNotificationDataForServiceWorkerRegistration(
636 origin, kExampleServiceWorkerRegistrationId, &notifications)); 639 origin, kExampleServiceWorkerRegistrationId, &notifications));
637 640
638 EXPECT_EQ(0u, notifications.size()); 641 EXPECT_EQ(0u, notifications.size());
639 } 642 }
640 643
641 } // namespace content 644 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698