Index: content/browser/notifications/notification_database_unittest.cc |
diff --git a/content/browser/notifications/notification_database_unittest.cc b/content/browser/notifications/notification_database_unittest.cc |
index 35ea1a38ee19ae6251687d89fa8849b14696d33b..54e1bacbbeaa8a91b4ebe4e70d683f025075aeef 100644 |
--- a/content/browser/notifications/notification_database_unittest.cc |
+++ b/content/browser/notifications/notification_database_unittest.cc |
@@ -5,9 +5,14 @@ |
#include "content/browser/notifications/notification_database.h" |
#include "base/files/scoped_temp_dir.h" |
+#include "base/strings/string_number_conversions.h" |
+#include "base/strings/utf_string_conversions.h" |
+#include "content/browser/notifications/notification_database_data.h" |
+#include "content/public/common/platform_notification_data.h" |
#include "testing/gtest/include/gtest/gtest.h" |
#include "third_party/leveldatabase/src/include/leveldb/db.h" |
#include "third_party/leveldatabase/src/include/leveldb/write_batch.h" |
+#include "url/gurl.h" |
namespace content { |
@@ -43,25 +48,6 @@ class NotificationDatabaseTest : public ::testing::Test { |
database->GetDBForTesting()->Put(leveldb::WriteOptions(), key, value); |
ASSERT_TRUE(status.ok()); |
} |
- |
- // Increments the next notification id value in the database. Normally this |
- // is managed by the NotificationDatabase when writing notification data. |
- // |
- // TODO(peter): Stop doing this manually when writing notification data will |
- // do this for us, except for tests verifying corruption behavior. |
- void IncrementNextNotificationId(NotificationDatabase* database) { |
- int64_t next_notification_id; |
- ASSERT_EQ(NotificationDatabase::STATUS_OK, |
- database->GetNextNotificationId(&next_notification_id)); |
- |
- leveldb::WriteBatch batch; |
- database->WriteNextNotificationId(&batch, next_notification_id + 1); |
- |
- leveldb::Status status = |
- database->GetDBForTesting()->Write(leveldb::WriteOptions(), &batch); |
- |
- ASSERT_TRUE(status.ok()); |
- } |
}; |
TEST_F(NotificationDatabaseTest, OpenCloseMemory) { |
@@ -142,6 +128,9 @@ TEST_F(NotificationDatabaseTest, GetNextNotificationIdIncrements) { |
ASSERT_EQ(NotificationDatabase::STATUS_OK, |
database->Open(true /* create_if_missing */)); |
+ 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 |
@@ -150,13 +139,19 @@ TEST_F(NotificationDatabaseTest, GetNextNotificationIdIncrements) { |
database->GetNextNotificationId(¬ification_id)); |
EXPECT_EQ(1, notification_id); |
- ASSERT_NO_FATAL_FAILURE(IncrementNextNotificationId(database.get())); |
+ ASSERT_EQ(NotificationDatabase::STATUS_OK, |
+ database->WriteNotificationData(notification_id, |
+ origin, |
+ database_data)); |
ASSERT_EQ(NotificationDatabase::STATUS_OK, |
database->GetNextNotificationId(¬ification_id)); |
EXPECT_EQ(2, notification_id); |
- ASSERT_NO_FATAL_FAILURE(IncrementNextNotificationId(database.get())); |
+ ASSERT_EQ(NotificationDatabase::STATUS_OK, |
+ database->WriteNotificationData(notification_id, |
+ origin, |
+ database_data)); |
database.reset(CreateDatabaseOnFileSystem(database_dir.path())); |
ASSERT_EQ(NotificationDatabase::STATUS_OK, |
@@ -191,4 +186,224 @@ TEST_F(NotificationDatabaseTest, GetNextNotificationIdCorruption) { |
database->GetNextNotificationId(¬ification_id)); |
} |
+TEST_F(NotificationDatabaseTest, ReadInvalidNotificationData) { |
+ scoped_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); |
+ ASSERT_EQ(NotificationDatabase::STATUS_OK, |
+ database->Open(true /* create_if_missing */)); |
+ |
+ NotificationDatabaseData database_data; |
+ |
+ // Reading the notification data for a notification that does not exist should |
+ // return the ERROR_NOT_FOUND status code. |
+ EXPECT_EQ(NotificationDatabase::STATUS_ERROR_NOT_FOUND, |
+ database->ReadNotificationData(9001, |
+ GURL("https://chrome.com"), |
+ &database_data)); |
+} |
+ |
+TEST_F(NotificationDatabaseTest, ReadNotificationDataDifferentOrigin) { |
+ scoped_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); |
+ ASSERT_EQ(NotificationDatabase::STATUS_OK, |
+ database->Open(true /* create_if_missing */)); |
+ |
+ int64_t notification_id = 0; |
+ ASSERT_EQ(NotificationDatabase::STATUS_OK, |
+ database->GetNextNotificationId(¬ification_id)); |
+ |
+ GURL origin("https://example.com"); |
+ |
+ NotificationDatabaseData database_data, read_database_data; |
+ database_data.notification_data.title = base::UTF8ToUTF16("My Notification"); |
+ |
+ ASSERT_EQ(NotificationDatabase::STATUS_OK, |
+ database->WriteNotificationData(notification_id, |
+ origin, |
+ database_data)); |
+ |
+ // Reading the notification from the database when given a different origin |
+ // should return the ERROR_NOT_FOUND status code. |
+ EXPECT_EQ(NotificationDatabase::STATUS_ERROR_NOT_FOUND, |
+ database->ReadNotificationData(notification_id, |
+ GURL("https://chrome.com"), |
+ &read_database_data)); |
+ |
+ // However, reading the notification from the database with the same origin |
+ // should return STATUS_OK and the associated notification data. |
+ ASSERT_EQ(NotificationDatabase::STATUS_OK, |
+ database->ReadNotificationData(notification_id, |
+ origin, |
+ &read_database_data)); |
+ |
+ EXPECT_EQ(database_data.notification_data.title, |
+ read_database_data.notification_data.title); |
+} |
+ |
+TEST_F(NotificationDatabaseTest, ReadNotificationDataReflection) { |
+ scoped_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); |
+ ASSERT_EQ(NotificationDatabase::STATUS_OK, |
+ database->Open(true /* create_if_missing */)); |
+ |
+ int64_t notification_id = 0; |
+ ASSERT_EQ(NotificationDatabase::STATUS_OK, |
+ database->GetNextNotificationId(¬ification_id)); |
+ |
+ GURL origin("https://example.com"); |
+ |
+ PlatformNotificationData notification_data; |
+ notification_data.title = base::UTF8ToUTF16("My Notification"); |
+ notification_data.direction = |
+ PlatformNotificationData::NotificationDirectionRightToLeft; |
+ notification_data.lang = "nl-NL"; |
+ notification_data.body = base::UTF8ToUTF16("Hello, world!"); |
+ notification_data.tag = "replace id"; |
+ notification_data.icon = GURL("https://example.com/icon.png"); |
+ notification_data.silent = true; |
+ |
+ NotificationDatabaseData database_data; |
+ database_data.notification_id = notification_id; |
+ database_data.origin = origin; |
+ database_data.service_worker_registration_id = 42; |
+ database_data.notification_data = notification_data; |
+ |
+ // Write the constructed notification to the database, and then immediately |
+ // read it back from the database again as well. |
+ ASSERT_EQ(NotificationDatabase::STATUS_OK, |
+ database->WriteNotificationData(notification_id, |
+ origin, |
+ database_data)); |
+ |
+ NotificationDatabaseData read_database_data; |
+ ASSERT_EQ(NotificationDatabase::STATUS_OK, |
+ database->ReadNotificationData(notification_id, |
+ origin, |
+ &read_database_data)); |
+ |
+ // Verify that all members retrieved from the database are exactly the same |
+ // as the ones that were written to it. This tests the serialization behavior. |
+ |
+ EXPECT_EQ(database_data.notification_id, read_database_data.notification_id); |
+ EXPECT_EQ(database_data.origin, read_database_data.origin); |
+ EXPECT_EQ(database_data.service_worker_registration_id, |
+ read_database_data.service_worker_registration_id); |
+ |
+ const PlatformNotificationData& read_notification_data = |
+ read_database_data.notification_data; |
+ |
+ EXPECT_EQ(notification_data.title, read_notification_data.title); |
+ EXPECT_EQ(notification_data.direction, read_notification_data.direction); |
+ EXPECT_EQ(notification_data.lang, read_notification_data.lang); |
+ EXPECT_EQ(notification_data.body, read_notification_data.body); |
+ EXPECT_EQ(notification_data.tag, read_notification_data.tag); |
+ EXPECT_EQ(notification_data.icon, read_notification_data.icon); |
+ EXPECT_EQ(notification_data.silent, read_notification_data.silent); |
+} |
+ |
+TEST_F(NotificationDatabaseTest, ReadWriteMultipleNotificationData) { |
+ scoped_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); |
+ ASSERT_EQ(NotificationDatabase::STATUS_OK, |
+ database->Open(true /* create_if_missing */)); |
+ |
+ int64_t notification_id = 0; |
+ ASSERT_EQ(NotificationDatabase::STATUS_OK, |
+ database->GetNextNotificationId(¬ification_id)); |
+ |
+ NotificationDatabaseData database_data; |
+ GURL origin("https://example.com"); |
+ |
+ // 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 = 0; i < 10; ++i) { |
+ database_data.notification_id = notification_id + i; |
+ database_data.notification_data.title = base::IntToString16(i); |
+ |
+ ASSERT_EQ(NotificationDatabase::STATUS_OK, |
+ database->WriteNotificationData(notification_id + i, |
+ origin, |
+ 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 = 0; i < 10; ++i) { |
+ ASSERT_EQ(NotificationDatabase::STATUS_OK, |
+ database->ReadNotificationData(notification_id + i, |
+ origin, |
+ &database_data)); |
+ |
+ EXPECT_EQ(base::IntToString16(i), database_data.notification_data.title); |
+ } |
+} |
+ |
+TEST_F(NotificationDatabaseTest, DeleteInvalidNotificationData) { |
+ scoped_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); |
+ ASSERT_EQ(NotificationDatabase::STATUS_OK, |
+ database->Open(true /* create_if_missing */)); |
+ |
+ // Deleting non-existing notifications should return an error status. |
+ ASSERT_EQ(NotificationDatabase::STATUS_ERROR_NOT_FOUND, |
+ database->DeleteNotificationData(9001, |
+ GURL("https://chrome.com"))); |
+} |
+ |
+TEST_F(NotificationDatabaseTest, DeleteNotificationDataSameOrigin) { |
+ scoped_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); |
+ ASSERT_EQ(NotificationDatabase::STATUS_OK, |
+ database->Open(true /* create_if_missing */)); |
+ |
+ int64_t notification_id = 0; |
+ ASSERT_EQ(NotificationDatabase::STATUS_OK, |
+ database->GetNextNotificationId(¬ification_id)); |
+ |
+ NotificationDatabaseData database_data; |
+ database_data.notification_id = notification_id; |
+ |
+ GURL origin("https://example.com"); |
+ |
+ ASSERT_EQ(NotificationDatabase::STATUS_OK, |
+ database->WriteNotificationData(notification_id, |
+ origin, |
+ database_data)); |
+ |
+ // Reading a notification after writing one should succeed. |
+ EXPECT_EQ(NotificationDatabase::STATUS_OK, |
+ database->ReadNotificationData(notification_id, |
+ origin, |
+ &database_data)); |
+ |
+ // Delete the notification which was just written to the database, and verify |
+ // that reading it again will fail. |
+ EXPECT_EQ(NotificationDatabase::STATUS_OK, |
+ database->DeleteNotificationData(notification_id, origin)); |
+ EXPECT_EQ(NotificationDatabase::STATUS_ERROR_NOT_FOUND, |
+ database->ReadNotificationData(notification_id, |
+ origin, |
+ &database_data)); |
+} |
+ |
+TEST_F(NotificationDatabaseTest, DeleteNotificationDataDifferentOrigin) { |
+ scoped_ptr<NotificationDatabase> database(CreateDatabaseInMemory()); |
+ ASSERT_EQ(NotificationDatabase::STATUS_OK, |
+ database->Open(true /* create_if_missing */)); |
+ |
+ int64_t notification_id = 0; |
+ ASSERT_EQ(NotificationDatabase::STATUS_OK, |
+ database->GetNextNotificationId(¬ification_id)); |
+ |
+ NotificationDatabaseData database_data; |
+ database_data.notification_id = notification_id; |
+ |
+ GURL origin("https://example.com"); |
+ |
+ ASSERT_EQ(NotificationDatabase::STATUS_OK, |
+ database->WriteNotificationData(notification_id, |
+ origin, |
+ database_data)); |
+ |
+ // Attempting to delete the database with a different origin, but with the |
+ // same |notification_id|, should return a not found error status code. |
+ EXPECT_EQ(NotificationDatabase::STATUS_ERROR_NOT_FOUND, |
+ database->DeleteNotificationData(notification_id, |
+ GURL("https://chrome.com"))); |
+} |
+ |
} // namespace content |