optimization_filter_unittest.cc 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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/optimization_filter.h"
  5. #include "components/optimization_guide/core/bloom_filter.h"
  6. #include "testing/gtest/include/gtest/gtest.h"
  7. #include "url/gurl.h"
  8. namespace optimization_guide {
  9. namespace {
  10. std::unique_ptr<BloomFilter> CreateBloomFilter() {
  11. std::unique_ptr<BloomFilter> filter = std::make_unique<BloomFilter>(
  12. 7 /* num_hash_functions */, 8191 /* num_bits */);
  13. return filter;
  14. }
  15. std::unique_ptr<RegexpList> CreateRegexps(
  16. const std::vector<std::string>& regexps) {
  17. std::unique_ptr<RegexpList> regexp_list = std::make_unique<RegexpList>();
  18. for (const std::string& regexp : regexps) {
  19. regexp_list->emplace_back(std::make_unique<re2::RE2>(regexp));
  20. }
  21. return regexp_list;
  22. }
  23. TEST(OptimizationFilterTest, TestMatchesBloomFilter) {
  24. std::unique_ptr<BloomFilter> bloom_filter(CreateBloomFilter());
  25. bloom_filter->Add("fooco.co.uk");
  26. OptimizationFilter opt_filter(std::move(bloom_filter), /*regexps=*/nullptr,
  27. /*exclusion_regexps=*/nullptr,
  28. /*skip_host_suffix_checking=*/false);
  29. EXPECT_TRUE(opt_filter.Matches(GURL("http://shopping.fooco.co.uk")));
  30. EXPECT_TRUE(
  31. opt_filter.Matches(GURL("https://shopping.fooco.co.uk/somepath")));
  32. EXPECT_TRUE(opt_filter.Matches(GURL("https://fooco.co.uk")));
  33. EXPECT_FALSE(opt_filter.Matches(GURL("https://nonfooco.co.uk")));
  34. }
  35. TEST(OptimizationFilterTest, TestMatchesBloomFilterChecksRegexpFirst) {
  36. std::unique_ptr<RegexpList> exclusion_regexps(CreateRegexps({"shopping"}));
  37. std::unique_ptr<BloomFilter> bloom_filter(CreateBloomFilter());
  38. bloom_filter->Add("google.com");
  39. OptimizationFilter opt_filter(std::move(bloom_filter), /*regexps=*/nullptr,
  40. std::move(exclusion_regexps),
  41. /*skip_host_suffix_checking=*/false);
  42. EXPECT_FALSE(opt_filter.Matches(GURL("http://shopping.google.com")));
  43. EXPECT_TRUE(opt_filter.Matches(GURL("http://www.google.com")));
  44. }
  45. TEST(OptimizationFilterTest, TestMatchesBloomFilterSkipHostSuffixChecking) {
  46. std::unique_ptr<BloomFilter> bloom_filter(CreateBloomFilter());
  47. bloom_filter->Add("fooco.co.uk");
  48. OptimizationFilter opt_filter(std::move(bloom_filter), /*regexps=*/nullptr,
  49. /*exclusion_regexps=*/nullptr,
  50. /*skip_host_suffix_checking=*/true);
  51. EXPECT_TRUE(opt_filter.Matches(GURL("https://fooco.co.uk/somepath")));
  52. EXPECT_TRUE(opt_filter.Matches(GURL("https://fooco.co.uk")));
  53. EXPECT_FALSE(opt_filter.Matches(GURL("http://shopping.fooco.co.uk")));
  54. EXPECT_FALSE(opt_filter.Matches(GURL("https://nonfooco.co.uk")));
  55. }
  56. TEST(OptimizationFilterTest, TestMatchesRegexp) {
  57. std::unique_ptr<RegexpList> regexps(CreateRegexps({"test"}));
  58. OptimizationFilter opt_filter(/*bloom_filter=*/nullptr, std::move(regexps),
  59. /*exclusion_regexps=*/nullptr,
  60. /*skip_host_suffix_checking=*/false);
  61. EXPECT_TRUE(opt_filter.Matches(GURL("http://test.com")));
  62. EXPECT_TRUE(opt_filter.Matches(GURL("https://shopping.com/test")));
  63. EXPECT_TRUE(opt_filter.Matches(GURL("https://shopping.com/?query=test")));
  64. EXPECT_FALSE(opt_filter.Matches(GURL("https://shopping.com/")));
  65. }
  66. TEST(OptimizationFilterTest, TestMatchesRegexpFragment) {
  67. std::unique_ptr<RegexpList> regexps(CreateRegexps({"test"}));
  68. OptimizationFilter opt_filter(/*bloom_filter=*/nullptr, std::move(regexps),
  69. /*exclusion_regexps=*/nullptr,
  70. /*skip_host_suffix_checking=*/false);
  71. // Fragments are not matched.
  72. EXPECT_FALSE(opt_filter.Matches(GURL("https://shopping.com/#test")));
  73. }
  74. TEST(OptimizationFilterTest, TestMatchesRegexpInvalid) {
  75. std::unique_ptr<RegexpList> regexps(CreateRegexps({"test[", "shop"}));
  76. OptimizationFilter opt_filter(/*bloom_filter=*/nullptr, std::move(regexps),
  77. /*exclusion_regexps=*/nullptr,
  78. /*skip_host_suffix_checking=*/false);
  79. // Invalid regexps are not used
  80. EXPECT_FALSE(opt_filter.Matches(GURL("https://test.com/")));
  81. EXPECT_TRUE(opt_filter.Matches(GURL("https://shopping.com/")));
  82. }
  83. TEST(OptimizationFilterTest, TestMatchesRegexpInvalidGURL) {
  84. std::unique_ptr<RegexpList> regexps(CreateRegexps({"test"}));
  85. OptimizationFilter opt_filter(/*bloom_filter=*/nullptr, std::move(regexps),
  86. /*exclusion_regexps=*/nullptr,
  87. /*skip_host_suffix_checking=*/false);
  88. // Invalid urls are not matched.
  89. EXPECT_FALSE(opt_filter.Matches(GURL("test")));
  90. }
  91. TEST(OptimizationFilterTest, TestMatchesMaxSuffix) {
  92. std::unique_ptr<BloomFilter> bloom_filter(CreateBloomFilter());
  93. bloom_filter->Add("one.two.three.four.co.uk");
  94. bloom_filter->Add("one.two.three.four.five.co.uk");
  95. OptimizationFilter opt_filter(std::move(bloom_filter), /*regexps=*/nullptr,
  96. /*exclusion_regexps=*/nullptr,
  97. /*skip_host_suffix_checking=*/false);
  98. EXPECT_TRUE(opt_filter.Matches(GURL("http://host.one.two.three.four.co.uk")));
  99. EXPECT_FALSE(
  100. opt_filter.Matches(GURL("http://host.one.two.three.four.five.co.uk")));
  101. // Note: full host will match even if more than 5 elements.
  102. EXPECT_TRUE(opt_filter.Matches(GURL("http://one.two.three.four.five.co.uk")));
  103. }
  104. TEST(OptimizationFilterTest, TestMatchesMinSuffix) {
  105. std::unique_ptr<BloomFilter> bloom_filter(CreateBloomFilter());
  106. bloom_filter->Add("abc.tv");
  107. bloom_filter->Add("xy.tv");
  108. OptimizationFilter opt_filter(std::move(bloom_filter), /*regexps=*/nullptr,
  109. /*exclusion_regexps=*/nullptr,
  110. /*skip_host_suffix_checking=*/false);
  111. EXPECT_TRUE(opt_filter.Matches(GURL("https://abc.tv")));
  112. EXPECT_TRUE(opt_filter.Matches(GURL("https://host.abc.tv")));
  113. EXPECT_FALSE(opt_filter.Matches(GURL("https://host.xy.tv")));
  114. // Note: full host will match even if less than min size.
  115. EXPECT_TRUE(opt_filter.Matches(GURL("https://xy.tv")));
  116. EXPECT_FALSE(opt_filter.Matches(GURL("http://.../foo")));
  117. }
  118. } // namespace
  119. } // namespace optimization_guide