Chromium Code Reviews| 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()); |
| +} |