123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 |
- // 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 "extensions/common/event_filter.h"
- #include <memory>
- #include <string>
- #include <utility>
- #include "base/values.h"
- #include "extensions/common/event_matcher.h"
- #include "extensions/common/mojom/event_dispatcher.mojom.h"
- #include "ipc/ipc_message.h"
- #include "testing/gtest/include/gtest/gtest.h"
- using base::DictionaryValue;
- using base::ListValue;
- using base::Value;
- namespace extensions {
- class EventFilterUnittest : public testing::Test {
- public:
- EventFilterUnittest() {
- google_event_.url = GURL("http://google.com");
- yahoo_event_.url = GURL("http://yahoo.com");
- random_url_event_.url = GURL("http://www.something-else.com");
- empty_url_event_.url = GURL();
- }
- protected:
- base::Value::Dict HostSuffixDict(const std::string& host_suffix) {
- base::Value::Dict dict;
- dict.Set("hostSuffix", host_suffix);
- return dict;
- }
- base::Value::List ValueAsList(base::Value value) {
- base::Value::List result;
- result.Append(std::move(value));
- return result;
- }
- std::unique_ptr<EventMatcher> AllURLs() {
- return std::make_unique<EventMatcher>(
- std::make_unique<base::DictionaryValue>(), MSG_ROUTING_NONE);
- }
- std::unique_ptr<EventMatcher> HostSuffixMatcher(
- const std::string& host_suffix) {
- return MatcherFromURLFilterList(
- ValueAsList(base::Value(HostSuffixDict(host_suffix))));
- }
- std::unique_ptr<EventMatcher> MatcherFromURLFilterList(
- base::Value::List url_filter_list) {
- auto filter_dict = std::make_unique<DictionaryValue>();
- filter_dict->SetKey("url", base::Value(std::move(url_filter_list)));
- return std::make_unique<EventMatcher>(std::move(filter_dict),
- MSG_ROUTING_NONE);
- }
- EventFilter event_filter_;
- mojom::EventFilteringInfo empty_event_;
- mojom::EventFilteringInfo google_event_;
- mojom::EventFilteringInfo yahoo_event_;
- mojom::EventFilteringInfo random_url_event_;
- mojom::EventFilteringInfo empty_url_event_;
- };
- TEST_F(EventFilterUnittest, NoMatchersMatchIfEmpty) {
- std::set<int> matches =
- event_filter_.MatchEvent("some-event", empty_event_, MSG_ROUTING_NONE);
- ASSERT_EQ(0u, matches.size());
- }
- TEST_F(EventFilterUnittest, AddingEventMatcherDoesntCrash) {
- event_filter_.AddEventMatcher("event1", AllURLs());
- }
- TEST_F(EventFilterUnittest,
- DontMatchAgainstMatchersForDifferentEvents) {
- event_filter_.AddEventMatcher("event1", AllURLs());
- std::set<int> matches =
- event_filter_.MatchEvent("event2", empty_event_, MSG_ROUTING_NONE);
- ASSERT_EQ(0u, matches.size());
- }
- TEST_F(EventFilterUnittest, DoMatchAgainstMatchersForSameEvent) {
- int id = event_filter_.AddEventMatcher("event1", AllURLs());
- std::set<int> matches =
- event_filter_.MatchEvent("event1", google_event_, MSG_ROUTING_NONE);
- ASSERT_EQ(1u, matches.size());
- ASSERT_EQ(1u, matches.count(id));
- }
- TEST_F(EventFilterUnittest, DontMatchUnlessMatcherMatches) {
- mojom::EventFilteringInfo info;
- info.url = GURL("http://www.yahoo.com");
- event_filter_.AddEventMatcher("event1", HostSuffixMatcher("google.com"));
- std::set<int> matches =
- event_filter_.MatchEvent("event1", info, MSG_ROUTING_NONE);
- ASSERT_TRUE(matches.empty());
- }
- TEST_F(EventFilterUnittest, RemovingAnEventMatcherStopsItMatching) {
- int id = event_filter_.AddEventMatcher("event1", AllURLs());
- event_filter_.RemoveEventMatcher(id);
- std::set<int> matches =
- event_filter_.MatchEvent("event1", empty_event_, MSG_ROUTING_NONE);
- ASSERT_TRUE(matches.empty());
- }
- TEST_F(EventFilterUnittest, MultipleEventMatches) {
- int id1 = event_filter_.AddEventMatcher("event1", AllURLs());
- int id2 = event_filter_.AddEventMatcher("event1", AllURLs());
- std::set<int> matches =
- event_filter_.MatchEvent("event1", google_event_, MSG_ROUTING_NONE);
- ASSERT_EQ(2u, matches.size());
- ASSERT_EQ(1u, matches.count(id1));
- ASSERT_EQ(1u, matches.count(id2));
- }
- TEST_F(EventFilterUnittest, TestURLMatching) {
- mojom::EventFilteringInfo info;
- info.url = GURL("http://www.google.com");
- int id = event_filter_.AddEventMatcher("event1",
- HostSuffixMatcher("google.com"));
- std::set<int> matches =
- event_filter_.MatchEvent("event1", info, MSG_ROUTING_NONE);
- ASSERT_EQ(1u, matches.size());
- ASSERT_EQ(1u, matches.count(id));
- }
- TEST_F(EventFilterUnittest, TestMultipleURLFiltersMatchOnAny) {
- base::Value::List filters;
- filters.Append(HostSuffixDict("google.com"));
- filters.Append(HostSuffixDict("yahoo.com"));
- std::unique_ptr<EventMatcher> matcher(
- MatcherFromURLFilterList(std::move(filters)));
- int id = event_filter_.AddEventMatcher("event1", std::move(matcher));
- {
- std::set<int> matches =
- event_filter_.MatchEvent("event1", google_event_, MSG_ROUTING_NONE);
- ASSERT_EQ(1u, matches.size());
- ASSERT_EQ(1u, matches.count(id));
- }
- {
- std::set<int> matches =
- event_filter_.MatchEvent("event1", yahoo_event_, MSG_ROUTING_NONE);
- ASSERT_EQ(1u, matches.size());
- ASSERT_EQ(1u, matches.count(id));
- }
- {
- std::set<int> matches =
- event_filter_.MatchEvent("event1", random_url_event_, MSG_ROUTING_NONE);
- ASSERT_EQ(0u, matches.size());
- }
- }
- TEST_F(EventFilterUnittest, TestStillMatchesAfterRemoval) {
- int id1 = event_filter_.AddEventMatcher("event1", AllURLs());
- int id2 = event_filter_.AddEventMatcher("event1", AllURLs());
- event_filter_.RemoveEventMatcher(id1);
- {
- std::set<int> matches =
- event_filter_.MatchEvent("event1", google_event_, MSG_ROUTING_NONE);
- ASSERT_EQ(1u, matches.size());
- ASSERT_EQ(1u, matches.count(id2));
- }
- }
- TEST_F(EventFilterUnittest, TestMatchesOnlyAgainstPatternsForCorrectEvent) {
- int id1 = event_filter_.AddEventMatcher("event1", AllURLs());
- event_filter_.AddEventMatcher("event2", AllURLs());
- {
- std::set<int> matches =
- event_filter_.MatchEvent("event1", google_event_, MSG_ROUTING_NONE);
- ASSERT_EQ(1u, matches.size());
- ASSERT_EQ(1u, matches.count(id1));
- }
- }
- TEST_F(EventFilterUnittest, TestGetMatcherCountForEvent) {
- ASSERT_EQ(0, event_filter_.GetMatcherCountForEventForTesting("event1"));
- int id1 = event_filter_.AddEventMatcher("event1", AllURLs());
- ASSERT_EQ(1, event_filter_.GetMatcherCountForEventForTesting("event1"));
- int id2 = event_filter_.AddEventMatcher("event1", AllURLs());
- ASSERT_EQ(2, event_filter_.GetMatcherCountForEventForTesting("event1"));
- event_filter_.RemoveEventMatcher(id1);
- ASSERT_EQ(1, event_filter_.GetMatcherCountForEventForTesting("event1"));
- event_filter_.RemoveEventMatcher(id2);
- ASSERT_EQ(0, event_filter_.GetMatcherCountForEventForTesting("event1"));
- }
- TEST_F(EventFilterUnittest, RemoveEventMatcherReturnsEventName) {
- int id1 = event_filter_.AddEventMatcher("event1", AllURLs());
- int id2 = event_filter_.AddEventMatcher("event1", AllURLs());
- int id3 = event_filter_.AddEventMatcher("event2", AllURLs());
- ASSERT_EQ("event1", event_filter_.RemoveEventMatcher(id1));
- ASSERT_EQ("event1", event_filter_.RemoveEventMatcher(id2));
- ASSERT_EQ("event2", event_filter_.RemoveEventMatcher(id3));
- }
- TEST_F(EventFilterUnittest, InvalidURLFilterCantBeAdded) {
- base::Value::List filter_list;
- filter_list.Append(base::Value::List()); // Should be a dict.
- std::unique_ptr<EventMatcher> matcher(
- MatcherFromURLFilterList(std::move(filter_list)));
- int id1 = event_filter_.AddEventMatcher("event1", std::move(matcher));
- EXPECT_TRUE(event_filter_.IsURLMatcherEmptyForTesting());
- ASSERT_EQ(-1, id1);
- }
- TEST_F(EventFilterUnittest, EmptyListOfURLFiltersMatchesAllURLs) {
- std::unique_ptr<EventMatcher> matcher(
- MatcherFromURLFilterList(base::Value::List()));
- int id = event_filter_.AddEventMatcher("event1", std::move(matcher));
- std::set<int> matches =
- event_filter_.MatchEvent("event1", google_event_, MSG_ROUTING_NONE);
- ASSERT_EQ(1u, matches.size());
- ASSERT_EQ(1u, matches.count(id));
- }
- TEST_F(EventFilterUnittest,
- InternalURLMatcherShouldBeEmptyWhenThereAreNoEventMatchers) {
- ASSERT_TRUE(event_filter_.IsURLMatcherEmptyForTesting());
- int id = event_filter_.AddEventMatcher("event1",
- HostSuffixMatcher("google.com"));
- ASSERT_FALSE(event_filter_.IsURLMatcherEmptyForTesting());
- event_filter_.RemoveEventMatcher(id);
- ASSERT_TRUE(event_filter_.IsURLMatcherEmptyForTesting());
- }
- TEST_F(EventFilterUnittest, EmptyURLsShouldBeMatchedByEmptyURLFilters) {
- int id = event_filter_.AddEventMatcher("event1", AllURLs());
- std::set<int> matches =
- event_filter_.MatchEvent("event1", empty_url_event_, MSG_ROUTING_NONE);
- ASSERT_EQ(1u, matches.size());
- ASSERT_EQ(1u, matches.count(id));
- }
- TEST_F(EventFilterUnittest,
- EmptyURLsShouldBeMatchedByEmptyURLFiltersWithAnEmptyItem) {
- std::unique_ptr<EventMatcher> matcher(
- MatcherFromURLFilterList(ValueAsList(base::Value(base::Value::Dict()))));
- int id = event_filter_.AddEventMatcher("event1", std::move(matcher));
- std::set<int> matches =
- event_filter_.MatchEvent("event1", empty_url_event_, MSG_ROUTING_NONE);
- ASSERT_EQ(1u, matches.size());
- ASSERT_EQ(1u, matches.count(id));
- }
- } // namespace extensions
|