| OLD | NEW |
| 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 Loading... |
| 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 ¬ification_id)); | 85 ¬ification_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 Loading... |
| 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 */, ¬ification_id)); | 200 0 /* sw_registration_id */, ¬ification_id)); |
| 192 EXPECT_EQ(notification_id, 1); | |
| 193 | |
| 194 ASSERT_NO_FATAL_FAILURE( | |
| 195 CreateAndWriteNotification(database.get(), origin, "" /* tag */, | |
| 196 0 /* sw_registration_id */, ¬ification_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 */, ¬ification_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, ¬ification_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, ¬ification_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, ¬ification_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, ¬ification_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 ¬ification_id)); | 374 ¬ification_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, ¬ification_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, ¬ification_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 Loading... |
| 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, ¬ifications)); | 543 database->ReadAllNotificationDataForOrigin(origin, ¬ifications)); |
| 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 Loading... |
| 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, ¬ifications)); | 639 origin, kExampleServiceWorkerRegistrationId, ¬ifications)); |
| 637 | 640 |
| 638 EXPECT_EQ(0u, notifications.size()); | 641 EXPECT_EQ(0u, notifications.size()); |
| 639 } | 642 } |
| 640 | 643 |
| 641 } // namespace content | 644 } // namespace content |
| OLD | NEW |