Index: chrome/browser/extensions/event_listener_map_unittest.cc |
diff --git a/chrome/browser/extensions/event_listener_map_unittest.cc b/chrome/browser/extensions/event_listener_map_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..091d1d7fed0c37571385ca5e8adb5dbf830166b8 |
--- /dev/null |
+++ b/chrome/browser/extensions/event_listener_map_unittest.cc |
@@ -0,0 +1,284 @@ |
+// Copyright (c) 2012 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 "testing/gtest/include/gtest/gtest.h" |
+ |
+#include "chrome/browser/extensions/event_listener_map.h" |
+#include "chrome/browser/extensions/extension_event_router.h" |
+#include "content/public/test/mock_render_process_host.h" |
+ |
+class Delegate : public EventListenerMap::Delegate { |
+ virtual void OnListenerAdded(const EventListener* listener) OVERRIDE {}; |
+ virtual void OnListenerRemoved(const EventListener* listener) OVERRIDE {}; |
+}; |
+ |
+class EventListenerMapUnittest : public testing::Test { |
+ public: |
+ EventListenerMapUnittest() |
+ : delegate_(new Delegate), |
+ listeners_(new EventListenerMap(delegate_.get())), |
+ process_(new content::MockRenderProcessHost(NULL)) { |
+ } |
+ |
+ scoped_ptr<DictionaryValue> CreateHostSuffixFilter( |
+ const std::string& suffix) { |
+ scoped_ptr<DictionaryValue> filter(new DictionaryValue); |
+ scoped_ptr<ListValue> filter_list(new ListValue); |
+ scoped_ptr<DictionaryValue> filter_dict(new DictionaryValue); |
+ |
+ filter_dict->Set("hostSuffix", new StringValue(suffix)); |
+ |
+ filter_list->Append(filter_dict.release()); |
+ filter->Set("url", filter_list.release()); |
+ return filter.Pass(); |
+ } |
+ |
+ scoped_ptr<ExtensionEvent> CreateNamedEvent(const std::string& event_name) { |
+ return CreateEvent(event_name, GURL()); |
+ } |
+ |
+ scoped_ptr<ExtensionEvent> CreateEvent(const std::string& event_name, |
+ const GURL& url) { |
battre
2012/06/19 14:26:23
nit: indent
koz (OOO until 15th September)
2012/06/20 08:05:56
Done.
|
+ EventFilteringInfo info; |
+ info.SetURL(url); |
+ scoped_ptr<ExtensionEvent> result(new ExtensionEvent(event_name, "", GURL(), |
+ NULL, "", ExtensionEventRouter::USER_GESTURE_UNKNOWN, info)); |
+ return result.Pass(); |
+ } |
+ |
+ protected: |
+ scoped_ptr<Delegate> delegate_; |
+ scoped_ptr<EventListenerMap> listeners_; |
+ scoped_ptr<content::MockRenderProcessHost> process_; |
+}; |
+ |
+TEST_F(EventListenerMapUnittest, UnfilteredEventsGoToAllListeners) { |
+ listeners_->AddListener(scoped_ptr<EventListener>(new EventListener("event", |
+ "1", NULL, scoped_ptr<DictionaryValue>()))); |
battre
2012/06/19 14:26:23
replace this "1" (and all others) with
const char
koz (OOO until 15th September)
2012/06/20 08:05:56
Done.
|
+ |
+ scoped_ptr<ExtensionEvent> event(CreateNamedEvent("event")); |
+ std::set<const EventListener*> targets(listeners_->GetEventListeners(*event)); |
+ ASSERT_EQ(1u, targets.size()); |
+} |
+ |
+TEST_F(EventListenerMapUnittest, FilteredEventsGoToAllMatchingListeners) { |
+ listeners_->AddListener(scoped_ptr<EventListener>(new EventListener("event", |
+ "1", NULL, CreateHostSuffixFilter("google.com")))); |
+ listeners_->AddListener(scoped_ptr<EventListener>(new EventListener("event", |
+ "1", NULL, scoped_ptr<DictionaryValue>(new DictionaryValue)))); |
+ |
+ scoped_ptr<ExtensionEvent> event(CreateNamedEvent("event")); |
+ event->info.SetURL(GURL("http://www.google.com")); |
+ std::set<const EventListener*> targets(listeners_->GetEventListeners(*event)); |
+ ASSERT_EQ(2u, targets.size()); |
+} |
+ |
+TEST_F(EventListenerMapUnittest, FilteredEventsOnlyGoToMatchingListeners) { |
+ listeners_->AddListener(scoped_ptr<EventListener>(new EventListener("event", |
+ "1", NULL, CreateHostSuffixFilter("google.com")))); |
+ listeners_->AddListener(scoped_ptr<EventListener>(new EventListener("event", |
+ "1", NULL, CreateHostSuffixFilter("yahoo.com")))); |
+ |
+ scoped_ptr<ExtensionEvent> event(CreateNamedEvent("event")); |
+ event->info.SetURL(GURL("http://www.google.com")); |
+ std::set<const EventListener*> targets(listeners_->GetEventListeners(*event)); |
+ ASSERT_EQ(1u, targets.size()); |
+} |
+ |
+TEST_F(EventListenerMapUnittest, LazyAndUnlazyListenersGetReturned) { |
+ listeners_->AddListener(scoped_ptr<EventListener>(new EventListener("event", |
+ "1", NULL, CreateHostSuffixFilter("google.com")))); |
+ |
+ listeners_->AddListener(scoped_ptr<EventListener>(new EventListener("event", |
+ "1", process_.get(), CreateHostSuffixFilter("google.com")))); |
+ |
+ scoped_ptr<ExtensionEvent> event(CreateNamedEvent("event")); |
+ event->info.SetURL(GURL("http://www.google.com")); |
+ std::set<const EventListener*> targets(listeners_->GetEventListeners(*event)); |
+ ASSERT_EQ(2u, targets.size()); |
+} |
+ |
+TEST_F(EventListenerMapUnittest, TestRemovingByProcess) { |
+ listeners_->AddListener(scoped_ptr<EventListener>(new EventListener("event", |
+ "1", NULL, CreateHostSuffixFilter("google.com")))); |
+ |
+ listeners_->AddListener(scoped_ptr<EventListener>(new EventListener("event", |
+ "1", process_.get(), CreateHostSuffixFilter("google.com")))); |
+ |
+ listeners_->RemoveListenersForProcess(process_.get()); |
+ |
+ scoped_ptr<ExtensionEvent> event(CreateNamedEvent("event")); |
+ event->info.SetURL(GURL("http://www.google.com")); |
+ std::set<const EventListener*> targets(listeners_->GetEventListeners(*event)); |
+ ASSERT_EQ(1u, targets.size()); |
+} |
+ |
+TEST_F(EventListenerMapUnittest, TestRemovingByListener) { |
+ listeners_->AddListener(scoped_ptr<EventListener>(new EventListener("event", |
+ "1", NULL, CreateHostSuffixFilter("google.com")))); |
+ |
+ listeners_->AddListener(scoped_ptr<EventListener>(new EventListener("event", |
+ "1", process_.get(), CreateHostSuffixFilter("google.com")))); |
+ |
+ scoped_ptr<EventListener> listener(new EventListener( |
+ "event", "1", process_.get(), CreateHostSuffixFilter("google.com"))); |
+ listeners_->RemoveListener(listener.get()); |
+ |
+ scoped_ptr<ExtensionEvent> event(CreateNamedEvent("event")); |
+ event->info.SetURL(GURL("http://www.google.com")); |
+ std::set<const EventListener*> targets(listeners_->GetEventListeners(*event)); |
+ ASSERT_EQ(1u, targets.size()); |
+} |
+ |
+TEST_F(EventListenerMapUnittest, TestLazyDoubleAddIsUndoneByRemove) { |
+ listeners_->AddListener(scoped_ptr<EventListener>(new EventListener("event", |
+ "1", NULL, CreateHostSuffixFilter("google.com")))); |
+ listeners_->AddListener(scoped_ptr<EventListener>(new EventListener("event", |
+ "1", NULL, CreateHostSuffixFilter("google.com")))); |
+ |
+ scoped_ptr<EventListener> listener(new EventListener( |
+ "event", "1", NULL, CreateHostSuffixFilter("google.com"))); |
+ listeners_->RemoveListener(listener.get()); |
+ |
+ scoped_ptr<ExtensionEvent> event(CreateNamedEvent("event")); |
+ event->info.SetURL(GURL("http://www.google.com")); |
+ std::set<const EventListener*> targets(listeners_->GetEventListeners(*event)); |
+ ASSERT_EQ(0u, targets.size()); |
+} |
+ |
+TEST_F(EventListenerMapUnittest, HostSuffixFilterEquality) { |
+ scoped_ptr<DictionaryValue> filter1(CreateHostSuffixFilter("google.com")); |
+ scoped_ptr<DictionaryValue> filter2(CreateHostSuffixFilter("google.com")); |
+ ASSERT_TRUE(filter1->Equals(filter2.get())); |
+} |
+ |
+TEST_F(EventListenerMapUnittest, RemoveLazyListenersFor) { |
+ listeners_->AddListener(scoped_ptr<EventListener>(new EventListener("event", |
+ "1", NULL, CreateHostSuffixFilter("google.com")))); |
+ listeners_->AddListener(scoped_ptr<EventListener>(new EventListener("event2", |
+ "1", NULL, CreateHostSuffixFilter("google.com")))); |
+ |
+ listeners_->RemoveLazyListenersFor("1"); |
+ |
+ scoped_ptr<ExtensionEvent> event(CreateNamedEvent("event")); |
+ event->info.SetURL(GURL("http://www.google.com")); |
+ std::set<const EventListener*> targets(listeners_->GetEventListeners(*event)); |
+ ASSERT_EQ(0u, targets.size()); |
+ |
+ event->event_name = "event2"; |
+ targets = listeners_->GetEventListeners(*event); |
+ ASSERT_EQ(0u, targets.size()); |
+} |
+ |
+TEST_F(EventListenerMapUnittest, AddExistingFilteredListener) { |
+ bool first_new = listeners_->AddListener(scoped_ptr<EventListener>( |
+ new EventListener("event", "1", NULL, |
+ CreateHostSuffixFilter("google.com")))); |
+ bool second_new = listeners_->AddListener(scoped_ptr<EventListener>( |
+ new EventListener("event", "1", NULL, |
+ CreateHostSuffixFilter("google.com")))); |
+ |
+ ASSERT_TRUE(first_new); |
+ ASSERT_FALSE(second_new); |
+} |
+ |
+TEST_F(EventListenerMapUnittest, AddExistingUnfilteredListener) { |
+ bool first_add = listeners_->AddListener(scoped_ptr<EventListener>( |
+ new EventListener("event", "1", NULL, scoped_ptr<DictionaryValue>()))); |
+ bool second_add = listeners_->AddListener(scoped_ptr<EventListener>( |
+ new EventListener("event", "1", NULL, scoped_ptr<DictionaryValue>()))); |
+ |
+ scoped_ptr<EventListener> listener( |
+ new EventListener("event", "1", NULL, scoped_ptr<DictionaryValue>())); |
+ bool first_remove = listeners_->RemoveListener(listener.get()); |
+ bool second_remove = listeners_->RemoveListener(listener.get()); |
+ |
+ ASSERT_TRUE(first_add); |
+ ASSERT_FALSE(second_add); |
+ ASSERT_TRUE(first_remove); |
+ ASSERT_FALSE(second_remove); |
+} |
+ |
+TEST_F(EventListenerMapUnittest, RemovingRouters) { |
+ listeners_->AddListener(scoped_ptr<EventListener>( |
+ new EventListener("event", "1", process_.get(), |
+ scoped_ptr<DictionaryValue>()))); |
+ listeners_->RemoveListenersForProcess(process_.get()); |
+ ASSERT_FALSE(listeners_->HasListenerForEvent("event")); |
+} |
+ |
+TEST_F(EventListenerMapUnittest, HasListenerForEvent) { |
+ ASSERT_FALSE(listeners_->HasListenerForEvent("event")); |
+ |
+ listeners_->AddListener(scoped_ptr<EventListener>( |
+ new EventListener("event", "1", process_.get(), |
+ scoped_ptr<DictionaryValue>()))); |
+ |
+ ASSERT_FALSE(listeners_->HasListenerForEvent("event2")); |
+ ASSERT_TRUE(listeners_->HasListenerForEvent("event")); |
+ listeners_->RemoveListenersForProcess(process_.get()); |
+ ASSERT_FALSE(listeners_->HasListenerForEvent("event")); |
+} |
+ |
+TEST_F(EventListenerMapUnittest, HasListenerForExtension) { |
+ ASSERT_FALSE(listeners_->HasListenerForExtension("1", "event")); |
+ |
+ // Non-lazy listener. |
+ listeners_->AddListener(scoped_ptr<EventListener>( |
+ new EventListener("event", "1", process_.get(), |
+ scoped_ptr<DictionaryValue>()))); |
+ // Lazy listener. |
+ listeners_->AddListener(scoped_ptr<EventListener>( |
+ new EventListener("event", "1", NULL, |
+ scoped_ptr<DictionaryValue>()))); |
+ |
+ ASSERT_FALSE(listeners_->HasListenerForExtension("1", "event2")); |
+ ASSERT_TRUE(listeners_->HasListenerForExtension("1", "event")); |
+ ASSERT_FALSE(listeners_->HasListenerForExtension("2", "event")); |
+ listeners_->RemoveListenersForProcess(process_.get()); |
+ ASSERT_TRUE(listeners_->HasListenerForExtension("1", "event")); |
+ listeners_->RemoveLazyListenersFor("1"); |
+ ASSERT_FALSE(listeners_->HasListenerForExtension("1", "event")); |
+} |
+ |
+TEST_F(EventListenerMapUnittest, AddLazyListenersFromPreferences) { |
+ scoped_ptr<DictionaryValue> filter1(CreateHostSuffixFilter("google.com")); |
+ scoped_ptr<DictionaryValue> filter2(CreateHostSuffixFilter("yahoo.com")); |
+ |
+ DictionaryValue filtered_listeners; |
+ ListValue* filter_list = new ListValue(); |
+ filtered_listeners.Set("event", filter_list); |
+ |
+ filter_list->Append(filter1.release()); |
+ filter_list->Append(filter2.release()); |
+ |
+ std::set<std::string> unfiltered_listeners; |
+ listeners_->AddLazyListenersFromPreferences("1", unfiltered_listeners, |
+ filtered_listeners); |
+ |
+ scoped_ptr<ExtensionEvent> event(CreateEvent("event", |
+ GURL("http://www.google.com"))); |
+ std::set<const EventListener*> targets(listeners_->GetEventListeners(*event)); |
+ ASSERT_EQ(1u, targets.size()); |
+ scoped_ptr<EventListener> listener(new EventListener("event", "1", NULL, |
+ CreateHostSuffixFilter("google.com"))); |
+ ASSERT_TRUE((*targets.begin())->Equals(listener.get())); |
+} |
+ |
+TEST_F(EventListenerMapUnittest, CorruptedExtensionPrefsShouldntCrash) { |
+ scoped_ptr<DictionaryValue> filter1(CreateHostSuffixFilter("google.com")); |
+ |
+ DictionaryValue filtered_listeners; |
+ // "event" should be associated with a list, not a dictionary. |
+ filtered_listeners.Set("event", filter1.release()); |
+ |
+ std::set<std::string> unfiltered_listeners; |
+ listeners_->AddLazyListenersFromPreferences("1", unfiltered_listeners, |
+ filtered_listeners); |
+ |
+ scoped_ptr<ExtensionEvent> event(CreateEvent("event", |
+ GURL("http://www.google.com"))); |
+ std::set<const EventListener*> targets(listeners_->GetEventListeners(*event)); |
+ ASSERT_EQ(0u, targets.size()); |
+} |