url_pattern_with_wildcards_unittest.cc 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. // Copyright 2018 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/optimization_guide/core/url_pattern_with_wildcards.h"
  5. #include <string>
  6. #include "testing/gtest/include/gtest/gtest.h"
  7. namespace optimization_guide {
  8. namespace {
  9. TEST(URLPatternWithWildcardsTest, OnePattern) {
  10. URLPatternWithWildcards url_pattern_with_wildcards("foo.jpg");
  11. const struct {
  12. std::string url;
  13. bool expect_matches;
  14. } tests[] = {
  15. {"https://www.example.com/", false},
  16. {"https://www.example.com/foo.js", false},
  17. {"https://www.example.com/foo.jpg", true},
  18. {"https://www.example.com/pages/foo.jpg", true},
  19. {"https://www.example.com/foobar.jpg", false},
  20. {"https://www.example.com/barfoo.jpg", true},
  21. {"http://www.example.com/foo.jpg", true},
  22. {"http://www.example.com/foo.jpg?q=alpha", true},
  23. {"http://www.example.com/bar.jpg?q=foo.jpg", true},
  24. {"http://www.example.com/bar.jpg?q=foo.jpg#foo.jpg", true},
  25. };
  26. for (const auto& test : tests) {
  27. EXPECT_EQ(test.expect_matches,
  28. url_pattern_with_wildcards.Matches(test.url));
  29. }
  30. }
  31. TEST(URLPatternWithWildcardsTest, OnePatternWithOneWildcard) {
  32. URLPatternWithWildcards url_pattern_with_wildcards(
  33. "example.com/bar/*/foo.jpg");
  34. const struct {
  35. std::string url;
  36. bool expect_matches;
  37. } tests[] = {
  38. {"https://www.example.com/", false},
  39. {"https://www.example.com/foo.js", false},
  40. {"https://www.example.com/foo.jpg", false},
  41. {"https://www.example.com/pages/foo.jpg", false},
  42. {"https://www.example.com/foobar.jpg", false},
  43. {"https://www.example.com/barfoo.jpg", false},
  44. {"http://www.example.com/foo.jpg", false},
  45. {"http://www.example.com/foo.jpg?q=alpha", false},
  46. {"http://www.example.com/bar.jpg?q=foo.jpg", false},
  47. {"http://www.example.com/bar.jpg?q=foo.jpg#foo.jpg", false},
  48. {"https://www.example.com/bar/foo.jpg", false},
  49. {"https://www.example.com/bar/pages/foo.jpg", true},
  50. {"https://www.example.com/bar/main_page/foo.jpg", true},
  51. {"https://www.example.com/bar/pages/subpages/foo.jpg", true},
  52. // Try different prefixes.
  53. {"https://m.example.com/bar/main_page/foo.jpg", true},
  54. {"https://in.example.com/bar/main_page/foo.jpg", true},
  55. };
  56. for (const auto& test : tests) {
  57. EXPECT_EQ(test.expect_matches,
  58. url_pattern_with_wildcards.Matches(test.url));
  59. }
  60. }
  61. TEST(URLPatternWithWildcardsTest, OnePatternWithOneWildcardAtEnds) {
  62. URLPatternWithWildcards url_pattern_with_wildcards("*example.com/bar/*");
  63. const struct {
  64. std::string url;
  65. bool expect_matches;
  66. } tests[] = {
  67. {"https://www.example.com/", false},
  68. {"https://www.example.com/foo.js", false},
  69. {"https://www.example.com/foo.jpg", false},
  70. {"https://www.example.com/pages/foo.jpg", false},
  71. {"https://www.example.com/foobar.jpg", false},
  72. {"https://www.example.com/barfoo.jpg", false},
  73. {"http://www.example.com/foo.jpg", false},
  74. {"http://www.example.com/foo.jpg?q=alpha", false},
  75. {"http://www.example.com/bar.jpg?q=foo.jpg", false},
  76. {"http://www.example.com/bar.jpg?q=foo.jpg#foo.jpg", false},
  77. {"https://www.example.com/bar/foo.jpg", true},
  78. {"https://www.example.com/bar/pages/foo.jpg", true},
  79. {"https://www.example.com/bar/main_page/foo.jpg", true},
  80. {"https://www.example.com/bar/pages/subpages/foo.jpg", true},
  81. // Try different prefixes.
  82. {"https://m.example.com/bar/main_page/foo.jpg", true},
  83. {"https://in.example.com/bar/main_page/foo.jpg", true},
  84. };
  85. for (const auto& test : tests) {
  86. EXPECT_EQ(test.expect_matches,
  87. url_pattern_with_wildcards.Matches(test.url));
  88. }
  89. }
  90. TEST(URLPatternWithWildcardsTest, OnePatternWithOneWildcardAndScheme) {
  91. URLPatternWithWildcards url_pattern_with_wildcards(
  92. "https://www.example.com/bar/*/foo.jpg");
  93. const struct {
  94. std::string url;
  95. bool expect_matches;
  96. } tests[] = {
  97. {"https://www.example.com/", false},
  98. {"https://www.example.com/foo.js", false},
  99. {"https://www.example.com/foo.jpg", false},
  100. {"https://www.example.com/pages/foo.jpg", false},
  101. {"https://www.example.com/foobar.jpg", false},
  102. {"https://www.example.com/barfoo.jpg", false},
  103. {"http://www.example.com/foo.jpg", false},
  104. {"http://www.example.com/foo.jpg?q=alpha", false},
  105. {"http://www.example.com/bar.jpg?q=foo.jpg", false},
  106. {"http://www.example.com/bar.jpg?q=foo.jpg#foo.jpg", false},
  107. {"https://www.example.com/bar/foo.jpg", false},
  108. {"https://www.example.com/bar/pages/foo.jpg", true},
  109. {"https://www.example.com/bar/main_page/foo.jpg", true},
  110. {"https://www.example.com/bar/pages/subpages/foo.jpg", true},
  111. // Different scheme.
  112. {"http://www.example.com/bar/pages/foo.jpg", false},
  113. };
  114. for (const auto& test : tests) {
  115. EXPECT_EQ(test.expect_matches,
  116. url_pattern_with_wildcards.Matches(test.url));
  117. }
  118. }
  119. TEST(URLPatternWithWildcardsTest, OnePatternWithMultipleWildcards) {
  120. URLPatternWithWildcards url_pattern_with_wildcards(
  121. "example.com/bar/*/pages/*/*.jpg");
  122. const struct {
  123. std::string url;
  124. bool expect_matches;
  125. } tests[] = {
  126. {"https://www.example.com/", false},
  127. {"https://www.example.com/foo.js", false},
  128. {"https://www.example.com/foo.jpg", false},
  129. {"https://www.example.com/pages/foo.jpg", false},
  130. {"https://www.example.com/foobar.jpg", false},
  131. {"https://www.example.com/barfoo.jpg", false},
  132. {"http://www.example.com/foo.jpg", false},
  133. {"http://www.example.com/foo.jpg?q=alpha", false},
  134. {"http://www.example.com/bar.jpg?q=foo.jpg", false},
  135. {"http://www.example.com/bar.jpg?q=foo.jpg#foo.jpg", false},
  136. {"https://www.example.com/bar/foo.jpg", false},
  137. {"https://www.example.com/bar/pages/foo.jpg", false},
  138. {"https://www.example.com/bar/main_page/foo.jpg", false},
  139. {"https://www.example.com/bar/pages/subpages/foo.jpg", false},
  140. {"https://www.example.com/bar/main/pages/document/foo.jpg", true},
  141. {"https://www.example.com/bar/main/pages/document/foo1.jpg", true},
  142. {"https://www.example.com/bar/main/pages/document/foo1.js", false},
  143. // Out-of-order subpatterns.
  144. {"https://cdn.com/pages/www.example.com/bar/document/foo.jpg", false},
  145. };
  146. for (const auto& test : tests) {
  147. EXPECT_EQ(test.expect_matches,
  148. url_pattern_with_wildcards.Matches(test.url));
  149. }
  150. }
  151. TEST(URLPatternWithWildcardsTest,
  152. OnePatternWithMultipleWildcardsImplicitSuffix) {
  153. URLPatternWithWildcards url_pattern_with_wildcards(
  154. "example.com/bar/*/pages/");
  155. const struct {
  156. std::string url;
  157. bool expect_matches;
  158. } tests[] = {
  159. {"https://www.example.com/", false},
  160. {"https://www.example.com/foo.js", false},
  161. {"https://www.example.com/foo.jpg", false},
  162. {"https://www.example.com/pages/foo.jpg", false},
  163. {"https://www.example.com/foobar.jpg", false},
  164. {"https://www.example.com/barfoo.jpg", false},
  165. {"http://www.example.com/foo.jpg", false},
  166. {"http://www.example.com/foo.jpg?q=alpha", false},
  167. {"http://www.example.com/bar.jpg?q=foo.jpg", false},
  168. {"http://www.example.com/bar.jpg?q=foo.jpg#foo.jpg", false},
  169. {"https://www.example.com/bar/foo.jpg", false},
  170. // No gap between "bar" and "pages".
  171. {"https://www.example.com/bar/pages/foo.jpg", false},
  172. {"https://www.example.com/bar/main_page/foo.jpg", false},
  173. // No gap between "bar" and "pages".
  174. {"https://www.example.com/bar/pages/subpages/foo.jpg", false},
  175. {"https://www.example.com/bar/main/pages/document/foo.jpg", true},
  176. {"https://www.example.com/bar/main/pages/document/foo1.jpg", true},
  177. {"https://www.example.com/bar/main/pages/document/foo1.js", true},
  178. // Out-of-order subpatterns.
  179. {"https://cdn.com/pages/www.example.com/bar/document/foo.jpg", false},
  180. };
  181. for (const auto& test : tests) {
  182. EXPECT_EQ(test.expect_matches, url_pattern_with_wildcards.Matches(test.url))
  183. << " url=" << test.url;
  184. }
  185. }
  186. } // namespace
  187. } // namespace optimization_guide