url_pattern_unittest.cc 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. // Copyright 2016 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 "components/url_pattern_index/url_pattern.h"
  5. #include "testing/gtest/include/gtest/gtest.h"
  6. #include "url/gurl.h"
  7. namespace url_pattern_index {
  8. namespace {
  9. constexpr proto::AnchorType kAnchorNone = proto::ANCHOR_TYPE_NONE;
  10. constexpr proto::AnchorType kBoundary = proto::ANCHOR_TYPE_BOUNDARY;
  11. constexpr proto::AnchorType kSubdomain = proto::ANCHOR_TYPE_SUBDOMAIN;
  12. constexpr UrlPattern::MatchCase kMatchCase = UrlPattern::MatchCase::kTrue;
  13. constexpr UrlPattern::MatchCase kDonotMatchCase = UrlPattern::MatchCase::kFalse;
  14. } // namespace
  15. TEST(UrlPatternTest, MatchesUrl) {
  16. const struct {
  17. UrlPattern url_pattern;
  18. const char* url;
  19. bool expect_match;
  20. } kTestCases[] = {
  21. {{"", proto::URL_PATTERN_TYPE_SUBSTRING}, "http://ex.com/", true},
  22. {{"", proto::URL_PATTERN_TYPE_WILDCARDED}, "http://ex.com/", true},
  23. {{"", kBoundary, kAnchorNone}, "http://ex.com/", true},
  24. {{"", kSubdomain, kAnchorNone}, "http://ex.com/", true},
  25. {{"", kSubdomain, kAnchorNone}, "http://ex.com/", true},
  26. {{"^", kSubdomain, kAnchorNone}, "http://ex.com/", false},
  27. {{".", kSubdomain, kAnchorNone}, "http://ex.com/", false},
  28. {{"", kAnchorNone, kBoundary}, "http://ex.com/", true},
  29. {{"^", kAnchorNone, kBoundary}, "http://ex.com/", true},
  30. {{".", kAnchorNone, kBoundary}, "http://ex.com/", false},
  31. {{"", kBoundary, kBoundary}, "http://ex.com/", false},
  32. {{"", kSubdomain, kBoundary}, "http://ex.com/", false},
  33. {{"com/", kSubdomain, kBoundary}, "http://ex.com/", true},
  34. {{"xampl", proto::URL_PATTERN_TYPE_SUBSTRING},
  35. "http://example.com",
  36. true},
  37. {{"example", proto::URL_PATTERN_TYPE_SUBSTRING},
  38. "http://example.com",
  39. true},
  40. {{"/a?a"}, "http://ex.com/a?a", true},
  41. {{"^abc"}, "http://ex.com/abc?a", true},
  42. {{"^abc"}, "http://ex.com/a?abc", true},
  43. {{"^abc"}, "http://ex.com/abc?abc", true},
  44. {{"^abc^abc"}, "http://ex.com/abc?abc", true},
  45. {{"^com^abc^abc"}, "http://ex.com/abc?abc", false},
  46. {{"http://ex", kBoundary, kAnchorNone}, "http://example.com", true},
  47. {{"http://ex", kAnchorNone, kAnchorNone}, "http://example.com", true},
  48. {{"mple.com/", kAnchorNone, kBoundary}, "http://example.com", true},
  49. {{"mple.com/", kAnchorNone, kAnchorNone}, "http://example.com", true},
  50. {{"mple.com/", kSubdomain, kAnchorNone}, "http://example.com", false},
  51. {{"ex.com", kSubdomain, kAnchorNone}, "http://hex.com", false},
  52. {{"ex.com", kSubdomain, kAnchorNone}, "http://ex.com", true},
  53. {{"ex.com", kSubdomain, kAnchorNone}, "http://hex.ex.com", true},
  54. {{"ex.com", kSubdomain, kAnchorNone}, "http://hex.hex.com", false},
  55. // Note: "example.com" will be normalized into "example.com/".
  56. {{"example.com^", kSubdomain, kAnchorNone},
  57. "http://www.example.com",
  58. true},
  59. {{"http://*mpl", kBoundary, kAnchorNone}, "http://example.com", true},
  60. {{"mpl*com/", kAnchorNone, kBoundary}, "http://example.com", true},
  61. {{"example^com"}, "http://example.com", false},
  62. {{"example^com"}, "http://example/com", true},
  63. {{"example.com^"}, "http://example.com:8080", true},
  64. {{"http*.com/", kBoundary, kBoundary}, "http://example.com", true},
  65. {{"http*.org/", kBoundary, kBoundary}, "http://example.com", false},
  66. {{"/path?*&p1=*&p2="}, "http://ex.com/aaa/path/bbb?k=v&p1=0&p2=1", false},
  67. {{"/path?*&p1=*&p2="}, "http://ex.com/aaa/path?k=v&p1=0&p2=1", true},
  68. {{"/path?*&p1=*&p2="}, "http://ex.com/aaa/path?k=v&k=v&p1=0&p2=1", true},
  69. {{"/path?*&p1=*&p2="},
  70. "http://ex.com/aaa/path?k=v&p1=0&p3=10&p2=1",
  71. true},
  72. {{"/path?*&p1=*&p2="}, "http://ex.com/aaa/path&p1=0&p2=1", false},
  73. {{"/path?*&p1=*&p2="}, "http://ex.com/aaa/path?k=v&p2=0&p1=1", false},
  74. {{"abc*def*ghijk*xyz"},
  75. "http://example.com/abcdeffffghijkmmmxyzzz",
  76. true},
  77. {{"abc*cdef"}, "http://example.com/abcdef", false},
  78. {{"^^a^^"}, "http://ex.com/?a=/", true},
  79. {{"^^a^^"}, "http://ex.com/?a=/&b=0", true},
  80. {{"^^a^^"}, "http://ex.com/?a=x", false},
  81. // The last ^ matches the end of the url.
  82. {{"^^a^^"}, "http://ex.com/?a=", true},
  83. {{"ex.com^path^*k=v^"}, "http://ex.com/path/?k1=v1&ak=v&kk=vv", true},
  84. {{"ex.com^path^*k=v^"}, "http://ex.com/p/path/?k1=v1&ak=v&kk=vv", false},
  85. {{"a^a&a^a&"}, "http://ex.com/a/a/a/a/?a&a&a&a&a", true},
  86. {{"abc*def^"}, "http://ex.com/abc/a/ddef/", true},
  87. {{"https://example.com/"}, "http://example.com/", false},
  88. {{"example.com/", kSubdomain, kAnchorNone}, "http://example.com/", true},
  89. {{"examp", kSubdomain, kAnchorNone}, "http://example.com/", true},
  90. {{"xamp", kSubdomain, kAnchorNone}, "http://example.com/", false},
  91. {{"examp", kSubdomain, kAnchorNone}, "http://test.example.com/", true},
  92. {{"t.examp", kSubdomain, kAnchorNone}, "http://test.example.com/", false},
  93. {{"com^", kSubdomain, kAnchorNone}, "http://test.example.com/", true},
  94. {{"com^x", kSubdomain, kBoundary}, "http://a.com/x", true},
  95. {{"x.com", kSubdomain, kAnchorNone}, "http://ex.com/?url=x.com", false},
  96. {{"ex.com/", kSubdomain, kBoundary}, "http://ex.com/", true},
  97. {{"ex.com^", kSubdomain, kBoundary}, "http://ex.com/", true},
  98. {{"ex.co", kSubdomain, kBoundary}, "http://ex.com/", false},
  99. {{"ex.com", kSubdomain, kBoundary}, "http://rex.com.ex.com/", false},
  100. {{"ex.com/", kSubdomain, kBoundary}, "http://rex.com.ex.com/", true},
  101. {{"http", kSubdomain, kBoundary}, "http://http.com/", false},
  102. {{"http", kSubdomain, kAnchorNone}, "http://http.com/", true},
  103. {{"/example.com", kSubdomain, kBoundary}, "http://example.com/", false},
  104. {{"/example.com/", kSubdomain, kBoundary}, "http://example.com/", false},
  105. {{".", kSubdomain, kAnchorNone}, "http://a..com/", true},
  106. {{"^", kSubdomain, kAnchorNone}, "http://a..com/", false},
  107. {{".", kSubdomain, kAnchorNone}, "http://a.com./", false},
  108. {{"^", kSubdomain, kAnchorNone}, "http://a.com./", true},
  109. {{".", kSubdomain, kAnchorNone}, "http://a.com../", true},
  110. {{"^", kSubdomain, kAnchorNone}, "http://a.com../", true},
  111. {{"/path", kSubdomain, kAnchorNone}, "http://a.com./path/to/x", true},
  112. {{"^path", kSubdomain, kAnchorNone}, "http://a.com./path/to/x", true},
  113. {{"/path", kSubdomain, kBoundary}, "http://a.com./path", true},
  114. {{"^path", kSubdomain, kBoundary}, "http://a.com./path", true},
  115. {{"path", kSubdomain, kBoundary}, "http://a.com./path", false},
  116. // Case-sensitivity tests.
  117. {{"path", proto::URL_PATTERN_TYPE_SUBSTRING, kDonotMatchCase},
  118. "http://a.com/PaTh",
  119. true},
  120. {{"path", proto::URL_PATTERN_TYPE_SUBSTRING, kMatchCase},
  121. "http://a.com/PaTh",
  122. false},
  123. {{"path", proto::URL_PATTERN_TYPE_SUBSTRING, kDonotMatchCase},
  124. "http://a.com/path",
  125. true},
  126. {{"path", proto::URL_PATTERN_TYPE_SUBSTRING, kMatchCase},
  127. "http://a.com/path",
  128. true},
  129. {{"abc*def^", proto::URL_PATTERN_TYPE_WILDCARDED, kMatchCase},
  130. "http://a.com/abcxAdef/vo",
  131. true},
  132. {{"abc*def^", proto::URL_PATTERN_TYPE_WILDCARDED, kMatchCase},
  133. "http://a.com/aBcxAdeF/vo",
  134. false},
  135. {{"abc*def^", proto::URL_PATTERN_TYPE_WILDCARDED, kDonotMatchCase},
  136. "http://a.com/aBcxAdeF/vo",
  137. true},
  138. {{"abc*def^", proto::URL_PATTERN_TYPE_WILDCARDED, kDonotMatchCase},
  139. "http://a.com/abcxAdef/vo",
  140. true},
  141. {{"abc^", kAnchorNone, kAnchorNone}, "https://xyz.com/abc/123", true},
  142. {{"abc^", kAnchorNone, kAnchorNone}, "https://xyz.com/abc", true},
  143. {{"abc^", kAnchorNone, kAnchorNone}, "https://abc.com", false},
  144. {{"abc^", kAnchorNone, kBoundary}, "https://xyz.com/abc/", true},
  145. {{"abc^", kAnchorNone, kBoundary}, "https://xyz.com/abc", true},
  146. {{"abc^", kAnchorNone, kBoundary}, "https://xyz.com/abc/123", false},
  147. {{"http://abc.com/x^", kBoundary, kAnchorNone}, "http://abc.com/x", true},
  148. {{"http://abc.com/x^", kBoundary, kAnchorNone},
  149. "http://abc.com/x/",
  150. true},
  151. {{"http://abc.com/x^", kBoundary, kAnchorNone},
  152. "http://abc.com/x/123",
  153. true},
  154. {{"http://abc.com/x^", kBoundary, kBoundary}, "http://abc.com/x", true},
  155. {{"http://abc.com/x^", kBoundary, kBoundary}, "http://abc.com/x/", true},
  156. {{"http://abc.com/x^", kBoundary, kBoundary},
  157. "http://abc.com/x/123",
  158. false},
  159. {{"abc.com^", kSubdomain, kAnchorNone}, "http://xyz.abc.com/123", true},
  160. {{"abc.com^", kSubdomain, kAnchorNone}, "http://xyz.abc.com", true},
  161. {{"abc.com^", kSubdomain, kAnchorNone},
  162. "http://abc.com.xyz.com?q=abc.com",
  163. false},
  164. {{"abc.com^", kSubdomain, kBoundary}, "http://xyz.abc.com/123", false},
  165. {{"abc.com^", kSubdomain, kBoundary}, "http://xyz.abc.com", true},
  166. {{"abc.com^", kSubdomain, kBoundary},
  167. "http://abc.com.xyz.com?q=abc.com/",
  168. false},
  169. {{"abc*^", kAnchorNone, kAnchorNone}, "https://abc.com", true},
  170. {{"abc*^", kAnchorNone, kAnchorNone}, "https://abc.com?q=123", true},
  171. {{"abc*^", kAnchorNone, kBoundary}, "https://abc.com", true},
  172. {{"abc*^", kAnchorNone, kBoundary}, "https://abc.com?q=123", true},
  173. {{"abc*", kAnchorNone, kBoundary}, "https://a.com/abcxyz", true},
  174. {{"*google.com", kBoundary, kAnchorNone}, "https://www.google.com", true},
  175. {{"*", kBoundary, kBoundary}, "https://example.com", true},
  176. {{"", kBoundary, kBoundary}, "https://example.com", false},
  177. };
  178. for (const auto& test_case : kTestCases) {
  179. SCOPED_TRACE(testing::Message() << "Rule: " << test_case.url_pattern
  180. << "; URL: " << GURL(test_case.url));
  181. GURL url(test_case.url);
  182. const bool is_match =
  183. test_case.url_pattern.MatchesUrl(UrlPattern::UrlInfo(url));
  184. EXPECT_EQ(test_case.expect_match, is_match);
  185. }
  186. }
  187. } // namespace url_pattern_index