| // 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 "content/browser/notification_service_impl.h" | 
 |  | 
 | #include "content/public/browser/notification_observer.h" | 
 | #include "content/public/browser/notification_registrar.h" | 
 | #include "content/public/browser/notification_types.h" | 
 | #include "testing/gtest/include/gtest/gtest.h" | 
 |  | 
 | namespace content { | 
 |  | 
 | namespace { | 
 |  | 
 | // Bogus class to act as a NotificationSource for the messages. | 
 | class TestSource {}; | 
 |  | 
 | class TestObserver : public NotificationObserver { | 
 |  public: | 
 |   TestObserver() : notification_count_(0) {} | 
 |  | 
 |   int notification_count() const { return notification_count_; } | 
 |  | 
 |   void Observe(int type, | 
 |                const NotificationSource& source, | 
 |                const NotificationDetails& details) override { | 
 |     ++notification_count_; | 
 |   } | 
 |  | 
 |  private: | 
 |   int notification_count_; | 
 | }; | 
 |  | 
 | const int kNotification1 = 1; | 
 | const int kNotification2 = 2; | 
 |  | 
 | }  // namespace | 
 |  | 
 |  | 
 | class NotificationServiceImplTest : public testing::Test { | 
 |  protected: | 
 |   NotificationRegistrar registrar_; | 
 | }; | 
 |  | 
 | TEST_F(NotificationServiceImplTest, Basic) { | 
 |   TestSource test_source; | 
 |   TestSource other_source; | 
 |  | 
 |   // Check the equality operators defined for NotificationSource | 
 |   EXPECT_TRUE(Source<TestSource>(&test_source) == | 
 |               Source<TestSource>(&test_source)); | 
 |   EXPECT_TRUE(Source<TestSource>(&test_source) != | 
 |               Source<TestSource>(&other_source)); | 
 |  | 
 |   TestObserver all_types_all_sources; | 
 |   TestObserver idle_all_sources; | 
 |   TestObserver all_types_test_source; | 
 |   TestObserver idle_test_source; | 
 |  | 
 |   // Make sure it doesn't freak out when there are no observers. | 
 |   NotificationService* service = NotificationService::current(); | 
 |   service->Notify(kNotification1, | 
 |                   Source<TestSource>(&test_source), | 
 |                   NotificationService::NoDetails()); | 
 |  | 
 |   registrar_.Add(&all_types_all_sources, NOTIFICATION_ALL, | 
 |                  NotificationService::AllSources()); | 
 |   registrar_.Add(&idle_all_sources, kNotification1, | 
 |                  NotificationService::AllSources()); | 
 |   registrar_.Add(&all_types_test_source, NOTIFICATION_ALL, | 
 |                  Source<TestSource>(&test_source)); | 
 |   registrar_.Add(&idle_test_source, kNotification1, | 
 |                  Source<TestSource>(&test_source)); | 
 |  | 
 |   EXPECT_EQ(0, all_types_all_sources.notification_count()); | 
 |   EXPECT_EQ(0, idle_all_sources.notification_count()); | 
 |   EXPECT_EQ(0, all_types_test_source.notification_count()); | 
 |   EXPECT_EQ(0, idle_test_source.notification_count()); | 
 |  | 
 |   service->Notify(kNotification1, | 
 |                   Source<TestSource>(&test_source), | 
 |                   NotificationService::NoDetails()); | 
 |  | 
 |   EXPECT_EQ(1, all_types_all_sources.notification_count()); | 
 |   EXPECT_EQ(1, idle_all_sources.notification_count()); | 
 |   EXPECT_EQ(1, all_types_test_source.notification_count()); | 
 |   EXPECT_EQ(1, idle_test_source.notification_count()); | 
 |  | 
 |   service->Notify(kNotification2, | 
 |                   Source<TestSource>(&test_source), | 
 |                   NotificationService::NoDetails()); | 
 |  | 
 |   EXPECT_EQ(2, all_types_all_sources.notification_count()); | 
 |   EXPECT_EQ(1, idle_all_sources.notification_count()); | 
 |   EXPECT_EQ(2, all_types_test_source.notification_count()); | 
 |   EXPECT_EQ(1, idle_test_source.notification_count()); | 
 |  | 
 |   service->Notify(kNotification1, | 
 |                   Source<TestSource>(&other_source), | 
 |                   NotificationService::NoDetails()); | 
 |  | 
 |   EXPECT_EQ(3, all_types_all_sources.notification_count()); | 
 |   EXPECT_EQ(2, idle_all_sources.notification_count()); | 
 |   EXPECT_EQ(2, all_types_test_source.notification_count()); | 
 |   EXPECT_EQ(1, idle_test_source.notification_count()); | 
 |  | 
 |   service->Notify(kNotification2, | 
 |                   Source<TestSource>(&other_source), | 
 |                   NotificationService::NoDetails()); | 
 |  | 
 |   EXPECT_EQ(4, all_types_all_sources.notification_count()); | 
 |   EXPECT_EQ(2, idle_all_sources.notification_count()); | 
 |   EXPECT_EQ(2, all_types_test_source.notification_count()); | 
 |   EXPECT_EQ(1, idle_test_source.notification_count()); | 
 |  | 
 |   // Try send with NULL source. | 
 |   service->Notify(kNotification1, | 
 |                   NotificationService::AllSources(), | 
 |                   NotificationService::NoDetails()); | 
 |  | 
 |   EXPECT_EQ(5, all_types_all_sources.notification_count()); | 
 |   EXPECT_EQ(3, idle_all_sources.notification_count()); | 
 |   EXPECT_EQ(2, all_types_test_source.notification_count()); | 
 |   EXPECT_EQ(1, idle_test_source.notification_count()); | 
 |  | 
 |   registrar_.RemoveAll(); | 
 |  | 
 |   service->Notify(kNotification1, | 
 |                   Source<TestSource>(&test_source), | 
 |                   NotificationService::NoDetails()); | 
 |  | 
 |   EXPECT_EQ(5, all_types_all_sources.notification_count()); | 
 |   EXPECT_EQ(3, idle_all_sources.notification_count()); | 
 |   EXPECT_EQ(2, all_types_test_source.notification_count()); | 
 |   EXPECT_EQ(1, idle_test_source.notification_count()); | 
 | } | 
 |  | 
 | TEST_F(NotificationServiceImplTest, MultipleRegistration) { | 
 |   TestSource test_source; | 
 |  | 
 |   TestObserver idle_test_source; | 
 |  | 
 |   NotificationService* service = NotificationService::current(); | 
 |  | 
 |   registrar_.Add(&idle_test_source, kNotification1, | 
 |                  Source<TestSource>(&test_source)); | 
 |   registrar_.Add(&idle_test_source, NOTIFICATION_ALL, | 
 |                  Source<TestSource>(&test_source)); | 
 |  | 
 |   service->Notify(kNotification1, | 
 |                   Source<TestSource>(&test_source), | 
 |                   NotificationService::NoDetails()); | 
 |   EXPECT_EQ(2, idle_test_source.notification_count()); | 
 |  | 
 |   registrar_.Remove(&idle_test_source, kNotification1, | 
 |                     Source<TestSource>(&test_source)); | 
 |  | 
 |   service->Notify(kNotification1, | 
 |                  Source<TestSource>(&test_source), | 
 |                  NotificationService::NoDetails()); | 
 |   EXPECT_EQ(3, idle_test_source.notification_count()); | 
 |  | 
 |   registrar_.Remove(&idle_test_source, NOTIFICATION_ALL, | 
 |                     Source<TestSource>(&test_source)); | 
 |  | 
 |   service->Notify(kNotification1, | 
 |                   Source<TestSource>(&test_source), | 
 |                   NotificationService::NoDetails()); | 
 |   EXPECT_EQ(3, idle_test_source.notification_count()); | 
 | } | 
 |  | 
 | }  // namespace content |