Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(798)

Unified Diff: content/browser/notifications/notification_id_generator_unittest.cc

Issue 1133813002: Introduce the NotificationIdGenerator in //content. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: address comments Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/notifications/notification_id_generator.cc ('k') | content/content_browser.gypi » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/notifications/notification_id_generator_unittest.cc
diff --git a/content/browser/notifications/notification_id_generator_unittest.cc b/content/browser/notifications/notification_id_generator_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..c290b881790a74c4bbc281ee20d14280729582c2
--- /dev/null
+++ b/content/browser/notifications/notification_id_generator_unittest.cc
@@ -0,0 +1,338 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/strings/string_number_conversions.h"
+#include "content/browser/notifications/notification_id_generator.h"
+#include "content/public/test/test_browser_context.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "url/gurl.h"
+
+namespace content {
+namespace {
+
+const int kRenderProcessId = 42;
+const int64_t kPersistentNotificationId = 430;
+const int kNonPersistentNotificationId = 5400;
+const char kExampleTag[] = "example";
+
+class TestBrowserContextConfigurableIncognito : public TestBrowserContext {
+ public:
+ TestBrowserContextConfigurableIncognito() {}
+ ~TestBrowserContextConfigurableIncognito() override {}
+
+ void set_incognito(bool incognito) { incognito_ = incognito; }
+
+ // TestBrowserContext implementation.
+ bool IsOffTheRecord() const override { return incognito_; }
+
+ private:
+ bool incognito_ = false;
+
+ DISALLOW_COPY_AND_ASSIGN(TestBrowserContextConfigurableIncognito);
+};
+
+class NotificationIdGeneratorTest : public ::testing::Test {
+ public:
+ NotificationIdGeneratorTest()
+ : generator_(&browser_context_, kRenderProcessId) {}
+
+ void SetUp() override {
+
+ }
+
+ protected:
+ GURL origin() const { return GURL("https://example.com"); }
+
+ TestBrowserContextConfigurableIncognito* browser_context() {
+ return &browser_context_;
+ }
+
+ NotificationIdGenerator* generator() { return &generator_; }
+
+ private:
+ TestBrowserContextConfigurableIncognito browser_context_;
+ NotificationIdGenerator generator_;
+};
+
+// -----------------------------------------------------------------------------
+// Persistent and non-persistent notifications
+//
+// Tests that cover logic common to both persistent and non-persistent
+// notifications: different browser contexts, Incognito mode or not,
+
+// Two calls to the generator with exactly the same information should result
+// in exactly the same notification ids being generated.
+TEST_F(NotificationIdGeneratorTest, DeterministicGeneration) {
+ // Persistent notifications.
+ EXPECT_EQ(
+ generator()->GenerateForPersistentNotification(
+ origin(), kExampleTag, kPersistentNotificationId),
+ generator()->GenerateForPersistentNotification(
+ origin(), kExampleTag, kPersistentNotificationId));
+
+ EXPECT_EQ(
+ generator()->GenerateForPersistentNotification(
+ origin(), "" /* tag */, kPersistentNotificationId),
+ generator()->GenerateForPersistentNotification(
+ origin(), "" /* tag */, kPersistentNotificationId));
+
+ // Non-persistent notifications.
+ EXPECT_EQ(
+ generator()->GenerateForNonPersistentNotification(
+ origin(), kExampleTag, kNonPersistentNotificationId),
+ generator()->GenerateForNonPersistentNotification(
+ origin(), kExampleTag, kNonPersistentNotificationId));
+
+ EXPECT_EQ(
+ generator()->GenerateForNonPersistentNotification(
+ origin(), "" /* tag */, kNonPersistentNotificationId),
+ generator()->GenerateForNonPersistentNotification(
+ origin(), "" /* tag */, kNonPersistentNotificationId));
+}
+
+// Uniqueness of notification ids will be impacted by the browser context.
+TEST_F(NotificationIdGeneratorTest, DifferentBrowserContexts) {
+ TestBrowserContextConfigurableIncognito second_browser_context;
+ NotificationIdGenerator second_generator(&second_browser_context,
+ kRenderProcessId);
+
+ // Persistent notifications.
+ EXPECT_NE(
+ generator()->GenerateForPersistentNotification(
+ origin(), kExampleTag, kPersistentNotificationId),
+ second_generator.GenerateForPersistentNotification(
+ origin(), kExampleTag, kPersistentNotificationId));
+
+ EXPECT_NE(
+ generator()->GenerateForPersistentNotification(
+ origin(), "" /* tag */, kPersistentNotificationId),
+ second_generator.GenerateForPersistentNotification(
+ origin(), "" /* tag */, kPersistentNotificationId));
+
+ // Non-persistent notifications.
+ EXPECT_NE(
+ generator()->GenerateForNonPersistentNotification(
+ origin(), kExampleTag, kNonPersistentNotificationId),
+ second_generator.GenerateForNonPersistentNotification(
+ origin(), kExampleTag, kNonPersistentNotificationId));
+
+ EXPECT_NE(
+ generator()->GenerateForNonPersistentNotification(
+ origin(), "" /* tag */, kNonPersistentNotificationId),
+ second_generator.GenerateForNonPersistentNotification(
+ origin(), "" /* tag */, kNonPersistentNotificationId));
+}
+
+// Uniqueness of notification ids will be impacted by the fact whether the
+// browser context is in Incognito mode.
+TEST_F(NotificationIdGeneratorTest, DifferentIncognitoStates) {
+ ASSERT_FALSE(browser_context()->IsOffTheRecord());
+
+ // Persistent notifications.
+ std::string normal_persistent_notification_id =
+ generator()->GenerateForPersistentNotification(
+ origin(), kExampleTag, kPersistentNotificationId);
+
+ browser_context()->set_incognito(true);
+ ASSERT_TRUE(browser_context()->IsOffTheRecord());
+
+ std::string incognito_persistent_notification_id =
+ generator()->GenerateForPersistentNotification(
+ origin(), kExampleTag, kPersistentNotificationId);
+
+ EXPECT_NE(normal_persistent_notification_id,
+ incognito_persistent_notification_id);
+
+ browser_context()->set_incognito(false);
+
+ // Non-persistent notifications.
+ ASSERT_FALSE(browser_context()->IsOffTheRecord());
+
+ std::string normal_non_persistent_notification_id =
+ generator()->GenerateForNonPersistentNotification(
+ origin(), kExampleTag, kNonPersistentNotificationId);
+
+ browser_context()->set_incognito(true);
+ ASSERT_TRUE(browser_context()->IsOffTheRecord());
+
+ std::string incognito_non_persistent_notification_id =
+ generator()->GenerateForNonPersistentNotification(
+ origin(), kExampleTag, kNonPersistentNotificationId);
+
+ EXPECT_NE(normal_non_persistent_notification_id,
+ incognito_non_persistent_notification_id);
+}
+
+// The origin of the notification will impact the generated notification id.
+TEST_F(NotificationIdGeneratorTest, DifferentOrigins) {
+ GURL different_origin("https://example2.com");
+
+ // Persistent notifications.
+ EXPECT_NE(
+ generator()->GenerateForPersistentNotification(
+ origin(), kExampleTag, kPersistentNotificationId),
+ generator()->GenerateForPersistentNotification(
+ different_origin, kExampleTag, kPersistentNotificationId));
+
+ // Non-persistent notifications.
+ EXPECT_NE(
+ generator()->GenerateForNonPersistentNotification(
+ origin(), kExampleTag, kNonPersistentNotificationId),
+ generator()->GenerateForNonPersistentNotification(
+ different_origin, kExampleTag, kNonPersistentNotificationId));
+}
+
+// The tag, when non-empty, will impact the generated notification id.
+TEST_F(NotificationIdGeneratorTest, DifferentTags) {
+ const std::string& different_tag = std::string(kExampleTag) + "2";
+
+ // Persistent notifications.
+ EXPECT_NE(
+ generator()->GenerateForPersistentNotification(
+ origin(), kExampleTag, kPersistentNotificationId),
+ generator()->GenerateForPersistentNotification(
+ origin(), different_tag, kPersistentNotificationId));
+
+ // Non-persistent notifications.
+ EXPECT_NE(
+ generator()->GenerateForNonPersistentNotification(
+ origin(), kExampleTag, kNonPersistentNotificationId),
+ generator()->GenerateForNonPersistentNotification(
+ origin(), different_tag, kNonPersistentNotificationId));
+}
+
+// The persistent or non-persistent notification id will impact the generated
+// notification id when the tag is empty.
+TEST_F(NotificationIdGeneratorTest, DifferentIds) {
+ NotificationIdGenerator second_generator(browser_context(),
+ kRenderProcessId + 1);
+
+ // Persistent notifications.
+ EXPECT_NE(
+ generator()->GenerateForPersistentNotification(
+ origin(), "" /* tag */, kPersistentNotificationId),
+ generator()->GenerateForPersistentNotification(
+ origin(), "" /* tag */, kPersistentNotificationId + 1));
+
+ // Non-persistent notifications.
+ EXPECT_NE(
+ generator()->GenerateForNonPersistentNotification(
+ origin(), "" /* tag */, kNonPersistentNotificationId),
+ generator()->GenerateForNonPersistentNotification(
+ origin(), "" /* tag */, kNonPersistentNotificationId + 1));
+
+ // Non-persistent when a tag is being used.
+ EXPECT_EQ(
+ generator()->GenerateForNonPersistentNotification(
+ origin(), kExampleTag, kNonPersistentNotificationId),
+ second_generator.GenerateForNonPersistentNotification(
+ origin(), kExampleTag, kNonPersistentNotificationId));
+}
+
+// Using a numeric tag that could resemble a persistent notification id should
+// not be equal to a notification without a tag, but with that id.
+TEST_F(NotificationIdGeneratorTest, NumericTagAmbiguity) {
+ // Persistent notifications.
+ EXPECT_NE(
+ generator()->GenerateForPersistentNotification(
+ origin(),
+ base::IntToString(kPersistentNotificationId),
+ kPersistentNotificationId),
+ generator()->GenerateForPersistentNotification(
+ origin(), "" /* tag */, kPersistentNotificationId));
+
+ // Non-persistent notifications.
+ EXPECT_NE(
+ generator()->GenerateForNonPersistentNotification(
+ origin(),
+ base::IntToString(kNonPersistentNotificationId),
+ kNonPersistentNotificationId),
+ generator()->GenerateForNonPersistentNotification(
+ origin(), "" /* tag */, kNonPersistentNotificationId));
+}
+
+// Using port numbers and a tag which, when concatenated, could end up being
+// equal to each other if origins stop ending with slashes.
+TEST_F(NotificationIdGeneratorTest, OriginPortAmbiguity) {
+ GURL origin_805("https://example.com:805");
+ GURL origin_8051("https://example.com:8051");
+
+ // Persistent notifications.
+ EXPECT_NE(
+ generator()->GenerateForPersistentNotification(
+ origin_805, "17", kPersistentNotificationId),
+ generator()->GenerateForPersistentNotification(
+ origin_8051, "7", kPersistentNotificationId));
+
+ // Non-persistent notifications.
+ EXPECT_NE(
+ generator()->GenerateForNonPersistentNotification(
+ origin_805, "17", kNonPersistentNotificationId),
+ generator()->GenerateForNonPersistentNotification(
+ origin_8051, "7", kNonPersistentNotificationId));
+}
+
+// -----------------------------------------------------------------------------
+// Persistent notifications
+//
+// Tests covering the logic specific to persistent notifications. This kind of
+// notification does not care about the renderer process that created them.
+
+TEST_F(NotificationIdGeneratorTest, PersistentDifferentRenderProcessIds) {
+ NotificationIdGenerator second_generator(browser_context(),
+ kRenderProcessId + 1);
+
+ EXPECT_EQ(
+ generator()->GenerateForPersistentNotification(
+ origin(), kExampleTag, kPersistentNotificationId),
+ second_generator.GenerateForPersistentNotification(
+ origin(), kExampleTag, kPersistentNotificationId));
+
+ EXPECT_EQ(
+ generator()->GenerateForPersistentNotification(
+ origin(), "" /* tag */, kPersistentNotificationId),
+ second_generator.GenerateForPersistentNotification(
+ origin(), "" /* tag */, kPersistentNotificationId));
+}
+
+// -----------------------------------------------------------------------------
+// Non-persistent notifications
+//
+// Tests covering the logic specific to non-persistent notifications. This kind
+// of notification cares about the renderer process they were created by when
+// the notification does not have a tag, since multiple renderers would restart
+// the count for non-persistent notification ids.
+
+TEST_F(NotificationIdGeneratorTest, NonPersistentDifferentRenderProcessIds) {
+ NotificationIdGenerator second_generator(browser_context(),
+ kRenderProcessId + 1);
+
+ EXPECT_EQ(
+ generator()->GenerateForNonPersistentNotification(
+ origin(), kExampleTag, kNonPersistentNotificationId),
+ second_generator.GenerateForNonPersistentNotification(
+ origin(), kExampleTag, kNonPersistentNotificationId));
+
+ EXPECT_NE(
+ generator()->GenerateForNonPersistentNotification(
+ origin(), "" /* tag */, kNonPersistentNotificationId),
+ second_generator.GenerateForNonPersistentNotification(
+ origin(), "" /* tag */, kNonPersistentNotificationId));
+}
+
+// Concatenation of the render process id and the non-persistent notification
+// id should not result in the generation of a duplicated notification id.
+TEST_F(NotificationIdGeneratorTest, NonPersistentRenderProcessIdAmbiguity) {
+ NotificationIdGenerator generator_rpi_5(browser_context(), 5);
+ NotificationIdGenerator generator_rpi_51(browser_context(), 51);
+
+ EXPECT_NE(
+ generator_rpi_5.GenerateForNonPersistentNotification(
+ origin(), "" /* tag */, 1337 /* non_persistent_notification_id */),
+ generator_rpi_51.GenerateForNonPersistentNotification(
+ origin(), "" /* tag */, 337 /* non_persistent_notification_id */));
+}
+
+} // namespace
+} // namespace content
« no previous file with comments | « content/browser/notifications/notification_id_generator.cc ('k') | content/content_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698