| 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" |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 90 void WriteLevelDBKeyValuePair(NotificationDatabase* database, | 90 void WriteLevelDBKeyValuePair(NotificationDatabase* database, |
| 91 const std::string& key, | 91 const std::string& key, |
| 92 const std::string& value) { | 92 const std::string& value) { |
| 93 leveldb::Status status = | 93 leveldb::Status status = |
| 94 database->GetDBForTesting()->Put(leveldb::WriteOptions(), key, value); | 94 database->GetDBForTesting()->Put(leveldb::WriteOptions(), key, value); |
| 95 ASSERT_TRUE(status.ok()); | 95 ASSERT_TRUE(status.ok()); |
| 96 } | 96 } |
| 97 }; | 97 }; |
| 98 | 98 |
| 99 TEST_F(NotificationDatabaseTest, OpenCloseMemory) { | 99 TEST_F(NotificationDatabaseTest, OpenCloseMemory) { |
| 100 scoped_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); | 100 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); |
| 101 | 101 |
| 102 // Should return false because the database does not exist in memory. | 102 // Should return false because the database does not exist in memory. |
| 103 EXPECT_EQ(NotificationDatabase::STATUS_ERROR_NOT_FOUND, | 103 EXPECT_EQ(NotificationDatabase::STATUS_ERROR_NOT_FOUND, |
| 104 database->Open(false /* create_if_missing */)); | 104 database->Open(false /* create_if_missing */)); |
| 105 | 105 |
| 106 // Should return true, indicating that the database could be created. | 106 // Should return true, indicating that the database could be created. |
| 107 EXPECT_EQ(NotificationDatabase::STATUS_OK, | 107 EXPECT_EQ(NotificationDatabase::STATUS_OK, |
| 108 database->Open(true /* create_if_missing */)); | 108 database->Open(true /* create_if_missing */)); |
| 109 | 109 |
| 110 EXPECT_TRUE(IsDatabaseOpen(database.get())); | 110 EXPECT_TRUE(IsDatabaseOpen(database.get())); |
| 111 EXPECT_TRUE(IsInMemoryDatabase(database.get())); | 111 EXPECT_TRUE(IsInMemoryDatabase(database.get())); |
| 112 | 112 |
| 113 // Verify that in-memory databases do not persist when being re-created. | 113 // Verify that in-memory databases do not persist when being re-created. |
| 114 database.reset(CreateDatabaseInMemory()); | 114 database.reset(CreateDatabaseInMemory()); |
| 115 | 115 |
| 116 EXPECT_EQ(NotificationDatabase::STATUS_ERROR_NOT_FOUND, | 116 EXPECT_EQ(NotificationDatabase::STATUS_ERROR_NOT_FOUND, |
| 117 database->Open(false /* create_if_missing */)); | 117 database->Open(false /* create_if_missing */)); |
| 118 } | 118 } |
| 119 | 119 |
| 120 TEST_F(NotificationDatabaseTest, OpenCloseFileSystem) { | 120 TEST_F(NotificationDatabaseTest, OpenCloseFileSystem) { |
| 121 base::ScopedTempDir database_dir; | 121 base::ScopedTempDir database_dir; |
| 122 ASSERT_TRUE(database_dir.CreateUniqueTempDir()); | 122 ASSERT_TRUE(database_dir.CreateUniqueTempDir()); |
| 123 | 123 |
| 124 scoped_ptr<NotificationDatabase> database( | 124 std::unique_ptr<NotificationDatabase> database( |
| 125 CreateDatabaseOnFileSystem(database_dir.path())); | 125 CreateDatabaseOnFileSystem(database_dir.path())); |
| 126 | 126 |
| 127 // Should return false because the database does not exist on the file system. | 127 // Should return false because the database does not exist on the file system. |
| 128 EXPECT_EQ(NotificationDatabase::STATUS_ERROR_NOT_FOUND, | 128 EXPECT_EQ(NotificationDatabase::STATUS_ERROR_NOT_FOUND, |
| 129 database->Open(false /* create_if_missing */)); | 129 database->Open(false /* create_if_missing */)); |
| 130 | 130 |
| 131 // Should return true, indicating that the database could be created. | 131 // Should return true, indicating that the database could be created. |
| 132 EXPECT_EQ(NotificationDatabase::STATUS_OK, | 132 EXPECT_EQ(NotificationDatabase::STATUS_OK, |
| 133 database->Open(true /* create_if_missing */)); | 133 database->Open(true /* create_if_missing */)); |
| 134 | 134 |
| 135 EXPECT_TRUE(IsDatabaseOpen(database.get())); | 135 EXPECT_TRUE(IsDatabaseOpen(database.get())); |
| 136 EXPECT_FALSE(IsInMemoryDatabase(database.get())); | 136 EXPECT_FALSE(IsInMemoryDatabase(database.get())); |
| 137 | 137 |
| 138 // Close the database, and re-open it without attempting to create it because | 138 // Close the database, and re-open it without attempting to create it because |
| 139 // the files on the file system should still exist as expected. | 139 // the files on the file system should still exist as expected. |
| 140 database.reset(CreateDatabaseOnFileSystem(database_dir.path())); | 140 database.reset(CreateDatabaseOnFileSystem(database_dir.path())); |
| 141 EXPECT_EQ(NotificationDatabase::STATUS_OK, | 141 EXPECT_EQ(NotificationDatabase::STATUS_OK, |
| 142 database->Open(false /* create_if_missing */)); | 142 database->Open(false /* create_if_missing */)); |
| 143 } | 143 } |
| 144 | 144 |
| 145 TEST_F(NotificationDatabaseTest, DestroyDatabase) { | 145 TEST_F(NotificationDatabaseTest, DestroyDatabase) { |
| 146 base::ScopedTempDir database_dir; | 146 base::ScopedTempDir database_dir; |
| 147 ASSERT_TRUE(database_dir.CreateUniqueTempDir()); | 147 ASSERT_TRUE(database_dir.CreateUniqueTempDir()); |
| 148 | 148 |
| 149 scoped_ptr<NotificationDatabase> database( | 149 std::unique_ptr<NotificationDatabase> database( |
| 150 CreateDatabaseOnFileSystem(database_dir.path())); | 150 CreateDatabaseOnFileSystem(database_dir.path())); |
| 151 | 151 |
| 152 EXPECT_EQ(NotificationDatabase::STATUS_OK, | 152 EXPECT_EQ(NotificationDatabase::STATUS_OK, |
| 153 database->Open(true /* create_if_missing */)); | 153 database->Open(true /* create_if_missing */)); |
| 154 EXPECT_TRUE(IsDatabaseOpen(database.get())); | 154 EXPECT_TRUE(IsDatabaseOpen(database.get())); |
| 155 | 155 |
| 156 // Destroy the database. This will immediately close it as well. | 156 // Destroy the database. This will immediately close it as well. |
| 157 ASSERT_EQ(NotificationDatabase::STATUS_OK, database->Destroy()); | 157 ASSERT_EQ(NotificationDatabase::STATUS_OK, database->Destroy()); |
| 158 EXPECT_FALSE(IsDatabaseOpen(database.get())); | 158 EXPECT_FALSE(IsDatabaseOpen(database.get())); |
| 159 | 159 |
| 160 // Try to re-open the database (but not re-create it). This should fail as | 160 // Try to re-open the database (but not re-create it). This should fail as |
| 161 // the files associated with the database should have been blown away. | 161 // the files associated with the database should have been blown away. |
| 162 database.reset(CreateDatabaseOnFileSystem(database_dir.path())); | 162 database.reset(CreateDatabaseOnFileSystem(database_dir.path())); |
| 163 EXPECT_EQ(NotificationDatabase::STATUS_ERROR_NOT_FOUND, | 163 EXPECT_EQ(NotificationDatabase::STATUS_ERROR_NOT_FOUND, |
| 164 database->Open(false /* create_if_missing */)); | 164 database->Open(false /* create_if_missing */)); |
| 165 } | 165 } |
| 166 | 166 |
| 167 TEST_F(NotificationDatabaseTest, NotificationIdIncrements) { | 167 TEST_F(NotificationDatabaseTest, NotificationIdIncrements) { |
| 168 base::ScopedTempDir database_dir; | 168 base::ScopedTempDir database_dir; |
| 169 ASSERT_TRUE(database_dir.CreateUniqueTempDir()); | 169 ASSERT_TRUE(database_dir.CreateUniqueTempDir()); |
| 170 | 170 |
| 171 scoped_ptr<NotificationDatabase> database( | 171 std::unique_ptr<NotificationDatabase> database( |
| 172 CreateDatabaseOnFileSystem(database_dir.path())); | 172 CreateDatabaseOnFileSystem(database_dir.path())); |
| 173 | 173 |
| 174 ASSERT_EQ(NotificationDatabase::STATUS_OK, | 174 ASSERT_EQ(NotificationDatabase::STATUS_OK, |
| 175 database->Open(true /* create_if_missing */)); | 175 database->Open(true /* create_if_missing */)); |
| 176 | 176 |
| 177 GURL origin("https://example.com"); | 177 GURL origin("https://example.com"); |
| 178 | 178 |
| 179 int64_t notification_id = 0; | 179 int64_t notification_id = 0; |
| 180 | 180 |
| 181 // Verify that getting two ids on the same database instance results in | 181 // Verify that getting two ids on the same database instance results in |
| (...skipping 11 matching lines...) Expand all Loading... |
| 193 database->Open(false /* create_if_missing */)); | 193 database->Open(false /* create_if_missing */)); |
| 194 | 194 |
| 195 // Verify that the next notification id was stored in the database, and | 195 // Verify that the next notification id was stored in the database, and |
| 196 // continues where we expect it to be, even after closing and opening it. | 196 // continues where we expect it to be, even after closing and opening it. |
| 197 ASSERT_NO_FATAL_FAILURE(CreateAndWriteNotification( | 197 ASSERT_NO_FATAL_FAILURE(CreateAndWriteNotification( |
| 198 database.get(), origin, 0 /* sw_registration_id */, ¬ification_id)); | 198 database.get(), origin, 0 /* sw_registration_id */, ¬ification_id)); |
| 199 EXPECT_EQ(notification_id, 3); | 199 EXPECT_EQ(notification_id, 3); |
| 200 } | 200 } |
| 201 | 201 |
| 202 TEST_F(NotificationDatabaseTest, NotificationIdIncrementsStorage) { | 202 TEST_F(NotificationDatabaseTest, NotificationIdIncrementsStorage) { |
| 203 scoped_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); | 203 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); |
| 204 ASSERT_EQ(NotificationDatabase::STATUS_OK, | 204 ASSERT_EQ(NotificationDatabase::STATUS_OK, |
| 205 database->Open(true /* create_if_missing */)); | 205 database->Open(true /* create_if_missing */)); |
| 206 | 206 |
| 207 GURL origin("https://example.com"); | 207 GURL origin("https://example.com"); |
| 208 | 208 |
| 209 NotificationDatabaseData database_data; | 209 NotificationDatabaseData database_data; |
| 210 database_data.notification_id = -1; | 210 database_data.notification_id = -1; |
| 211 | 211 |
| 212 int64_t notification_id = 0; | 212 int64_t notification_id = 0; |
| 213 ASSERT_EQ( | 213 ASSERT_EQ( |
| 214 NotificationDatabase::STATUS_OK, | 214 NotificationDatabase::STATUS_OK, |
| 215 database->WriteNotificationData(origin, database_data, ¬ification_id)); | 215 database->WriteNotificationData(origin, database_data, ¬ification_id)); |
| 216 | 216 |
| 217 ASSERT_EQ( | 217 ASSERT_EQ( |
| 218 NotificationDatabase::STATUS_OK, | 218 NotificationDatabase::STATUS_OK, |
| 219 database->ReadNotificationData(notification_id, origin, &database_data)); | 219 database->ReadNotificationData(notification_id, origin, &database_data)); |
| 220 | 220 |
| 221 EXPECT_EQ(notification_id, database_data.notification_id); | 221 EXPECT_EQ(notification_id, database_data.notification_id); |
| 222 } | 222 } |
| 223 | 223 |
| 224 TEST_F(NotificationDatabaseTest, NotificationIdCorruption) { | 224 TEST_F(NotificationDatabaseTest, NotificationIdCorruption) { |
| 225 base::ScopedTempDir database_dir; | 225 base::ScopedTempDir database_dir; |
| 226 ASSERT_TRUE(database_dir.CreateUniqueTempDir()); | 226 ASSERT_TRUE(database_dir.CreateUniqueTempDir()); |
| 227 | 227 |
| 228 scoped_ptr<NotificationDatabase> database( | 228 std::unique_ptr<NotificationDatabase> database( |
| 229 CreateDatabaseOnFileSystem(database_dir.path())); | 229 CreateDatabaseOnFileSystem(database_dir.path())); |
| 230 | 230 |
| 231 ASSERT_EQ(NotificationDatabase::STATUS_OK, | 231 ASSERT_EQ(NotificationDatabase::STATUS_OK, |
| 232 database->Open(true /* create_if_missing */)); | 232 database->Open(true /* create_if_missing */)); |
| 233 | 233 |
| 234 GURL origin("https://example.com"); | 234 GURL origin("https://example.com"); |
| 235 | 235 |
| 236 NotificationDatabaseData database_data; | 236 NotificationDatabaseData database_data; |
| 237 int64_t notification_id = 0; | 237 int64_t notification_id = 0; |
| 238 | 238 |
| 239 ASSERT_EQ( | 239 ASSERT_EQ( |
| 240 NotificationDatabase::STATUS_OK, | 240 NotificationDatabase::STATUS_OK, |
| 241 database->WriteNotificationData(origin, database_data, ¬ification_id)); | 241 database->WriteNotificationData(origin, database_data, ¬ification_id)); |
| 242 EXPECT_EQ(notification_id, 1); | 242 EXPECT_EQ(notification_id, 1); |
| 243 | 243 |
| 244 // Deliberately write an invalid value as the next notification id. When | 244 // Deliberately write an invalid value as the next notification id. When |
| 245 // re-opening the database, the Open() method should realize that an invalid | 245 // re-opening the database, the Open() method should realize that an invalid |
| 246 // value is being read, and mark the database as corrupted. | 246 // value is being read, and mark the database as corrupted. |
| 247 ASSERT_NO_FATAL_FAILURE( | 247 ASSERT_NO_FATAL_FAILURE( |
| 248 WriteLevelDBKeyValuePair(database.get(), "NEXT_NOTIFICATION_ID", "-42")); | 248 WriteLevelDBKeyValuePair(database.get(), "NEXT_NOTIFICATION_ID", "-42")); |
| 249 | 249 |
| 250 database.reset(CreateDatabaseOnFileSystem(database_dir.path())); | 250 database.reset(CreateDatabaseOnFileSystem(database_dir.path())); |
| 251 EXPECT_EQ(NotificationDatabase::STATUS_ERROR_CORRUPTED, | 251 EXPECT_EQ(NotificationDatabase::STATUS_ERROR_CORRUPTED, |
| 252 database->Open(false /* create_if_missing */)); | 252 database->Open(false /* create_if_missing */)); |
| 253 } | 253 } |
| 254 | 254 |
| 255 TEST_F(NotificationDatabaseTest, ReadInvalidNotificationData) { | 255 TEST_F(NotificationDatabaseTest, ReadInvalidNotificationData) { |
| 256 scoped_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); | 256 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); |
| 257 ASSERT_EQ(NotificationDatabase::STATUS_OK, | 257 ASSERT_EQ(NotificationDatabase::STATUS_OK, |
| 258 database->Open(true /* create_if_missing */)); | 258 database->Open(true /* create_if_missing */)); |
| 259 | 259 |
| 260 NotificationDatabaseData database_data; | 260 NotificationDatabaseData database_data; |
| 261 | 261 |
| 262 // Reading the notification data for a notification that does not exist should | 262 // Reading the notification data for a notification that does not exist should |
| 263 // return the ERROR_NOT_FOUND status code. | 263 // return the ERROR_NOT_FOUND status code. |
| 264 EXPECT_EQ(NotificationDatabase::STATUS_ERROR_NOT_FOUND, | 264 EXPECT_EQ(NotificationDatabase::STATUS_ERROR_NOT_FOUND, |
| 265 database->ReadNotificationData(9001, GURL("https://chrome.com"), | 265 database->ReadNotificationData(9001, GURL("https://chrome.com"), |
| 266 &database_data)); | 266 &database_data)); |
| 267 } | 267 } |
| 268 | 268 |
| 269 TEST_F(NotificationDatabaseTest, ReadNotificationDataDifferentOrigin) { | 269 TEST_F(NotificationDatabaseTest, ReadNotificationDataDifferentOrigin) { |
| 270 scoped_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); | 270 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); |
| 271 ASSERT_EQ(NotificationDatabase::STATUS_OK, | 271 ASSERT_EQ(NotificationDatabase::STATUS_OK, |
| 272 database->Open(true /* create_if_missing */)); | 272 database->Open(true /* create_if_missing */)); |
| 273 | 273 |
| 274 int64_t notification_id = 0; | 274 int64_t notification_id = 0; |
| 275 GURL origin("https://example.com"); | 275 GURL origin("https://example.com"); |
| 276 | 276 |
| 277 NotificationDatabaseData database_data, read_database_data; | 277 NotificationDatabaseData database_data, read_database_data; |
| 278 database_data.notification_data.title = base::UTF8ToUTF16("My Notification"); | 278 database_data.notification_data.title = base::UTF8ToUTF16("My Notification"); |
| 279 | 279 |
| 280 ASSERT_EQ( | 280 ASSERT_EQ( |
| (...skipping 11 matching lines...) Expand all Loading... |
| 292 // should return STATUS_OK and the associated notification data. | 292 // should return STATUS_OK and the associated notification data. |
| 293 ASSERT_EQ(NotificationDatabase::STATUS_OK, | 293 ASSERT_EQ(NotificationDatabase::STATUS_OK, |
| 294 database->ReadNotificationData(notification_id, origin, | 294 database->ReadNotificationData(notification_id, origin, |
| 295 &read_database_data)); | 295 &read_database_data)); |
| 296 | 296 |
| 297 EXPECT_EQ(database_data.notification_data.title, | 297 EXPECT_EQ(database_data.notification_data.title, |
| 298 read_database_data.notification_data.title); | 298 read_database_data.notification_data.title); |
| 299 } | 299 } |
| 300 | 300 |
| 301 TEST_F(NotificationDatabaseTest, ReadNotificationDataReflection) { | 301 TEST_F(NotificationDatabaseTest, ReadNotificationDataReflection) { |
| 302 scoped_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); | 302 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); |
| 303 ASSERT_EQ(NotificationDatabase::STATUS_OK, | 303 ASSERT_EQ(NotificationDatabase::STATUS_OK, |
| 304 database->Open(true /* create_if_missing */)); | 304 database->Open(true /* create_if_missing */)); |
| 305 | 305 |
| 306 int64_t notification_id = 0; | 306 int64_t notification_id = 0; |
| 307 | 307 |
| 308 GURL origin("https://example.com"); | 308 GURL origin("https://example.com"); |
| 309 | 309 |
| 310 PlatformNotificationData notification_data; | 310 PlatformNotificationData notification_data; |
| 311 notification_data.title = base::UTF8ToUTF16("My Notification"); | 311 notification_data.title = base::UTF8ToUTF16("My Notification"); |
| 312 notification_data.direction = | 312 notification_data.direction = |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 349 EXPECT_EQ(notification_data.title, read_notification_data.title); | 349 EXPECT_EQ(notification_data.title, read_notification_data.title); |
| 350 EXPECT_EQ(notification_data.direction, read_notification_data.direction); | 350 EXPECT_EQ(notification_data.direction, read_notification_data.direction); |
| 351 EXPECT_EQ(notification_data.lang, read_notification_data.lang); | 351 EXPECT_EQ(notification_data.lang, read_notification_data.lang); |
| 352 EXPECT_EQ(notification_data.body, read_notification_data.body); | 352 EXPECT_EQ(notification_data.body, read_notification_data.body); |
| 353 EXPECT_EQ(notification_data.tag, read_notification_data.tag); | 353 EXPECT_EQ(notification_data.tag, read_notification_data.tag); |
| 354 EXPECT_EQ(notification_data.icon, read_notification_data.icon); | 354 EXPECT_EQ(notification_data.icon, read_notification_data.icon); |
| 355 EXPECT_EQ(notification_data.silent, read_notification_data.silent); | 355 EXPECT_EQ(notification_data.silent, read_notification_data.silent); |
| 356 } | 356 } |
| 357 | 357 |
| 358 TEST_F(NotificationDatabaseTest, ReadWriteMultipleNotificationData) { | 358 TEST_F(NotificationDatabaseTest, ReadWriteMultipleNotificationData) { |
| 359 scoped_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); | 359 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); |
| 360 ASSERT_EQ(NotificationDatabase::STATUS_OK, | 360 ASSERT_EQ(NotificationDatabase::STATUS_OK, |
| 361 database->Open(true /* create_if_missing */)); | 361 database->Open(true /* create_if_missing */)); |
| 362 | 362 |
| 363 GURL origin("https://example.com"); | 363 GURL origin("https://example.com"); |
| 364 int64_t notification_id = 0; | 364 int64_t notification_id = 0; |
| 365 | 365 |
| 366 // Write ten notifications to the database, each with a unique title and | 366 // Write ten notifications to the database, each with a unique title and |
| 367 // notification id (it is the responsibility of the user to increment this). | 367 // notification id (it is the responsibility of the user to increment this). |
| 368 for (int i = 1; i <= 10; ++i) { | 368 for (int i = 1; i <= 10; ++i) { |
| 369 ASSERT_NO_FATAL_FAILURE(CreateAndWriteNotification( | 369 ASSERT_NO_FATAL_FAILURE(CreateAndWriteNotification( |
| 370 database.get(), origin, i /* sw_registration_id */, ¬ification_id)); | 370 database.get(), origin, i /* sw_registration_id */, ¬ification_id)); |
| 371 EXPECT_EQ(notification_id, i); | 371 EXPECT_EQ(notification_id, i); |
| 372 } | 372 } |
| 373 | 373 |
| 374 NotificationDatabaseData database_data; | 374 NotificationDatabaseData database_data; |
| 375 | 375 |
| 376 // Read the ten notifications from the database, and verify that the titles | 376 // Read the ten notifications from the database, and verify that the titles |
| 377 // of each of them matches with how they were created. | 377 // of each of them matches with how they were created. |
| 378 for (int i = 1; i <= 10; ++i) { | 378 for (int i = 1; i <= 10; ++i) { |
| 379 ASSERT_EQ(NotificationDatabase::STATUS_OK, | 379 ASSERT_EQ(NotificationDatabase::STATUS_OK, |
| 380 database->ReadNotificationData(i /* notification_id */, origin, | 380 database->ReadNotificationData(i /* notification_id */, origin, |
| 381 &database_data)); | 381 &database_data)); |
| 382 | 382 |
| 383 EXPECT_EQ(i, database_data.service_worker_registration_id); | 383 EXPECT_EQ(i, database_data.service_worker_registration_id); |
| 384 } | 384 } |
| 385 } | 385 } |
| 386 | 386 |
| 387 TEST_F(NotificationDatabaseTest, DeleteInvalidNotificationData) { | 387 TEST_F(NotificationDatabaseTest, DeleteInvalidNotificationData) { |
| 388 scoped_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); | 388 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); |
| 389 ASSERT_EQ(NotificationDatabase::STATUS_OK, | 389 ASSERT_EQ(NotificationDatabase::STATUS_OK, |
| 390 database->Open(true /* create_if_missing */)); | 390 database->Open(true /* create_if_missing */)); |
| 391 | 391 |
| 392 // Deleting non-existing notifications is not considered to be a failure. | 392 // Deleting non-existing notifications is not considered to be a failure. |
| 393 ASSERT_EQ(NotificationDatabase::STATUS_OK, | 393 ASSERT_EQ(NotificationDatabase::STATUS_OK, |
| 394 database->DeleteNotificationData(9001, GURL("https://chrome.com"))); | 394 database->DeleteNotificationData(9001, GURL("https://chrome.com"))); |
| 395 } | 395 } |
| 396 | 396 |
| 397 TEST_F(NotificationDatabaseTest, DeleteNotificationDataSameOrigin) { | 397 TEST_F(NotificationDatabaseTest, DeleteNotificationDataSameOrigin) { |
| 398 scoped_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 int64_t notification_id = 0; | 402 int64_t notification_id = 0; |
| 403 | 403 |
| 404 NotificationDatabaseData database_data; | 404 NotificationDatabaseData database_data; |
| 405 GURL origin("https://example.com"); | 405 GURL origin("https://example.com"); |
| 406 | 406 |
| 407 ASSERT_EQ( | 407 ASSERT_EQ( |
| 408 NotificationDatabase::STATUS_OK, | 408 NotificationDatabase::STATUS_OK, |
| 409 database->WriteNotificationData(origin, database_data, ¬ification_id)); | 409 database->WriteNotificationData(origin, database_data, ¬ification_id)); |
| 410 | 410 |
| 411 // Reading a notification after writing one should succeed. | 411 // Reading a notification after writing one should succeed. |
| 412 EXPECT_EQ( | 412 EXPECT_EQ( |
| 413 NotificationDatabase::STATUS_OK, | 413 NotificationDatabase::STATUS_OK, |
| 414 database->ReadNotificationData(notification_id, origin, &database_data)); | 414 database->ReadNotificationData(notification_id, origin, &database_data)); |
| 415 | 415 |
| 416 // Delete the notification which was just written to the database, and verify | 416 // Delete the notification which was just written to the database, and verify |
| 417 // that reading it again will fail. | 417 // that reading it again will fail. |
| 418 EXPECT_EQ(NotificationDatabase::STATUS_OK, | 418 EXPECT_EQ(NotificationDatabase::STATUS_OK, |
| 419 database->DeleteNotificationData(notification_id, origin)); | 419 database->DeleteNotificationData(notification_id, origin)); |
| 420 EXPECT_EQ( | 420 EXPECT_EQ( |
| 421 NotificationDatabase::STATUS_ERROR_NOT_FOUND, | 421 NotificationDatabase::STATUS_ERROR_NOT_FOUND, |
| 422 database->ReadNotificationData(notification_id, origin, &database_data)); | 422 database->ReadNotificationData(notification_id, origin, &database_data)); |
| 423 } | 423 } |
| 424 | 424 |
| 425 TEST_F(NotificationDatabaseTest, DeleteNotificationDataDifferentOrigin) { | 425 TEST_F(NotificationDatabaseTest, DeleteNotificationDataDifferentOrigin) { |
| 426 scoped_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); | 426 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); |
| 427 ASSERT_EQ(NotificationDatabase::STATUS_OK, | 427 ASSERT_EQ(NotificationDatabase::STATUS_OK, |
| 428 database->Open(true /* create_if_missing */)); | 428 database->Open(true /* create_if_missing */)); |
| 429 | 429 |
| 430 int64_t notification_id = 0; | 430 int64_t notification_id = 0; |
| 431 | 431 |
| 432 NotificationDatabaseData database_data; | 432 NotificationDatabaseData database_data; |
| 433 GURL origin("https://example.com"); | 433 GURL origin("https://example.com"); |
| 434 | 434 |
| 435 ASSERT_EQ( | 435 ASSERT_EQ( |
| 436 NotificationDatabase::STATUS_OK, | 436 NotificationDatabase::STATUS_OK, |
| 437 database->WriteNotificationData(origin, database_data, ¬ification_id)); | 437 database->WriteNotificationData(origin, database_data, ¬ification_id)); |
| 438 | 438 |
| 439 // Attempting to delete the notification with a different origin, but with the | 439 // Attempting to delete the notification with a different origin, but with the |
| 440 // same |notification_id|, should not return an error (the notification could | 440 // same |notification_id|, should not return an error (the notification could |
| 441 // not be found, but that's not considered a failure). However, it should not | 441 // not be found, but that's not considered a failure). However, it should not |
| 442 // remove the notification either. | 442 // remove the notification either. |
| 443 EXPECT_EQ(NotificationDatabase::STATUS_OK, | 443 EXPECT_EQ(NotificationDatabase::STATUS_OK, |
| 444 database->DeleteNotificationData(notification_id, | 444 database->DeleteNotificationData(notification_id, |
| 445 GURL("https://chrome.com"))); | 445 GURL("https://chrome.com"))); |
| 446 | 446 |
| 447 EXPECT_EQ( | 447 EXPECT_EQ( |
| 448 NotificationDatabase::STATUS_OK, | 448 NotificationDatabase::STATUS_OK, |
| 449 database->ReadNotificationData(notification_id, origin, &database_data)); | 449 database->ReadNotificationData(notification_id, origin, &database_data)); |
| 450 } | 450 } |
| 451 | 451 |
| 452 TEST_F(NotificationDatabaseTest, ReadAllNotificationData) { | 452 TEST_F(NotificationDatabaseTest, ReadAllNotificationData) { |
| 453 scoped_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); | 453 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); |
| 454 ASSERT_EQ(NotificationDatabase::STATUS_OK, | 454 ASSERT_EQ(NotificationDatabase::STATUS_OK, |
| 455 database->Open(true /* create_if_missing */)); | 455 database->Open(true /* create_if_missing */)); |
| 456 | 456 |
| 457 ASSERT_NO_FATAL_FAILURE(PopulateDatabaseWithExampleData(database.get())); | 457 ASSERT_NO_FATAL_FAILURE(PopulateDatabaseWithExampleData(database.get())); |
| 458 | 458 |
| 459 std::vector<NotificationDatabaseData> notifications; | 459 std::vector<NotificationDatabaseData> notifications; |
| 460 ASSERT_EQ(NotificationDatabase::STATUS_OK, | 460 ASSERT_EQ(NotificationDatabase::STATUS_OK, |
| 461 database->ReadAllNotificationData(¬ifications)); | 461 database->ReadAllNotificationData(¬ifications)); |
| 462 | 462 |
| 463 EXPECT_EQ(arraysize(kExampleNotificationData), notifications.size()); | 463 EXPECT_EQ(arraysize(kExampleNotificationData), notifications.size()); |
| 464 } | 464 } |
| 465 | 465 |
| 466 TEST_F(NotificationDatabaseTest, ReadAllNotificationDataEmpty) { | 466 TEST_F(NotificationDatabaseTest, ReadAllNotificationDataEmpty) { |
| 467 scoped_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); | 467 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); |
| 468 ASSERT_EQ(NotificationDatabase::STATUS_OK, | 468 ASSERT_EQ(NotificationDatabase::STATUS_OK, |
| 469 database->Open(true /* create_if_missing */)); | 469 database->Open(true /* create_if_missing */)); |
| 470 | 470 |
| 471 std::vector<NotificationDatabaseData> notifications; | 471 std::vector<NotificationDatabaseData> notifications; |
| 472 ASSERT_EQ(NotificationDatabase::STATUS_OK, | 472 ASSERT_EQ(NotificationDatabase::STATUS_OK, |
| 473 database->ReadAllNotificationData(¬ifications)); | 473 database->ReadAllNotificationData(¬ifications)); |
| 474 | 474 |
| 475 EXPECT_EQ(0u, notifications.size()); | 475 EXPECT_EQ(0u, notifications.size()); |
| 476 } | 476 } |
| 477 | 477 |
| 478 TEST_F(NotificationDatabaseTest, ReadAllNotificationDataForOrigin) { | 478 TEST_F(NotificationDatabaseTest, ReadAllNotificationDataForOrigin) { |
| 479 scoped_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); | 479 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); |
| 480 ASSERT_EQ(NotificationDatabase::STATUS_OK, | 480 ASSERT_EQ(NotificationDatabase::STATUS_OK, |
| 481 database->Open(true /* create_if_missing */)); | 481 database->Open(true /* create_if_missing */)); |
| 482 | 482 |
| 483 ASSERT_NO_FATAL_FAILURE(PopulateDatabaseWithExampleData(database.get())); | 483 ASSERT_NO_FATAL_FAILURE(PopulateDatabaseWithExampleData(database.get())); |
| 484 | 484 |
| 485 GURL origin("https://example.com"); | 485 GURL origin("https://example.com"); |
| 486 | 486 |
| 487 std::vector<NotificationDatabaseData> notifications; | 487 std::vector<NotificationDatabaseData> notifications; |
| 488 ASSERT_EQ(NotificationDatabase::STATUS_OK, | 488 ASSERT_EQ(NotificationDatabase::STATUS_OK, |
| 489 database->ReadAllNotificationDataForOrigin(origin, ¬ifications)); | 489 database->ReadAllNotificationDataForOrigin(origin, ¬ifications)); |
| 490 | 490 |
| 491 EXPECT_EQ(4u, notifications.size()); | 491 EXPECT_EQ(4u, notifications.size()); |
| 492 } | 492 } |
| 493 | 493 |
| 494 TEST_F(NotificationDatabaseTest, | 494 TEST_F(NotificationDatabaseTest, |
| 495 ReadAllNotificationDataForServiceWorkerRegistration) { | 495 ReadAllNotificationDataForServiceWorkerRegistration) { |
| 496 scoped_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); | 496 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); |
| 497 ASSERT_EQ(NotificationDatabase::STATUS_OK, | 497 ASSERT_EQ(NotificationDatabase::STATUS_OK, |
| 498 database->Open(true /* create_if_missing */)); | 498 database->Open(true /* create_if_missing */)); |
| 499 | 499 |
| 500 ASSERT_NO_FATAL_FAILURE(PopulateDatabaseWithExampleData(database.get())); | 500 ASSERT_NO_FATAL_FAILURE(PopulateDatabaseWithExampleData(database.get())); |
| 501 | 501 |
| 502 GURL origin("https://example.com:443"); | 502 GURL origin("https://example.com:443"); |
| 503 | 503 |
| 504 std::vector<NotificationDatabaseData> notifications; | 504 std::vector<NotificationDatabaseData> notifications; |
| 505 ASSERT_EQ(NotificationDatabase::STATUS_OK, | 505 ASSERT_EQ(NotificationDatabase::STATUS_OK, |
| 506 database->ReadAllNotificationDataForServiceWorkerRegistration( | 506 database->ReadAllNotificationDataForServiceWorkerRegistration( |
| 507 origin, kExampleServiceWorkerRegistrationId, ¬ifications)); | 507 origin, kExampleServiceWorkerRegistrationId, ¬ifications)); |
| 508 | 508 |
| 509 EXPECT_EQ(2u, notifications.size()); | 509 EXPECT_EQ(2u, notifications.size()); |
| 510 } | 510 } |
| 511 | 511 |
| 512 TEST_F(NotificationDatabaseTest, DeleteAllNotificationDataForOrigin) { | 512 TEST_F(NotificationDatabaseTest, DeleteAllNotificationDataForOrigin) { |
| 513 scoped_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); | 513 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); |
| 514 ASSERT_EQ(NotificationDatabase::STATUS_OK, | 514 ASSERT_EQ(NotificationDatabase::STATUS_OK, |
| 515 database->Open(true /* create_if_missing */)); | 515 database->Open(true /* create_if_missing */)); |
| 516 | 516 |
| 517 ASSERT_NO_FATAL_FAILURE(PopulateDatabaseWithExampleData(database.get())); | 517 ASSERT_NO_FATAL_FAILURE(PopulateDatabaseWithExampleData(database.get())); |
| 518 | 518 |
| 519 GURL origin("https://example.com:443"); | 519 GURL origin("https://example.com:443"); |
| 520 | 520 |
| 521 std::set<int64_t> deleted_notification_set; | 521 std::set<int64_t> deleted_notification_set; |
| 522 ASSERT_EQ(NotificationDatabase::STATUS_OK, | 522 ASSERT_EQ(NotificationDatabase::STATUS_OK, |
| 523 database->DeleteAllNotificationDataForOrigin( | 523 database->DeleteAllNotificationDataForOrigin( |
| 524 origin, &deleted_notification_set)); | 524 origin, &deleted_notification_set)); |
| 525 | 525 |
| 526 EXPECT_EQ(4u, deleted_notification_set.size()); | 526 EXPECT_EQ(4u, deleted_notification_set.size()); |
| 527 | 527 |
| 528 std::vector<NotificationDatabaseData> notifications; | 528 std::vector<NotificationDatabaseData> notifications; |
| 529 ASSERT_EQ(NotificationDatabase::STATUS_OK, | 529 ASSERT_EQ(NotificationDatabase::STATUS_OK, |
| 530 database->ReadAllNotificationDataForOrigin(origin, ¬ifications)); | 530 database->ReadAllNotificationDataForOrigin(origin, ¬ifications)); |
| 531 | 531 |
| 532 EXPECT_EQ(0u, notifications.size()); | 532 EXPECT_EQ(0u, notifications.size()); |
| 533 } | 533 } |
| 534 | 534 |
| 535 TEST_F(NotificationDatabaseTest, DeleteAllNotificationDataForOriginEmpty) { | 535 TEST_F(NotificationDatabaseTest, DeleteAllNotificationDataForOriginEmpty) { |
| 536 scoped_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); | 536 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); |
| 537 ASSERT_EQ(NotificationDatabase::STATUS_OK, | 537 ASSERT_EQ(NotificationDatabase::STATUS_OK, |
| 538 database->Open(true /* create_if_missing */)); | 538 database->Open(true /* create_if_missing */)); |
| 539 | 539 |
| 540 GURL origin("https://example.com"); | 540 GURL origin("https://example.com"); |
| 541 | 541 |
| 542 std::set<int64_t> deleted_notification_set; | 542 std::set<int64_t> deleted_notification_set; |
| 543 ASSERT_EQ(NotificationDatabase::STATUS_OK, | 543 ASSERT_EQ(NotificationDatabase::STATUS_OK, |
| 544 database->DeleteAllNotificationDataForOrigin( | 544 database->DeleteAllNotificationDataForOrigin( |
| 545 origin, &deleted_notification_set)); | 545 origin, &deleted_notification_set)); |
| 546 | 546 |
| 547 EXPECT_EQ(0u, deleted_notification_set.size()); | 547 EXPECT_EQ(0u, deleted_notification_set.size()); |
| 548 } | 548 } |
| 549 | 549 |
| 550 TEST_F(NotificationDatabaseTest, | 550 TEST_F(NotificationDatabaseTest, |
| 551 DeleteAllNotificationDataForServiceWorkerRegistration) { | 551 DeleteAllNotificationDataForServiceWorkerRegistration) { |
| 552 scoped_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); | 552 std::unique_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); |
| 553 ASSERT_EQ(NotificationDatabase::STATUS_OK, | 553 ASSERT_EQ(NotificationDatabase::STATUS_OK, |
| 554 database->Open(true /* create_if_missing */)); | 554 database->Open(true /* create_if_missing */)); |
| 555 | 555 |
| 556 ASSERT_NO_FATAL_FAILURE(PopulateDatabaseWithExampleData(database.get())); | 556 ASSERT_NO_FATAL_FAILURE(PopulateDatabaseWithExampleData(database.get())); |
| 557 | 557 |
| 558 GURL origin("https://example.com:443"); | 558 GURL origin("https://example.com:443"); |
| 559 std::set<int64_t> deleted_notification_set; | 559 std::set<int64_t> deleted_notification_set; |
| 560 ASSERT_EQ(NotificationDatabase::STATUS_OK, | 560 ASSERT_EQ(NotificationDatabase::STATUS_OK, |
| 561 database->DeleteAllNotificationDataForServiceWorkerRegistration( | 561 database->DeleteAllNotificationDataForServiceWorkerRegistration( |
| 562 origin, kExampleServiceWorkerRegistrationId, | 562 origin, kExampleServiceWorkerRegistrationId, |
| 563 &deleted_notification_set)); | 563 &deleted_notification_set)); |
| 564 | 564 |
| 565 EXPECT_EQ(2u, deleted_notification_set.size()); | 565 EXPECT_EQ(2u, deleted_notification_set.size()); |
| 566 | 566 |
| 567 std::vector<NotificationDatabaseData> notifications; | 567 std::vector<NotificationDatabaseData> notifications; |
| 568 ASSERT_EQ(NotificationDatabase::STATUS_OK, | 568 ASSERT_EQ(NotificationDatabase::STATUS_OK, |
| 569 database->ReadAllNotificationDataForServiceWorkerRegistration( | 569 database->ReadAllNotificationDataForServiceWorkerRegistration( |
| 570 origin, kExampleServiceWorkerRegistrationId, ¬ifications)); | 570 origin, kExampleServiceWorkerRegistrationId, ¬ifications)); |
| 571 | 571 |
| 572 EXPECT_EQ(0u, notifications.size()); | 572 EXPECT_EQ(0u, notifications.size()); |
| 573 } | 573 } |
| 574 | 574 |
| 575 } // namespace content | 575 } // namespace content |
| OLD | NEW |