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 f02e0679c9e62c4695d7581b64bef6f1c1125ede..52d94c85700f8611238fef4bdfe8d05947fd1cb0 100644 |
--- a/content/browser/notifications/notification_database_unittest.cc |
+++ b/content/browser/notifications/notification_database_unittest.cc |
@@ -8,6 +8,7 @@ |
#include <stdint.h> |
#include "base/files/scoped_temp_dir.h" |
+#include "base/guid.h" |
#include "base/macros.h" |
#include "base/strings/string_number_conversions.h" |
#include "base/strings/utf_string_conversions.h" |
@@ -56,22 +57,26 @@ class NotificationDatabaseTest : public ::testing::Test { |
const GURL& origin, |
const std::string& tag, |
int64_t service_worker_registration_id, |
- int64_t* notification_id) { |
+ std::string* notification_id) { |
+ DCHECK(notification_id); |
+ |
NotificationDatabaseData database_data; |
+ database_data.notification_id = GenerateNotificationId(); |
database_data.origin = origin; |
database_data.service_worker_registration_id = |
service_worker_registration_id; |
database_data.notification_data.tag = tag; |
ASSERT_EQ(NotificationDatabase::STATUS_OK, |
- database->WriteNotificationData(origin, database_data, |
- notification_id)); |
+ database->WriteNotificationData(origin, database_data)); |
+ |
+ *notification_id = 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; |
+ std::string notification_id; |
for (size_t i = 0; i < arraysize(kExampleNotificationData); ++i) { |
ASSERT_NO_FATAL_FAILURE(CreateAndWriteNotification( |
database, GURL(kExampleNotificationData[i].origin), |
@@ -100,6 +105,9 @@ class NotificationDatabaseTest : public ::testing::Test { |
database->GetDBForTesting()->Put(leveldb::WriteOptions(), key, value); |
ASSERT_TRUE(status.ok()); |
} |
+ |
+ // Generates a random notification ID. The format of the ID is opaque. |
+ std::string GenerateNotificationId() { return base::GenerateGUID(); } |
}; |
TEST_F(NotificationDatabaseTest, OpenCloseMemory) { |
@@ -180,32 +188,24 @@ TEST_F(NotificationDatabaseTest, NotificationIdIncrements) { |
ASSERT_EQ(NotificationDatabase::STATUS_OK, |
database->Open(true /* create_if_missing */)); |
- GURL origin("https://example.com"); |
+ EXPECT_EQ(database->GetNextPersistentNotificationId(), 1); |
+ EXPECT_EQ(database->GetNextPersistentNotificationId(), 2); |
+ EXPECT_EQ(database->GetNextPersistentNotificationId(), 3); |
- 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_NO_FATAL_FAILURE( |
- CreateAndWriteNotification(database.get(), origin, "" /* tag */, |
- 0 /* sw_registration_id */, ¬ification_id)); |
- EXPECT_EQ(notification_id, 1); |
+ GURL origin("https://example.com"); |
+ std::string notification_id; |
ASSERT_NO_FATAL_FAILURE( |
CreateAndWriteNotification(database.get(), origin, "" /* tag */, |
0 /* sw_registration_id */, ¬ification_id)); |
- EXPECT_EQ(notification_id, 2); |
database.reset(CreateDatabaseOnFileSystem(database_dir.path())); |
ASSERT_EQ(NotificationDatabase::STATUS_OK, |
database->Open(false /* create_if_missing */)); |
- // 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_NO_FATAL_FAILURE( |
- CreateAndWriteNotification(database.get(), origin, "" /* tag */, |
- 0 /* sw_registration_id */, ¬ification_id)); |
- EXPECT_EQ(notification_id, 3); |
+ // Verify that the next persistent notification id was stored in the database, |
+ // and continues where we expect it to be, even after closing and opening it. |
+ EXPECT_EQ(database->GetNextPersistentNotificationId(), 4); |
} |
TEST_F(NotificationDatabaseTest, NotificationIdIncrementsStorage) { |
@@ -215,19 +215,17 @@ TEST_F(NotificationDatabaseTest, NotificationIdIncrementsStorage) { |
GURL origin("https://example.com"); |
- NotificationDatabaseData database_data; |
- database_data.notification_id = -1; |
+ NotificationDatabaseData database_data, read_database_data; |
+ database_data.notification_id = GenerateNotificationId(); |
- int64_t notification_id = 0; |
- ASSERT_EQ( |
- NotificationDatabase::STATUS_OK, |
- database->WriteNotificationData(origin, database_data, ¬ification_id)); |
+ ASSERT_EQ(NotificationDatabase::STATUS_OK, |
+ database->WriteNotificationData(origin, database_data)); |
- ASSERT_EQ( |
- NotificationDatabase::STATUS_OK, |
- database->ReadNotificationData(notification_id, origin, &database_data)); |
+ ASSERT_EQ(NotificationDatabase::STATUS_OK, |
+ database->ReadNotificationData(database_data.notification_id, |
+ origin, &read_database_data)); |
- EXPECT_EQ(notification_id, database_data.notification_id); |
+ EXPECT_EQ(database_data.notification_id, read_database_data.notification_id); |
} |
TEST_F(NotificationDatabaseTest, NotificationIdCorruption) { |
@@ -243,12 +241,10 @@ TEST_F(NotificationDatabaseTest, NotificationIdCorruption) { |
GURL origin("https://example.com"); |
NotificationDatabaseData database_data; |
- int64_t notification_id = 0; |
+ database_data.notification_id = GenerateNotificationId(); |
- ASSERT_EQ( |
- NotificationDatabase::STATUS_OK, |
- database->WriteNotificationData(origin, database_data, ¬ification_id)); |
- EXPECT_EQ(notification_id, 1); |
+ ASSERT_EQ(NotificationDatabase::STATUS_OK, |
+ database->WriteNotificationData(origin, database_data)); |
// Deliberately write an invalid value as the next notification id. When |
// re-opening the database, the Open() method should realize that an invalid |
@@ -271,7 +267,7 @@ TEST_F(NotificationDatabaseTest, ReadInvalidNotificationData) { |
// 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->ReadNotificationData("bad-id", GURL("https://chrome.com"), |
&database_data)); |
} |
@@ -280,28 +276,27 @@ TEST_F(NotificationDatabaseTest, ReadNotificationDataDifferentOrigin) { |
ASSERT_EQ(NotificationDatabase::STATUS_OK, |
database->Open(true /* create_if_missing */)); |
- int64_t notification_id = 0; |
GURL origin("https://example.com"); |
NotificationDatabaseData database_data, read_database_data; |
+ database_data.notification_id = GenerateNotificationId(); |
database_data.notification_data.title = base::UTF8ToUTF16("My Notification"); |
- ASSERT_EQ( |
- NotificationDatabase::STATUS_OK, |
- database->WriteNotificationData(origin, database_data, ¬ification_id)); |
+ ASSERT_EQ(NotificationDatabase::STATUS_OK, |
+ database->WriteNotificationData(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)); |
+ EXPECT_EQ(NotificationDatabase::STATUS_ERROR_NOT_FOUND, |
+ database->ReadNotificationData(database_data.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)); |
+ database->ReadNotificationData(database_data.notification_id, |
+ origin, &read_database_data)); |
EXPECT_EQ(database_data.notification_data.title, |
read_database_data.notification_data.title); |
@@ -312,8 +307,6 @@ TEST_F(NotificationDatabaseTest, ReadNotificationDataReflection) { |
ASSERT_EQ(NotificationDatabase::STATUS_OK, |
database->Open(true /* create_if_missing */)); |
- int64_t notification_id = 0; |
- |
GURL origin("https://example.com"); |
PlatformNotificationData notification_data; |
@@ -327,26 +320,25 @@ TEST_F(NotificationDatabaseTest, ReadNotificationDataReflection) { |
notification_data.silent = true; |
NotificationDatabaseData database_data; |
- database_data.notification_id = notification_id; |
+ database_data.notification_id = GenerateNotificationId(); |
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(origin, database_data, ¬ification_id)); |
+ ASSERT_EQ(NotificationDatabase::STATUS_OK, |
+ database->WriteNotificationData(origin, database_data)); |
NotificationDatabaseData read_database_data; |
ASSERT_EQ(NotificationDatabase::STATUS_OK, |
- database->ReadNotificationData(notification_id, origin, |
- &read_database_data)); |
+ database->ReadNotificationData(database_data.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(notification_id, read_database_data.notification_id); |
+ 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, |
@@ -370,7 +362,9 @@ TEST_F(NotificationDatabaseTest, ReadWriteMultipleNotificationData) { |
database->Open(true /* create_if_missing */)); |
GURL origin("https://example.com"); |
- int64_t notification_id = 0; |
+ |
+ std::vector<std::string> notification_ids; |
+ std::string notification_id; |
// Write ten notifications to the database, each with a unique title and |
// notification id (it is the responsibility of the user to increment this). |
@@ -378,19 +372,25 @@ TEST_F(NotificationDatabaseTest, ReadWriteMultipleNotificationData) { |
ASSERT_NO_FATAL_FAILURE(CreateAndWriteNotification( |
database.get(), origin, "" /* tag */, i /* sw_registration_id */, |
¬ification_id)); |
- EXPECT_EQ(notification_id, i); |
+ |
+ EXPECT_FALSE(notification_id.empty()); |
+ |
+ notification_ids.push_back(notification_id); |
} |
NotificationDatabaseData database_data; |
+ int64_t service_worker_registration_id = 1; |
+ |
// 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) { |
+ for (const std::string& notification_id : notification_ids) { |
ASSERT_EQ(NotificationDatabase::STATUS_OK, |
- database->ReadNotificationData(i /* notification_id */, origin, |
+ database->ReadNotificationData(notification_id, origin, |
&database_data)); |
- EXPECT_EQ(i, database_data.service_worker_registration_id); |
+ EXPECT_EQ(service_worker_registration_id++, |
+ database_data.service_worker_registration_id); |
} |
} |
@@ -400,8 +400,9 @@ TEST_F(NotificationDatabaseTest, DeleteInvalidNotificationData) { |
database->Open(true /* create_if_missing */)); |
// Deleting non-existing notifications is not considered to be a failure. |
- ASSERT_EQ(NotificationDatabase::STATUS_OK, |
- database->DeleteNotificationData(9001, GURL("https://chrome.com"))); |
+ ASSERT_EQ( |
+ NotificationDatabase::STATUS_OK, |
+ database->DeleteNotificationData("bad-id", GURL("https://chrome.com"))); |
} |
TEST_F(NotificationDatabaseTest, DeleteNotificationDataSameOrigin) { |
@@ -409,14 +410,15 @@ TEST_F(NotificationDatabaseTest, DeleteNotificationDataSameOrigin) { |
ASSERT_EQ(NotificationDatabase::STATUS_OK, |
database->Open(true /* create_if_missing */)); |
- int64_t notification_id = 0; |
+ const std::string notification_id = GenerateNotificationId(); |
NotificationDatabaseData database_data; |
+ database_data.notification_id = notification_id; |
+ |
GURL origin("https://example.com"); |
- ASSERT_EQ( |
- NotificationDatabase::STATUS_OK, |
- database->WriteNotificationData(origin, database_data, ¬ification_id)); |
+ ASSERT_EQ(NotificationDatabase::STATUS_OK, |
+ database->WriteNotificationData(origin, database_data)); |
// Reading a notification after writing one should succeed. |
EXPECT_EQ( |
@@ -437,14 +439,15 @@ TEST_F(NotificationDatabaseTest, DeleteNotificationDataDifferentOrigin) { |
ASSERT_EQ(NotificationDatabase::STATUS_OK, |
database->Open(true /* create_if_missing */)); |
- int64_t notification_id = 0; |
+ const std::string notification_id = GenerateNotificationId(); |
NotificationDatabaseData database_data; |
+ database_data.notification_id = notification_id; |
+ |
GURL origin("https://example.com"); |
- ASSERT_EQ( |
- NotificationDatabase::STATUS_OK, |
- database->WriteNotificationData(origin, database_data, ¬ification_id)); |
+ ASSERT_EQ(NotificationDatabase::STATUS_OK, |
+ database->WriteNotificationData(origin, database_data)); |
// Attempting to delete the notification with a different origin, but with the |
// same |notification_id|, should not return an error (the notification could |
@@ -528,12 +531,12 @@ TEST_F(NotificationDatabaseTest, DeleteAllNotificationDataForOrigin) { |
GURL origin("https://example.com:443"); |
- std::set<int64_t> deleted_notification_set; |
+ std::set<std::string> deleted_notification_ids; |
ASSERT_EQ(NotificationDatabase::STATUS_OK, |
database->DeleteAllNotificationDataForOrigin( |
- origin, "" /* tag */, &deleted_notification_set)); |
+ origin, "" /* tag */, &deleted_notification_ids)); |
- EXPECT_EQ(4u, deleted_notification_set.size()); |
+ EXPECT_EQ(4u, deleted_notification_ids.size()); |
std::vector<NotificationDatabaseData> notifications; |
ASSERT_EQ(NotificationDatabase::STATUS_OK, |
@@ -570,12 +573,12 @@ TEST_F(NotificationDatabaseTest, DeleteAllNotificationDataForOriginWithTag) { |
ASSERT_GT(notifications_with_tag, 0u); |
ASSERT_GT(notifications_without_tag, 0u); |
- std::set<int64_t> deleted_notification_set; |
+ std::set<std::string> deleted_notification_ids; |
ASSERT_EQ(NotificationDatabase::STATUS_OK, |
database->DeleteAllNotificationDataForOrigin( |
- origin, "foo" /* tag */, &deleted_notification_set)); |
+ origin, "foo" /* tag */, &deleted_notification_ids)); |
- EXPECT_EQ(notifications_with_tag, deleted_notification_set.size()); |
+ EXPECT_EQ(notifications_with_tag, deleted_notification_ids.size()); |
std::vector<NotificationDatabaseData> updated_notifications; |
ASSERT_EQ(NotificationDatabase::STATUS_OK, |
@@ -605,12 +608,12 @@ TEST_F(NotificationDatabaseTest, DeleteAllNotificationDataForOriginEmpty) { |
GURL origin("https://example.com"); |
- std::set<int64_t> deleted_notification_set; |
+ std::set<std::string> deleted_notification_ids; |
ASSERT_EQ(NotificationDatabase::STATUS_OK, |
database->DeleteAllNotificationDataForOrigin( |
- origin, "" /* tag */, &deleted_notification_set)); |
+ origin, "" /* tag */, &deleted_notification_ids)); |
- EXPECT_EQ(0u, deleted_notification_set.size()); |
+ EXPECT_EQ(0u, deleted_notification_ids.size()); |
} |
TEST_F(NotificationDatabaseTest, |
@@ -622,13 +625,13 @@ TEST_F(NotificationDatabaseTest, |
ASSERT_NO_FATAL_FAILURE(PopulateDatabaseWithExampleData(database.get())); |
GURL origin("https://example.com:443"); |
- std::set<int64_t> deleted_notification_set; |
+ std::set<std::string> deleted_notification_ids; |
ASSERT_EQ(NotificationDatabase::STATUS_OK, |
database->DeleteAllNotificationDataForServiceWorkerRegistration( |
origin, kExampleServiceWorkerRegistrationId, |
- &deleted_notification_set)); |
+ &deleted_notification_ids)); |
- EXPECT_EQ(2u, deleted_notification_set.size()); |
+ EXPECT_EQ(2u, deleted_notification_ids.size()); |
std::vector<NotificationDatabaseData> notifications; |
ASSERT_EQ(NotificationDatabase::STATUS_OK, |