event_filter_unittest.cc 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. // Copyright (c) 2012 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. #include "extensions/common/event_filter.h"
  5. #include <memory>
  6. #include <string>
  7. #include <utility>
  8. #include "base/values.h"
  9. #include "extensions/common/event_matcher.h"
  10. #include "extensions/common/mojom/event_dispatcher.mojom.h"
  11. #include "ipc/ipc_message.h"
  12. #include "testing/gtest/include/gtest/gtest.h"
  13. using base::DictionaryValue;
  14. using base::ListValue;
  15. using base::Value;
  16. namespace extensions {
  17. class EventFilterUnittest : public testing::Test {
  18. public:
  19. EventFilterUnittest() {
  20. google_event_.url = GURL("http://google.com");
  21. yahoo_event_.url = GURL("http://yahoo.com");
  22. random_url_event_.url = GURL("http://www.something-else.com");
  23. empty_url_event_.url = GURL();
  24. }
  25. protected:
  26. base::Value::Dict HostSuffixDict(const std::string& host_suffix) {
  27. base::Value::Dict dict;
  28. dict.Set("hostSuffix", host_suffix);
  29. return dict;
  30. }
  31. base::Value::List ValueAsList(base::Value value) {
  32. base::Value::List result;
  33. result.Append(std::move(value));
  34. return result;
  35. }
  36. std::unique_ptr<EventMatcher> AllURLs() {
  37. return std::make_unique<EventMatcher>(
  38. std::make_unique<base::DictionaryValue>(), MSG_ROUTING_NONE);
  39. }
  40. std::unique_ptr<EventMatcher> HostSuffixMatcher(
  41. const std::string& host_suffix) {
  42. return MatcherFromURLFilterList(
  43. ValueAsList(base::Value(HostSuffixDict(host_suffix))));
  44. }
  45. std::unique_ptr<EventMatcher> MatcherFromURLFilterList(
  46. base::Value::List url_filter_list) {
  47. auto filter_dict = std::make_unique<DictionaryValue>();
  48. filter_dict->SetKey("url", base::Value(std::move(url_filter_list)));
  49. return std::make_unique<EventMatcher>(std::move(filter_dict),
  50. MSG_ROUTING_NONE);
  51. }
  52. EventFilter event_filter_;
  53. mojom::EventFilteringInfo empty_event_;
  54. mojom::EventFilteringInfo google_event_;
  55. mojom::EventFilteringInfo yahoo_event_;
  56. mojom::EventFilteringInfo random_url_event_;
  57. mojom::EventFilteringInfo empty_url_event_;
  58. };
  59. TEST_F(EventFilterUnittest, NoMatchersMatchIfEmpty) {
  60. std::set<int> matches =
  61. event_filter_.MatchEvent("some-event", empty_event_, MSG_ROUTING_NONE);
  62. ASSERT_EQ(0u, matches.size());
  63. }
  64. TEST_F(EventFilterUnittest, AddingEventMatcherDoesntCrash) {
  65. event_filter_.AddEventMatcher("event1", AllURLs());
  66. }
  67. TEST_F(EventFilterUnittest,
  68. DontMatchAgainstMatchersForDifferentEvents) {
  69. event_filter_.AddEventMatcher("event1", AllURLs());
  70. std::set<int> matches =
  71. event_filter_.MatchEvent("event2", empty_event_, MSG_ROUTING_NONE);
  72. ASSERT_EQ(0u, matches.size());
  73. }
  74. TEST_F(EventFilterUnittest, DoMatchAgainstMatchersForSameEvent) {
  75. int id = event_filter_.AddEventMatcher("event1", AllURLs());
  76. std::set<int> matches =
  77. event_filter_.MatchEvent("event1", google_event_, MSG_ROUTING_NONE);
  78. ASSERT_EQ(1u, matches.size());
  79. ASSERT_EQ(1u, matches.count(id));
  80. }
  81. TEST_F(EventFilterUnittest, DontMatchUnlessMatcherMatches) {
  82. mojom::EventFilteringInfo info;
  83. info.url = GURL("http://www.yahoo.com");
  84. event_filter_.AddEventMatcher("event1", HostSuffixMatcher("google.com"));
  85. std::set<int> matches =
  86. event_filter_.MatchEvent("event1", info, MSG_ROUTING_NONE);
  87. ASSERT_TRUE(matches.empty());
  88. }
  89. TEST_F(EventFilterUnittest, RemovingAnEventMatcherStopsItMatching) {
  90. int id = event_filter_.AddEventMatcher("event1", AllURLs());
  91. event_filter_.RemoveEventMatcher(id);
  92. std::set<int> matches =
  93. event_filter_.MatchEvent("event1", empty_event_, MSG_ROUTING_NONE);
  94. ASSERT_TRUE(matches.empty());
  95. }
  96. TEST_F(EventFilterUnittest, MultipleEventMatches) {
  97. int id1 = event_filter_.AddEventMatcher("event1", AllURLs());
  98. int id2 = event_filter_.AddEventMatcher("event1", AllURLs());
  99. std::set<int> matches =
  100. event_filter_.MatchEvent("event1", google_event_, MSG_ROUTING_NONE);
  101. ASSERT_EQ(2u, matches.size());
  102. ASSERT_EQ(1u, matches.count(id1));
  103. ASSERT_EQ(1u, matches.count(id2));
  104. }
  105. TEST_F(EventFilterUnittest, TestURLMatching) {
  106. mojom::EventFilteringInfo info;
  107. info.url = GURL("http://www.google.com");
  108. int id = event_filter_.AddEventMatcher("event1",
  109. HostSuffixMatcher("google.com"));
  110. std::set<int> matches =
  111. event_filter_.MatchEvent("event1", info, MSG_ROUTING_NONE);
  112. ASSERT_EQ(1u, matches.size());
  113. ASSERT_EQ(1u, matches.count(id));
  114. }
  115. TEST_F(EventFilterUnittest, TestMultipleURLFiltersMatchOnAny) {
  116. base::Value::List filters;
  117. filters.Append(HostSuffixDict("google.com"));
  118. filters.Append(HostSuffixDict("yahoo.com"));
  119. std::unique_ptr<EventMatcher> matcher(
  120. MatcherFromURLFilterList(std::move(filters)));
  121. int id = event_filter_.AddEventMatcher("event1", std::move(matcher));
  122. {
  123. std::set<int> matches =
  124. event_filter_.MatchEvent("event1", google_event_, MSG_ROUTING_NONE);
  125. ASSERT_EQ(1u, matches.size());
  126. ASSERT_EQ(1u, matches.count(id));
  127. }
  128. {
  129. std::set<int> matches =
  130. event_filter_.MatchEvent("event1", yahoo_event_, MSG_ROUTING_NONE);
  131. ASSERT_EQ(1u, matches.size());
  132. ASSERT_EQ(1u, matches.count(id));
  133. }
  134. {
  135. std::set<int> matches =
  136. event_filter_.MatchEvent("event1", random_url_event_, MSG_ROUTING_NONE);
  137. ASSERT_EQ(0u, matches.size());
  138. }
  139. }
  140. TEST_F(EventFilterUnittest, TestStillMatchesAfterRemoval) {
  141. int id1 = event_filter_.AddEventMatcher("event1", AllURLs());
  142. int id2 = event_filter_.AddEventMatcher("event1", AllURLs());
  143. event_filter_.RemoveEventMatcher(id1);
  144. {
  145. std::set<int> matches =
  146. event_filter_.MatchEvent("event1", google_event_, MSG_ROUTING_NONE);
  147. ASSERT_EQ(1u, matches.size());
  148. ASSERT_EQ(1u, matches.count(id2));
  149. }
  150. }
  151. TEST_F(EventFilterUnittest, TestMatchesOnlyAgainstPatternsForCorrectEvent) {
  152. int id1 = event_filter_.AddEventMatcher("event1", AllURLs());
  153. event_filter_.AddEventMatcher("event2", AllURLs());
  154. {
  155. std::set<int> matches =
  156. event_filter_.MatchEvent("event1", google_event_, MSG_ROUTING_NONE);
  157. ASSERT_EQ(1u, matches.size());
  158. ASSERT_EQ(1u, matches.count(id1));
  159. }
  160. }
  161. TEST_F(EventFilterUnittest, TestGetMatcherCountForEvent) {
  162. ASSERT_EQ(0, event_filter_.GetMatcherCountForEventForTesting("event1"));
  163. int id1 = event_filter_.AddEventMatcher("event1", AllURLs());
  164. ASSERT_EQ(1, event_filter_.GetMatcherCountForEventForTesting("event1"));
  165. int id2 = event_filter_.AddEventMatcher("event1", AllURLs());
  166. ASSERT_EQ(2, event_filter_.GetMatcherCountForEventForTesting("event1"));
  167. event_filter_.RemoveEventMatcher(id1);
  168. ASSERT_EQ(1, event_filter_.GetMatcherCountForEventForTesting("event1"));
  169. event_filter_.RemoveEventMatcher(id2);
  170. ASSERT_EQ(0, event_filter_.GetMatcherCountForEventForTesting("event1"));
  171. }
  172. TEST_F(EventFilterUnittest, RemoveEventMatcherReturnsEventName) {
  173. int id1 = event_filter_.AddEventMatcher("event1", AllURLs());
  174. int id2 = event_filter_.AddEventMatcher("event1", AllURLs());
  175. int id3 = event_filter_.AddEventMatcher("event2", AllURLs());
  176. ASSERT_EQ("event1", event_filter_.RemoveEventMatcher(id1));
  177. ASSERT_EQ("event1", event_filter_.RemoveEventMatcher(id2));
  178. ASSERT_EQ("event2", event_filter_.RemoveEventMatcher(id3));
  179. }
  180. TEST_F(EventFilterUnittest, InvalidURLFilterCantBeAdded) {
  181. base::Value::List filter_list;
  182. filter_list.Append(base::Value::List()); // Should be a dict.
  183. std::unique_ptr<EventMatcher> matcher(
  184. MatcherFromURLFilterList(std::move(filter_list)));
  185. int id1 = event_filter_.AddEventMatcher("event1", std::move(matcher));
  186. EXPECT_TRUE(event_filter_.IsURLMatcherEmptyForTesting());
  187. ASSERT_EQ(-1, id1);
  188. }
  189. TEST_F(EventFilterUnittest, EmptyListOfURLFiltersMatchesAllURLs) {
  190. std::unique_ptr<EventMatcher> matcher(
  191. MatcherFromURLFilterList(base::Value::List()));
  192. int id = event_filter_.AddEventMatcher("event1", std::move(matcher));
  193. std::set<int> matches =
  194. event_filter_.MatchEvent("event1", google_event_, MSG_ROUTING_NONE);
  195. ASSERT_EQ(1u, matches.size());
  196. ASSERT_EQ(1u, matches.count(id));
  197. }
  198. TEST_F(EventFilterUnittest,
  199. InternalURLMatcherShouldBeEmptyWhenThereAreNoEventMatchers) {
  200. ASSERT_TRUE(event_filter_.IsURLMatcherEmptyForTesting());
  201. int id = event_filter_.AddEventMatcher("event1",
  202. HostSuffixMatcher("google.com"));
  203. ASSERT_FALSE(event_filter_.IsURLMatcherEmptyForTesting());
  204. event_filter_.RemoveEventMatcher(id);
  205. ASSERT_TRUE(event_filter_.IsURLMatcherEmptyForTesting());
  206. }
  207. TEST_F(EventFilterUnittest, EmptyURLsShouldBeMatchedByEmptyURLFilters) {
  208. int id = event_filter_.AddEventMatcher("event1", AllURLs());
  209. std::set<int> matches =
  210. event_filter_.MatchEvent("event1", empty_url_event_, MSG_ROUTING_NONE);
  211. ASSERT_EQ(1u, matches.size());
  212. ASSERT_EQ(1u, matches.count(id));
  213. }
  214. TEST_F(EventFilterUnittest,
  215. EmptyURLsShouldBeMatchedByEmptyURLFiltersWithAnEmptyItem) {
  216. std::unique_ptr<EventMatcher> matcher(
  217. MatcherFromURLFilterList(ValueAsList(base::Value(base::Value::Dict()))));
  218. int id = event_filter_.AddEventMatcher("event1", std::move(matcher));
  219. std::set<int> matches =
  220. event_filter_.MatchEvent("event1", empty_url_event_, MSG_ROUTING_NONE);
  221. ASSERT_EQ(1u, matches.size());
  222. ASSERT_EQ(1u, matches.count(id));
  223. }
  224. } // namespace extensions