safety_tips_config_unittest.cc 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. // Copyright 2020 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/reputation/core/safety_tips_config.h"
  5. #include "components/reputation/core/safety_tip_test_utils.h"
  6. #include "testing/gtest/include/gtest/gtest.h"
  7. #include "url/gurl.h"
  8. namespace reputation {
  9. // Build an allowlist with testable scoped allowlist entries.
  10. void ConfigureAllowlistWithScopes() {
  11. auto config_proto = GetOrCreateSafetyTipsConfig();
  12. config_proto->clear_allowed_pattern();
  13. config_proto->clear_canonical_pattern();
  14. config_proto->clear_cohort();
  15. // Note that allowed_pattern *must* stay sorted.
  16. // error-canonical-index.tld has a cohort with an invalid allowed index.
  17. auto* pattern_bad_allowed = config_proto->add_allowed_pattern();
  18. pattern_bad_allowed->set_pattern("error-allowed-index.tld/");
  19. auto* cohort_bad_allowed = config_proto->add_cohort();
  20. cohort_bad_allowed->add_allowed_index(100);
  21. pattern_bad_allowed->add_cohort_index(0); // cohort_bad_allowed
  22. // error-canonical-index.tld has a cohort with an invalid canonical index.
  23. auto* pattern_bad_canonical = config_proto->add_allowed_pattern();
  24. pattern_bad_canonical->set_pattern("error-canonical-index.tld/");
  25. auto* cohort_bad_canonical = config_proto->add_cohort();
  26. cohort_bad_canonical->add_canonical_index(100);
  27. pattern_bad_canonical->add_cohort_index(1); // cohort_bad_canonical
  28. // error-cohort-index.tld has an invalid index.
  29. auto* pattern_bad_cohort = config_proto->add_allowed_pattern();
  30. pattern_bad_cohort->set_pattern("error-cohort-index.tld/");
  31. pattern_bad_cohort->add_cohort_index(100);
  32. // siteA.tld is only a canonical_pattern, so can't spoof anyone.
  33. config_proto->add_canonical_pattern()->set_pattern("sitea.tld/");
  34. // siteB.tld is only allowed to spoof siteA.tld and itself.
  35. auto* pattern_b = config_proto->add_allowed_pattern();
  36. pattern_b->set_pattern("siteb.tld/");
  37. auto* cohort_b = config_proto->add_cohort();
  38. cohort_b->add_allowed_index(3); // siteB
  39. cohort_b->add_canonical_index(0); // siteA
  40. pattern_b->add_cohort_index(2); // cohort_b
  41. // siteC.tld is allowed to spoof siteB.tld and itself.
  42. auto* pattern_c = config_proto->add_allowed_pattern();
  43. pattern_c->set_pattern("sitec.tld/");
  44. auto* cohort_c = config_proto->add_cohort();
  45. cohort_c->add_allowed_index(3); // siteB
  46. cohort_c->add_allowed_index(4); // siteC
  47. pattern_c->add_cohort_index(3); // cohort_c
  48. // siteD.tld is allowed to spoof anyone, so has no cohort.
  49. auto* pattern_d = config_proto->add_allowed_pattern();
  50. pattern_d->set_pattern("sited.tld/");
  51. // Implicitly, siteE.tld can't spoof anyone, since it isn't in the proto.
  52. SetSafetyTipsRemoteConfigProto(std::move(config_proto));
  53. }
  54. // Minimal test for an unscoped allowlist entry.
  55. TEST(SafetyTipsConfigTest, TestBasicUrlAllowlist) {
  56. SetSafetyTipAllowlistPatterns({"example.com/"}, {}, {});
  57. auto* config = GetSafetyTipsRemoteConfigProto();
  58. // Basic unscoped entries are allowed to spoof any ("canonical") domain.
  59. EXPECT_TRUE(IsUrlAllowlistedBySafetyTipsComponent(
  60. config, GURL("http://example.com"), GURL("http://example.com")));
  61. EXPECT_TRUE(IsUrlAllowlistedBySafetyTipsComponent(
  62. config, GURL("http://example.com"), GURL("http://example.org")));
  63. EXPECT_FALSE(IsUrlAllowlistedBySafetyTipsComponent(
  64. config, GURL("http://example.org"), GURL("http://example.org")));
  65. }
  66. // Tests for a scoped allowlist (i.e. entries not permitted to spoof anything).
  67. TEST(SafetyTipsConfigTest, TestScopedUrlAllowlist) {
  68. ConfigureAllowlistWithScopes();
  69. auto* config = GetSafetyTipsRemoteConfigProto();
  70. // Site A is only a canonical domain, so can't spoof anything.
  71. EXPECT_FALSE(IsUrlAllowlistedBySafetyTipsComponent(
  72. config, GURL("http://sitea.tld"), GURL("http://sitea.tld")));
  73. EXPECT_FALSE(IsUrlAllowlistedBySafetyTipsComponent(
  74. config, GURL("http://sitea.tld"), GURL("http://siteb.tld")));
  75. EXPECT_FALSE(IsUrlAllowlistedBySafetyTipsComponent(
  76. config, GURL("http://sitea.tld"), GURL("http://sitee.tld")));
  77. // Site B can spoof sites A & B, but not other stuff.
  78. EXPECT_TRUE(IsUrlAllowlistedBySafetyTipsComponent(
  79. config, GURL("http://siteb.tld"), GURL("http://sitea.tld")));
  80. EXPECT_TRUE(IsUrlAllowlistedBySafetyTipsComponent(
  81. config, GURL("http://siteb.tld"), GURL("http://siteb.tld")));
  82. EXPECT_FALSE(IsUrlAllowlistedBySafetyTipsComponent(
  83. config, GURL("http://siteb.tld"), GURL("http://sitec.tld")));
  84. EXPECT_FALSE(IsUrlAllowlistedBySafetyTipsComponent(
  85. config, GURL("http://siteb.tld"), GURL("http://sited.tld")));
  86. EXPECT_FALSE(IsUrlAllowlistedBySafetyTipsComponent(
  87. config, GURL("http://siteb.tld"), GURL("http://sitee.tld")));
  88. // Site C can spoof sites B and C, but not anything else.
  89. EXPECT_FALSE(IsUrlAllowlistedBySafetyTipsComponent(
  90. config, GURL("http://sitec.tld"), GURL("http://sitea.tld")));
  91. EXPECT_TRUE(IsUrlAllowlistedBySafetyTipsComponent(
  92. config, GURL("http://sitec.tld"), GURL("http://siteb.tld")));
  93. EXPECT_TRUE(IsUrlAllowlistedBySafetyTipsComponent(
  94. config, GURL("http://sitec.tld"), GURL("http://sitec.tld")));
  95. EXPECT_FALSE(IsUrlAllowlistedBySafetyTipsComponent(
  96. config, GURL("http://sitec.tld"), GURL("http://sited.tld")));
  97. EXPECT_FALSE(IsUrlAllowlistedBySafetyTipsComponent(
  98. config, GURL("http://sitec.tld"), GURL("http://sitee.tld")));
  99. // Site D has a wildcard, and can spoof anyone.
  100. EXPECT_TRUE(IsUrlAllowlistedBySafetyTipsComponent(
  101. config, GURL("http://sited.tld"), GURL("http://sitea.tld")));
  102. EXPECT_TRUE(IsUrlAllowlistedBySafetyTipsComponent(
  103. config, GURL("http://sited.tld"), GURL("http://siteb.tld")));
  104. EXPECT_TRUE(IsUrlAllowlistedBySafetyTipsComponent(
  105. config, GURL("http://sited.tld"), GURL("http://sitec.tld")));
  106. EXPECT_TRUE(IsUrlAllowlistedBySafetyTipsComponent(
  107. config, GURL("http://sited.tld"), GURL("http://sited.tld")));
  108. EXPECT_TRUE(IsUrlAllowlistedBySafetyTipsComponent(
  109. config, GURL("http://sited.tld"), GURL("http://sitee.tld")));
  110. // These sites all have invalid indices in their entries. Each should
  111. // invalidate the relevant part of their allowlist entry (i.e. act as if it's
  112. // not there), rather than crashing.
  113. EXPECT_FALSE(IsUrlAllowlistedBySafetyTipsComponent(
  114. config, GURL("http://error-cohort-index.tld"), GURL("http://sitea.tld")));
  115. EXPECT_FALSE(IsUrlAllowlistedBySafetyTipsComponent(
  116. config, GURL("http://error-canonical-index.tld"),
  117. GURL("http://sitea.tld")));
  118. EXPECT_FALSE(IsUrlAllowlistedBySafetyTipsComponent(
  119. config, GURL("http://error-allowed-index.tld"),
  120. GURL("http://sitea.tld")));
  121. }
  122. TEST(SafetyTipsConfigTest, TestTargetUrlAllowlist) {
  123. SetSafetyTipAllowlistPatterns({}, {"exa.*\\.com"}, {});
  124. auto* config = GetSafetyTipsRemoteConfigProto();
  125. EXPECT_TRUE(
  126. IsTargetHostAllowlistedBySafetyTipsComponent(config, "example.com"));
  127. EXPECT_FALSE(
  128. IsTargetHostAllowlistedBySafetyTipsComponent(config, "example.org"));
  129. }
  130. TEST(SafetyTipsConfigTest, TestCommonWords) {
  131. // IsCommonWordInConfigProto does a binary search of sorted common words.
  132. SetSafetyTipAllowlistPatterns({}, {}, {"common3", "common1", "common2"});
  133. auto* config = GetSafetyTipsRemoteConfigProto();
  134. EXPECT_TRUE(IsCommonWordInConfigProto(config, "common1"));
  135. EXPECT_TRUE(IsCommonWordInConfigProto(config, "common2"));
  136. EXPECT_TRUE(IsCommonWordInConfigProto(config, "common3"));
  137. EXPECT_FALSE(IsCommonWordInConfigProto(config, "uncommon"));
  138. }
  139. } // namespace reputation