// Copyright (c) 2011 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/basictypes.h" #include "base/command_line.h" #include "base/utf_string_conversions.h" #include "chrome/browser/background_page_tracker.h" #include "chrome/test/testing_browser_process.h" #include "chrome/test/testing_browser_process_test.h" #include "chrome/test/testing_pref_service.h" #include "content/common/notification_service.h" #include "content/common/notification_type.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/platform_test.h" class MockBackgroundPageTracker : public BackgroundPageTracker { public: MockBackgroundPageTracker() { BackgroundPageTracker::RegisterPrefs(&prefs_); } ~MockBackgroundPageTracker() {} // Overridden from BackgroundPageTracker to mock out functionality. virtual bool IsEnabled() { return true; } virtual PrefService* GetPrefService() { return &prefs_; } private: TestingPrefService prefs_; }; class BackgroundPageTrackerTest : public TestingBrowserProcessTest { }; TEST_F(BackgroundPageTrackerTest, Create) { MockBackgroundPageTracker tracker; EXPECT_EQ(0, tracker.GetBackgroundPageCount()); EXPECT_EQ(0, tracker.GetUnacknowledgedBackgroundPageCount()); } TEST_F(BackgroundPageTrackerTest, OnBackgroundPageLoaded) { MockBackgroundPageTracker tracker; EXPECT_EQ(0, tracker.GetBackgroundPageCount()); EXPECT_EQ(0, tracker.GetUnacknowledgedBackgroundPageCount()); std::string app1 = "app_id_1"; std::string app2 = "app_id_2"; tracker.OnBackgroundPageLoaded(app1); EXPECT_EQ(1, tracker.GetBackgroundPageCount()); EXPECT_EQ(1, tracker.GetUnacknowledgedBackgroundPageCount()); tracker.OnBackgroundPageLoaded(app1); EXPECT_EQ(1, tracker.GetBackgroundPageCount()); EXPECT_EQ(1, tracker.GetUnacknowledgedBackgroundPageCount()); tracker.OnBackgroundPageLoaded(app2); EXPECT_EQ(2, tracker.GetBackgroundPageCount()); EXPECT_EQ(2, tracker.GetUnacknowledgedBackgroundPageCount()); tracker.OnExtensionUnloaded(app1); EXPECT_EQ(1, tracker.GetBackgroundPageCount()); EXPECT_EQ(1, tracker.GetUnacknowledgedBackgroundPageCount()); tracker.OnExtensionUnloaded(app2); EXPECT_EQ(0, tracker.GetBackgroundPageCount()); EXPECT_EQ(0, tracker.GetUnacknowledgedBackgroundPageCount()); } TEST_F(BackgroundPageTrackerTest, AcknowledgeBackgroundPages) { MockBackgroundPageTracker tracker; EXPECT_EQ(0, tracker.GetBackgroundPageCount()); EXPECT_EQ(0, tracker.GetUnacknowledgedBackgroundPageCount()); std::string app1 = "app_id_1"; tracker.OnBackgroundPageLoaded(app1); EXPECT_EQ(1, tracker.GetBackgroundPageCount()); EXPECT_EQ(1, tracker.GetUnacknowledgedBackgroundPageCount()); tracker.AcknowledgeBackgroundPages(); EXPECT_EQ(1, tracker.GetBackgroundPageCount()); EXPECT_EQ(0, tracker.GetUnacknowledgedBackgroundPageCount()); tracker.OnBackgroundPageLoaded(app1); EXPECT_EQ(1, tracker.GetBackgroundPageCount()); EXPECT_EQ(0, tracker.GetUnacknowledgedBackgroundPageCount()); } class BadgeChangedNotificationCounter : public NotificationObserver { public: BadgeChangedNotificationCounter() : count_(0) { registrar_.Add(this, NotificationType::BACKGROUND_PAGE_TRACKER_CHANGED, NotificationService::AllSources()); } // # notifications received. int count() { return count_; } // NotificationObserver implementation. virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details) { EXPECT_EQ(type.value, NotificationType::BACKGROUND_PAGE_TRACKER_CHANGED); count_++; } private: int count_; NotificationRegistrar registrar_; }; TEST_F(BackgroundPageTrackerTest, TestTrackerChangedNotifications) { MockBackgroundPageTracker tracker; BadgeChangedNotificationCounter counter; std::string app1 = "app_id_1"; std::string app2 = "app_id_2"; std::string app3 = "app_id_3"; // New extension should generate notification tracker.OnBackgroundPageLoaded(app1); EXPECT_EQ(1, counter.count()); // Same extension should not generate notification tracker.OnBackgroundPageLoaded(app1); EXPECT_EQ(1, counter.count()); // New extension should generate notification tracker.OnBackgroundPageLoaded(app2); EXPECT_EQ(2, counter.count()); // Acknowledging pages should generate notification. tracker.AcknowledgeBackgroundPages(); EXPECT_EQ(3, counter.count()); tracker.OnBackgroundPageLoaded(app1); EXPECT_EQ(3, counter.count()); tracker.OnBackgroundPageLoaded(app3); EXPECT_EQ(4, counter.count()); }