1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// found in the LICENSE file.
4201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
5201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "base/basictypes.h"
6201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "base/command_line.h"
7201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "base/utf_string_conversions.h"
8201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/browser/background_page_tracker.h"
9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/test/testing_browser_process.h"
10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/test/testing_browser_process_test.h"
11201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/test/testing_pref_service.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_type.h"
14201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "testing/gtest/include/gtest/gtest.h"
15201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "testing/platform_test.h"
16201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
17201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass MockBackgroundPageTracker : public BackgroundPageTracker {
18201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch public:
19201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  MockBackgroundPageTracker() {
20201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    BackgroundPageTracker::RegisterPrefs(&prefs_);
21201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
22201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ~MockBackgroundPageTracker() {}
23201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Overridden from BackgroundPageTracker to mock out functionality.
24201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual bool IsEnabled() { return true; }
25201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual PrefService* GetPrefService() { return &prefs_; }
26201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch private:
27201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  TestingPrefService prefs_;
28201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch};
29201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
30dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass BackgroundPageTrackerTest : public TestingBrowserProcessTest {
31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
32dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
33dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(BackgroundPageTrackerTest, Create) {
34201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  MockBackgroundPageTracker tracker;
35201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(0, tracker.GetBackgroundPageCount());
36201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(0, tracker.GetUnacknowledgedBackgroundPageCount());
37201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
38201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
39dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(BackgroundPageTrackerTest, OnBackgroundPageLoaded) {
40201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  MockBackgroundPageTracker tracker;
41201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(0, tracker.GetBackgroundPageCount());
42201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(0, tracker.GetUnacknowledgedBackgroundPageCount());
43201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  std::string app1 = "app_id_1";
44201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  std::string app2 = "app_id_2";
45201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  tracker.OnBackgroundPageLoaded(app1);
46201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(1, tracker.GetBackgroundPageCount());
47201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(1, tracker.GetUnacknowledgedBackgroundPageCount());
48201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  tracker.OnBackgroundPageLoaded(app1);
49201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(1, tracker.GetBackgroundPageCount());
50201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(1, tracker.GetUnacknowledgedBackgroundPageCount());
51201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  tracker.OnBackgroundPageLoaded(app2);
52201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(2, tracker.GetBackgroundPageCount());
53201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(2, tracker.GetUnacknowledgedBackgroundPageCount());
54201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
55201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  tracker.OnExtensionUnloaded(app1);
56201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(1, tracker.GetBackgroundPageCount());
57201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(1, tracker.GetUnacknowledgedBackgroundPageCount());
58201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
59201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  tracker.OnExtensionUnloaded(app2);
60201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(0, tracker.GetBackgroundPageCount());
61201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(0, tracker.GetUnacknowledgedBackgroundPageCount());
62201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
63201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
64dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(BackgroundPageTrackerTest, AcknowledgeBackgroundPages) {
65201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  MockBackgroundPageTracker tracker;
66201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(0, tracker.GetBackgroundPageCount());
67201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(0, tracker.GetUnacknowledgedBackgroundPageCount());
68201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  std::string app1 = "app_id_1";
69201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  tracker.OnBackgroundPageLoaded(app1);
70201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(1, tracker.GetBackgroundPageCount());
71201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(1, tracker.GetUnacknowledgedBackgroundPageCount());
72201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  tracker.AcknowledgeBackgroundPages();
73201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(1, tracker.GetBackgroundPageCount());
74201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(0, tracker.GetUnacknowledgedBackgroundPageCount());
75201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  tracker.OnBackgroundPageLoaded(app1);
76201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(1, tracker.GetBackgroundPageCount());
77201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(0, tracker.GetUnacknowledgedBackgroundPageCount());
78201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
79201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
80201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass BadgeChangedNotificationCounter : public NotificationObserver {
81201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch public:
82201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  BadgeChangedNotificationCounter()
83201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      : count_(0) {
84201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    registrar_.Add(this,
85201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                   NotificationType::BACKGROUND_PAGE_TRACKER_CHANGED,
86201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                   NotificationService::AllSources());
87201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
88201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // # notifications received.
89201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  int count() { return count_; }
90201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // NotificationObserver implementation.
91201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual void Observe(NotificationType type,
92201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                       const NotificationSource& source,
93201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                       const NotificationDetails& details) {
94201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    EXPECT_EQ(type.value,
95201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch              NotificationType::BACKGROUND_PAGE_TRACKER_CHANGED);
96201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    count_++;
97201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
98201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch private:
99201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  int count_;
100201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  NotificationRegistrar registrar_;
101201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch};
102201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
103dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(BackgroundPageTrackerTest, TestTrackerChangedNotifications) {
104201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  MockBackgroundPageTracker tracker;
105201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  BadgeChangedNotificationCounter counter;
106201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  std::string app1 = "app_id_1";
107201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  std::string app2 = "app_id_2";
108201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  std::string app3 = "app_id_3";
109201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // New extension should generate notification
110201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  tracker.OnBackgroundPageLoaded(app1);
111201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(1, counter.count());
112201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Same extension should not generate notification
113201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  tracker.OnBackgroundPageLoaded(app1);
114201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(1, counter.count());
115201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // New extension should generate notification
116201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  tracker.OnBackgroundPageLoaded(app2);
117201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(2, counter.count());
118201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Acknowledging pages should generate notification.
119201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  tracker.AcknowledgeBackgroundPages();
120201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(3, counter.count());
121201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  tracker.OnBackgroundPageLoaded(app1);
122201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(3, counter.count());
123201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  tracker.OnBackgroundPageLoaded(app3);
124201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(4, counter.count());
125201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
126