| 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
|
|
|