1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/notification_observer.h"
6 #include "base/notification_registrar.h"
7 #include "base/notification_service.h"
8
9 #include "gtest/gtest.h"
10
11 namespace {
12
13 // Bogus class to act as a NotificationSource for the messages.
14 class TestSource {};
15
16 class TestObserver : public NotificationObserver {
17 public:
TestObserver()18 TestObserver() : notification_count_(0) {}
19
notification_count()20 int notification_count() { return notification_count_; }
21
Observe(NotificationType type,const NotificationSource & source,const NotificationDetails & details)22 void Observe(NotificationType type,
23 const NotificationSource& source,
24 const NotificationDetails& details) {
25 ++notification_count_;
26 }
27
28 private:
29 int notification_count_;
30 };
31
32 } // namespace
33
34
35 class NotificationServiceTest : public testing::Test {
36 protected:
37 NotificationRegistrar registrar_;
38 };
39
TEST_F(NotificationServiceTest,Basic)40 TEST_F(NotificationServiceTest, Basic) {
41 TestSource test_source;
42 TestSource other_source;
43
44 // Check the equality operators defined for NotificationSource
45 EXPECT_TRUE(
46 Source<TestSource>(&test_source) == Source<TestSource>(&test_source));
47 EXPECT_TRUE(
48 Source<TestSource>(&test_source) != Source<TestSource>(&other_source));
49
50 TestObserver all_types_all_sources;
51 TestObserver idle_all_sources;
52 TestObserver all_types_test_source;
53 TestObserver idle_test_source;
54
55 // Make sure it doesn't freak out when there are no observers.
56 NotificationService* service = NotificationService::current();
57 service->Notify(NotificationType::IDLE,
58 Source<TestSource>(&test_source),
59 NotificationService::NoDetails());
60
61 registrar_.Add(&all_types_all_sources, NotificationType::ALL,
62 NotificationService::AllSources());
63 registrar_.Add(&idle_all_sources, NotificationType::IDLE,
64 NotificationService::AllSources());
65 registrar_.Add(&all_types_test_source, NotificationType::ALL,
66 Source<TestSource>(&test_source));
67 registrar_.Add(&idle_test_source, NotificationType::IDLE,
68 Source<TestSource>(&test_source));
69
70 EXPECT_EQ(0, all_types_all_sources.notification_count());
71 EXPECT_EQ(0, idle_all_sources.notification_count());
72 EXPECT_EQ(0, all_types_test_source.notification_count());
73 EXPECT_EQ(0, idle_test_source.notification_count());
74
75 service->Notify(NotificationType::IDLE,
76 Source<TestSource>(&test_source),
77 NotificationService::NoDetails());
78
79 EXPECT_EQ(1, all_types_all_sources.notification_count());
80 EXPECT_EQ(1, idle_all_sources.notification_count());
81 EXPECT_EQ(1, all_types_test_source.notification_count());
82 EXPECT_EQ(1, idle_test_source.notification_count());
83
84 service->Notify(NotificationType::BUSY,
85 Source<TestSource>(&test_source),
86 NotificationService::NoDetails());
87
88 EXPECT_EQ(2, all_types_all_sources.notification_count());
89 EXPECT_EQ(1, idle_all_sources.notification_count());
90 EXPECT_EQ(2, all_types_test_source.notification_count());
91 EXPECT_EQ(1, idle_test_source.notification_count());
92
93 service->Notify(NotificationType::IDLE,
94 Source<TestSource>(&other_source),
95 NotificationService::NoDetails());
96
97 EXPECT_EQ(3, all_types_all_sources.notification_count());
98 EXPECT_EQ(2, idle_all_sources.notification_count());
99 EXPECT_EQ(2, all_types_test_source.notification_count());
100 EXPECT_EQ(1, idle_test_source.notification_count());
101
102 service->Notify(NotificationType::BUSY,
103 Source<TestSource>(&other_source),
104 NotificationService::NoDetails());
105
106 EXPECT_EQ(4, all_types_all_sources.notification_count());
107 EXPECT_EQ(2, idle_all_sources.notification_count());
108 EXPECT_EQ(2, all_types_test_source.notification_count());
109 EXPECT_EQ(1, idle_test_source.notification_count());
110
111 // Try send with NULL source.
112 service->Notify(NotificationType::IDLE,
113 NotificationService::AllSources(),
114 NotificationService::NoDetails());
115
116 EXPECT_EQ(5, all_types_all_sources.notification_count());
117 EXPECT_EQ(3, idle_all_sources.notification_count());
118 EXPECT_EQ(2, all_types_test_source.notification_count());
119 EXPECT_EQ(1, idle_test_source.notification_count());
120
121 registrar_.RemoveAll();
122
123 service->Notify(NotificationType::IDLE,
124 Source<TestSource>(&test_source),
125 NotificationService::NoDetails());
126
127 EXPECT_EQ(5, all_types_all_sources.notification_count());
128 EXPECT_EQ(3, idle_all_sources.notification_count());
129 EXPECT_EQ(2, all_types_test_source.notification_count());
130 EXPECT_EQ(1, idle_test_source.notification_count());
131 }
132
TEST_F(NotificationServiceTest,MultipleRegistration)133 TEST_F(NotificationServiceTest, MultipleRegistration) {
134 TestSource test_source;
135
136 TestObserver idle_test_source;
137
138 NotificationService* service = NotificationService::current();
139
140 registrar_.Add(&idle_test_source, NotificationType::IDLE,
141 Source<TestSource>(&test_source));
142 registrar_.Add(&idle_test_source, NotificationType::ALL,
143 Source<TestSource>(&test_source));
144
145 service->Notify(NotificationType::IDLE,
146 Source<TestSource>(&test_source),
147 NotificationService::NoDetails());
148 EXPECT_EQ(2, idle_test_source.notification_count());
149
150 registrar_.Remove(&idle_test_source, NotificationType::IDLE,
151 Source<TestSource>(&test_source));
152
153 service->Notify(NotificationType::IDLE,
154 Source<TestSource>(&test_source),
155 NotificationService::NoDetails());
156 EXPECT_EQ(3, idle_test_source.notification_count());
157
158 registrar_.Remove(&idle_test_source, NotificationType::ALL,
159 Source<TestSource>(&test_source));
160
161 service->Notify(NotificationType::IDLE,
162 Source<TestSource>(&test_source),
163 NotificationService::NoDetails());
164 EXPECT_EQ(3, idle_test_source.notification_count());
165 }
166