• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 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 "extensions/browser/event_router.h"
6 
7 #include <string>
8 
9 #include "base/compiler_specific.h"
10 #include "base/memory/scoped_ptr.h"
11 #include "base/values.h"
12 #include "extensions/browser/event_listener_map.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14 
15 namespace extensions {
16 
17 namespace {
18 
19 // A simple mock to keep track of listener additions and removals.
20 class MockEventRouterObserver : public EventRouter::Observer {
21  public:
MockEventRouterObserver()22   MockEventRouterObserver()
23       : listener_added_count_(0),
24         listener_removed_count_(0) {}
~MockEventRouterObserver()25   virtual ~MockEventRouterObserver() {}
26 
listener_added_count() const27   int listener_added_count() const { return listener_added_count_; }
listener_removed_count() const28   int listener_removed_count() const { return listener_removed_count_; }
last_event_name() const29   const std::string& last_event_name() const { return last_event_name_; }
30 
Reset()31   void Reset() {
32     listener_added_count_ = 0;
33     listener_removed_count_ = 0;
34     last_event_name_.clear();
35   }
36 
37   // EventRouter::Observer overrides:
OnListenerAdded(const EventListenerInfo & details)38   virtual void OnListenerAdded(const EventListenerInfo& details) OVERRIDE {
39     listener_added_count_++;
40     last_event_name_ = details.event_name;
41   }
42 
OnListenerRemoved(const EventListenerInfo & details)43   virtual void OnListenerRemoved(const EventListenerInfo& details) OVERRIDE {
44     listener_removed_count_++;
45     last_event_name_ = details.event_name;
46   }
47 
48  private:
49   int listener_added_count_;
50   int listener_removed_count_;
51   std::string last_event_name_;
52 
53   DISALLOW_COPY_AND_ASSIGN(MockEventRouterObserver);
54 };
55 
56 }  // namespace
57 
58 typedef testing::Test EventRouterTest;
59 
TEST_F(EventRouterTest,GetBaseEventName)60 TEST_F(EventRouterTest, GetBaseEventName) {
61   // Normal event names are passed through unchanged.
62   EXPECT_EQ("foo.onBar", EventRouter::GetBaseEventName("foo.onBar"));
63 
64   // Sub-events are converted to the part before the slash.
65   EXPECT_EQ("foo.onBar", EventRouter::GetBaseEventName("foo.onBar/123"));
66 }
67 
68 // Tests adding and removing observers from EventRouter.
TEST_F(EventRouterTest,EventRouterObserver)69 TEST_F(EventRouterTest, EventRouterObserver) {
70   EventRouter router(NULL, NULL);
71   EventListener listener(
72       "event_name", "extension_id", NULL, scoped_ptr<DictionaryValue>());
73 
74   // Add/remove works without any observers.
75   router.OnListenerAdded(&listener);
76   router.OnListenerRemoved(&listener);
77 
78   // Register observers that both match and don't match the event above.
79   MockEventRouterObserver matching_observer;
80   router.RegisterObserver(&matching_observer, "event_name");
81   MockEventRouterObserver non_matching_observer;
82   router.RegisterObserver(&non_matching_observer, "other");
83 
84   // Adding a listener notifies the appropriate observers.
85   router.OnListenerAdded(&listener);
86   EXPECT_EQ(1, matching_observer.listener_added_count());
87   EXPECT_EQ(0, non_matching_observer.listener_added_count());
88 
89   // Removing a listener notifies the appropriate observers.
90   router.OnListenerRemoved(&listener);
91   EXPECT_EQ(1, matching_observer.listener_removed_count());
92   EXPECT_EQ(0, non_matching_observer.listener_removed_count());
93 
94   // Adding the listener again notifies again.
95   router.OnListenerAdded(&listener);
96   EXPECT_EQ(2, matching_observer.listener_added_count());
97   EXPECT_EQ(0, non_matching_observer.listener_added_count());
98 
99   // Removing the listener again notifies again.
100   router.OnListenerRemoved(&listener);
101   EXPECT_EQ(2, matching_observer.listener_removed_count());
102   EXPECT_EQ(0, non_matching_observer.listener_removed_count());
103 
104   // Adding a listener with a sub-event notifies the main observer with
105   // proper details.
106   matching_observer.Reset();
107   EventListener sub_event_listener(
108       "event_name/1", "extension_id", NULL, scoped_ptr<DictionaryValue>());
109   router.OnListenerAdded(&sub_event_listener);
110   EXPECT_EQ(1, matching_observer.listener_added_count());
111   EXPECT_EQ(0, matching_observer.listener_removed_count());
112   EXPECT_EQ("event_name/1", matching_observer.last_event_name());
113 
114   // Ditto for removing the listener.
115   matching_observer.Reset();
116   router.OnListenerRemoved(&sub_event_listener);
117   EXPECT_EQ(0, matching_observer.listener_added_count());
118   EXPECT_EQ(1, matching_observer.listener_removed_count());
119   EXPECT_EQ("event_name/1", matching_observer.last_event_name());
120 }
121 
122 }  // namespace extensions
123