diff options
author | peter <peter@chromium.org> | 2015-03-19 11:49:28 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-03-19 18:49:54 +0000 |
commit | adb2fe2adbb7bb502cad486ef8b1a2d9f2122198 (patch) | |
tree | 2caeffbc43bc4dcc44c8bbb325a279890a8809de /content/browser/notifications/notification_database_unittest.cc | |
parent | 1aa849117446c8524275bd305226fee8859f0c6f (diff) | |
download | chromium_src-adb2fe2adbb7bb502cad486ef8b1a2d9f2122198.zip chromium_src-adb2fe2adbb7bb502cad486ef8b1a2d9f2122198.tar.gz chromium_src-adb2fe2adbb7bb502cad486ef8b1a2d9f2122198.tar.bz2 |
The notification database should be able to read or delete multiple items.
This adds five methods to the NotificationDatabase class to read or delete
multiple notifications, which share two actual implementations.
They will be used as follows:
- Read all data: browsing data overviews.
- Read all data for an origin: for origin storage overviews, quota
client integration (storageQuota.queryInfo()).
- Read all data for a SWR id: to get all notifications associated
with a given SWR (SWR.getNotifications()).
- Delete all data for an origin: clearing browsing data for a
given origin.
- Delete all data for a SWR id: to remove notifications when a service
worker registration gets dropped.
Actual integration with these features will be done in separate patches,
this patch just introduces the primitives in the database.
Design document:
http://goo.gl/TciXVp
BUG=447628
Review URL: https://codereview.chromium.org/1019073002
Cr-Commit-Position: refs/heads/master@{#321399}
Diffstat (limited to 'content/browser/notifications/notification_database_unittest.cc')
-rw-r--r-- | content/browser/notifications/notification_database_unittest.cc | 205 |
1 files changed, 182 insertions, 23 deletions
diff --git a/content/browser/notifications/notification_database_unittest.cc b/content/browser/notifications/notification_database_unittest.cc index 2f6f207..207b238 100644 --- a/content/browser/notifications/notification_database_unittest.cc +++ b/content/browser/notifications/notification_database_unittest.cc @@ -16,6 +16,21 @@ namespace content { +const int kExampleServiceWorkerRegistrationId = 42; + +const struct { + const char* origin; + int64_t service_worker_registration_id; +} kExampleNotificationData[] = { + { "https://example.com", 0 }, + { "https://example.com", kExampleServiceWorkerRegistrationId }, + { "https://example.com", kExampleServiceWorkerRegistrationId }, + { "https://example.com", kExampleServiceWorkerRegistrationId + 1 }, + { "https://chrome.com", 0 }, + { "https://chrome.com", 0 }, + { "https://chrome.com", kExampleServiceWorkerRegistrationId } +}; + class NotificationDatabaseTest : public ::testing::Test { protected: // Creates a new NotificationDatabase instance in memory. @@ -29,6 +44,37 @@ class NotificationDatabaseTest : public ::testing::Test { return new NotificationDatabase(path); } + // Creates a new notification for |service_worker_registration_id| belonging + // to |origin| and writes it to the database. The written notification id + // will be stored in |notification_id|. + void CreateAndWriteNotification(NotificationDatabase* database, + const GURL& origin, + int64_t service_worker_registration_id, + int64_t* notification_id) { + NotificationDatabaseData database_data; + database_data.origin = origin; + database_data.service_worker_registration_id = + service_worker_registration_id; + + ASSERT_EQ(NotificationDatabase::STATUS_OK, + database->WriteNotificationData(origin, + database_data, + notification_id)); + } + + // Populates |database| with a series of example notifications that differ in + // their origin and Service Worker registration id. + void PopulateDatabaseWithExampleData(NotificationDatabase* database) { + int64_t notification_id; + for (size_t i = 0; i < arraysize(kExampleNotificationData); ++i) { + ASSERT_NO_FATAL_FAILURE(CreateAndWriteNotification( + database, + GURL(kExampleNotificationData[i].origin), + kExampleNotificationData[i].service_worker_registration_id, + ¬ification_id)); + } + } + // Returns if |database| has been opened. bool IsDatabaseOpen(NotificationDatabase* database) { return database->IsOpen(); @@ -130,21 +176,16 @@ TEST_F(NotificationDatabaseTest, NotificationIdIncrements) { GURL origin("https://example.com"); - NotificationDatabaseData database_data; int64_t notification_id = 0; // Verify that getting two ids on the same database instance results in // incrementing values. Notification ids will start at 1. - ASSERT_EQ(NotificationDatabase::STATUS_OK, - database->WriteNotificationData(origin, - database_data, - ¬ification_id)); + ASSERT_NO_FATAL_FAILURE(CreateAndWriteNotification( + database.get(), origin, 0 /* sw_registration_id */, ¬ification_id)); EXPECT_EQ(notification_id, 1); - ASSERT_EQ(NotificationDatabase::STATUS_OK, - database->WriteNotificationData(origin, - database_data, - ¬ification_id)); + ASSERT_NO_FATAL_FAILURE(CreateAndWriteNotification( + database.get(), origin, 0 /* sw_registration_id */, ¬ification_id)); EXPECT_EQ(notification_id, 2); database.reset(CreateDatabaseOnFileSystem(database_dir.path())); @@ -153,10 +194,8 @@ TEST_F(NotificationDatabaseTest, NotificationIdIncrements) { // Verify that the next notification id was stored in the database, and // continues where we expect it to be, even after closing and opening it. - ASSERT_EQ(NotificationDatabase::STATUS_OK, - database->WriteNotificationData(origin, - database_data, - ¬ification_id)); + ASSERT_NO_FATAL_FAILURE(CreateAndWriteNotification( + database.get(), origin, 0 /* sw_registration_id */, ¬ification_id)); EXPECT_EQ(notification_id, 3); } @@ -305,23 +344,19 @@ TEST_F(NotificationDatabaseTest, ReadWriteMultipleNotificationData) { ASSERT_EQ(NotificationDatabase::STATUS_OK, database->Open(true /* create_if_missing */)); - NotificationDatabaseData database_data; GURL origin("https://example.com"); + int64_t notification_id = 0; // Write ten notifications to the database, each with a unique title and // notification id (it is the responsibility of the user to increment this). for (int i = 1; i <= 10; ++i) { - database_data.notification_id = i; - database_data.notification_data.title = base::IntToString16(i); - - int64_t notification_id = 0; - ASSERT_EQ(NotificationDatabase::STATUS_OK, - database->WriteNotificationData(origin, - database_data, - ¬ification_id)); + ASSERT_NO_FATAL_FAILURE(CreateAndWriteNotification( + database.get(), origin, i /* sw_registration_id */, ¬ification_id)); EXPECT_EQ(notification_id, i); } + NotificationDatabaseData database_data; + // Read the ten notifications from the database, and verify that the titles // of each of them matches with how they were created. for (int i = 1; i <= 10; ++i) { @@ -330,7 +365,7 @@ TEST_F(NotificationDatabaseTest, ReadWriteMultipleNotificationData) { origin, &database_data)); - EXPECT_EQ(base::IntToString16(i), database_data.notification_data.title); + EXPECT_EQ(i, database_data.service_worker_registration_id); } } @@ -405,4 +440,128 @@ TEST_F(NotificationDatabaseTest, DeleteNotificationDataDifferentOrigin) { &database_data)); } +TEST_F(NotificationDatabaseTest, ReadAllNotificationData) { + scoped_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); + ASSERT_EQ(NotificationDatabase::STATUS_OK, + database->Open(true /* create_if_missing */)); + + ASSERT_NO_FATAL_FAILURE(PopulateDatabaseWithExampleData(database.get())); + + std::vector<NotificationDatabaseData> notifications; + ASSERT_EQ(NotificationDatabase::STATUS_OK, + database->ReadAllNotificationData(¬ifications)); + + EXPECT_EQ(arraysize(kExampleNotificationData), notifications.size()); +} + +TEST_F(NotificationDatabaseTest, ReadAllNotificationDataEmpty) { + scoped_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); + ASSERT_EQ(NotificationDatabase::STATUS_OK, + database->Open(true /* create_if_missing */)); + + std::vector<NotificationDatabaseData> notifications; + ASSERT_EQ(NotificationDatabase::STATUS_OK, + database->ReadAllNotificationData(¬ifications)); + + EXPECT_EQ(0u, notifications.size()); +} + +TEST_F(NotificationDatabaseTest, ReadAllNotificationDataForOrigin) { + scoped_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); + ASSERT_EQ(NotificationDatabase::STATUS_OK, + database->Open(true /* create_if_missing */)); + + ASSERT_NO_FATAL_FAILURE(PopulateDatabaseWithExampleData(database.get())); + + GURL origin("https://example.com"); + + std::vector<NotificationDatabaseData> notifications; + ASSERT_EQ(NotificationDatabase::STATUS_OK, + database->ReadAllNotificationDataForOrigin(origin, ¬ifications)); + + EXPECT_EQ(4u, notifications.size()); +} + +TEST_F(NotificationDatabaseTest, + ReadAllNotificationDataForServiceWorkerRegistration) { + scoped_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); + ASSERT_EQ(NotificationDatabase::STATUS_OK, + database->Open(true /* create_if_missing */)); + + ASSERT_NO_FATAL_FAILURE(PopulateDatabaseWithExampleData(database.get())); + + GURL origin("https://example.com:443"); + + std::vector<NotificationDatabaseData> notifications; + ASSERT_EQ(NotificationDatabase::STATUS_OK, + database->ReadAllNotificationDataForServiceWorkerRegistration( + origin, kExampleServiceWorkerRegistrationId, ¬ifications)); + + EXPECT_EQ(2u, notifications.size()); +} + +TEST_F(NotificationDatabaseTest, DeleteAllNotificationDataForOrigin) { + scoped_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); + ASSERT_EQ(NotificationDatabase::STATUS_OK, + database->Open(true /* create_if_missing */)); + + ASSERT_NO_FATAL_FAILURE(PopulateDatabaseWithExampleData(database.get())); + + GURL origin("https://example.com:443"); + + std::set<int64_t> deleted_notification_set; + ASSERT_EQ(NotificationDatabase::STATUS_OK, + database->DeleteAllNotificationDataForOrigin( + origin, &deleted_notification_set)); + + EXPECT_EQ(4u, deleted_notification_set.size()); + + std::vector<NotificationDatabaseData> notifications; + ASSERT_EQ(NotificationDatabase::STATUS_OK, + database->ReadAllNotificationDataForOrigin(origin, ¬ifications)); + + EXPECT_EQ(0u, notifications.size()); +} + +TEST_F(NotificationDatabaseTest, DeleteAllNotificationDataForOriginEmpty) { + scoped_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); + ASSERT_EQ(NotificationDatabase::STATUS_OK, + database->Open(true /* create_if_missing */)); + + GURL origin("https://example.com"); + + std::set<int64_t> deleted_notification_set; + ASSERT_EQ(NotificationDatabase::STATUS_OK, + database->DeleteAllNotificationDataForOrigin( + origin, &deleted_notification_set)); + + EXPECT_EQ(0u, deleted_notification_set.size()); +} + +TEST_F(NotificationDatabaseTest, + DeleteAllNotificationDataForServiceWorkerRegistration) { + scoped_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); + ASSERT_EQ(NotificationDatabase::STATUS_OK, + database->Open(true /* create_if_missing */)); + + ASSERT_NO_FATAL_FAILURE(PopulateDatabaseWithExampleData(database.get())); + + GURL origin("https://example.com:443"); + std::set<int64_t> deleted_notification_set; + ASSERT_EQ(NotificationDatabase::STATUS_OK, + database->DeleteAllNotificationDataForServiceWorkerRegistration( + origin, + kExampleServiceWorkerRegistrationId, + &deleted_notification_set)); + + EXPECT_EQ(2u, deleted_notification_set.size()); + + std::vector<NotificationDatabaseData> notifications; + ASSERT_EQ(NotificationDatabase::STATUS_OK, + database->ReadAllNotificationDataForServiceWorkerRegistration( + origin, kExampleServiceWorkerRegistrationId, ¬ifications)); + + EXPECT_EQ(0u, notifications.size()); +} + } // namespace content |