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