Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(750)

Unified Diff: components/subresource_filter/core/common/indexed_ruleset_unittest.cc

Issue 2816693002: [IndexedRuleset] Improve worst-case domain list matching. (Closed)
Patch Set: Add TODO. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « components/subresource_filter/core/common/indexed_ruleset.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: components/subresource_filter/core/common/indexed_ruleset_unittest.cc
diff --git a/components/subresource_filter/core/common/indexed_ruleset_unittest.cc b/components/subresource_filter/core/common/indexed_ruleset_unittest.cc
index 0fed408d6bb9c9816493261b097c1383576b588d..4a7461361b245f76ec6d501dfcb82f9a6e8509bd 100644
--- a/components/subresource_filter/core/common/indexed_ruleset_unittest.cc
+++ b/components/subresource_filter/core/common/indexed_ruleset_unittest.cc
@@ -10,6 +10,7 @@
#include "base/logging.h"
#include "base/macros.h"
+#include "base/strings/string_util.h"
#include "components/subresource_filter/core/common/first_party_origin.h"
#include "components/subresource_filter/core/common/proto/rules.pb.h"
#include "components/subresource_filter/core/common/url_pattern.h"
@@ -365,104 +366,159 @@ TEST_F(SubresourceFilterIndexedRulesetTest, OneRuleWithThirdParty) {
}
TEST_F(SubresourceFilterIndexedRulesetTest, OneRuleWithDomainList) {
+ constexpr const char* kUrl = "http://example.com";
+
const struct {
- const char* url_pattern;
std::vector<std::string> domains;
-
- const char* url;
const char* document_origin;
+
bool expect_allowed;
} kTestCases[] = {
- {"example.com",
- {"domain1.com", "domain2.com"},
- "http://example.com",
- "http://domain1.com",
+ {std::vector<std::string>(), nullptr, false},
+ {std::vector<std::string>(), "http://domain.com", false},
+
+ {{"domain.com"}, nullptr, true},
+ {{"domain.com"}, "http://domain.com", false},
+ {{"ddomain.com"}, "http://domain.com", true},
+ {{"domain.com"}, "http://ddomain.com", true},
+ {{"domain.com"}, "http://sub.domain.com", false},
+ {{"sub.domain.com"}, "http://domain.com", true},
+ {{"sub.domain.com"}, "http://sub.domain.com", false},
+ {{"sub.domain.com"}, "http://a.b.c.sub.domain.com", false},
+ {{"sub.domain.com"}, "http://sub.domain.com.com", true},
+
+ // TODO(pkalinnikov): Probably need to canonicalize domain patterns to
+ // avoid subtleties like below.
+ {{"domain.com"}, "http://domain.com.", false},
+ {{"domain.com"}, "http://.domain.com", false},
+ {{"domain.com"}, "http://.domain.com.", false},
+ {{".domain.com"}, "http://.domain.com", false},
+ {{"domain.com."}, "http://domain.com", true},
+ {{"domain.com."}, "http://domain.com.", false},
+
+ {{"domain..com"}, "http://domain.com", true},
+ {{"domain.com"}, "http://domain..com", true},
+ {{"domain..com"}, "http://domain..com", false},
+
+ {{"~domain.com"}, nullptr, false},
+ {{"~domain.com"}, "http://domain.com", true},
+ {{"~ddomain.com"}, "http://domain.com", false},
+ {{"~domain.com"}, "http://ddomain.com", false},
+ {{"~domain.com"}, "http://sub.domain.com", true},
+ {{"~sub.domain.com"}, "http://domain.com", false},
+ {{"~sub.domain.com"}, "http://sub.domain.com", true},
+ {{"~sub.domain.com"}, "http://a.b.c.sub.domain.com", true},
+ {{"~sub.domain.com"}, "http://sub.domain.com.com", false},
+
+ {{"domain1.com", "domain2.com"}, nullptr, true},
+ {{"domain1.com", "domain2.com"}, "http://domain1.com", false},
+ {{"domain1.com", "domain2.com"}, "http://domain2.com", false},
+ {{"domain1.com", "domain2.com"}, "http://domain3.com", true},
+ {{"domain1.com", "domain2.com"}, "http://not_domain1.com", true},
+ {{"domain1.com", "domain2.com"}, "http://sub.domain1.com", false},
+ {{"domain1.com", "domain2.com"}, "http://a.b.c.sub.domain2.com", false},
+
+ {{"~domain1.com", "~domain2.com"}, "http://domain1.com", true},
+ {{"~domain1.com", "~domain2.com"}, "http://domain2.com", true},
+ {{"~domain1.com", "~domain2.com"}, "http://domain3.com", false},
+
+ {{"domain.com", "~sub.domain.com"}, "http://domain.com", false},
+ {{"domain.com", "~sub.domain.com"}, "http://sub.domain.com", true},
+ {{"domain.com", "~sub.domain.com"}, "http://a.b.sub.domain.com", true},
+ {{"domain.com", "~sub.domain.com"}, "http://ssub.domain.com", false},
+
+ {{"domain.com", "~a.domain.com", "~b.domain.com"},
+ "http://domain.com",
false},
-
- {"example.com",
- {"domain1.com", "domain2.com"},
- "http://example.com",
- "http://not_domain1.com",
+ {{"domain.com", "~a.domain.com", "~b.domain.com"},
+ "http://a.domain.com",
true},
-
- {"example.com",
- {"domain1.com", "domain2.com"},
- "http://example.com",
- "http://domain2.com",
- false},
-
- {"example.com",
- {"domain1.com", "domain2.com"},
- "http://example.com",
- "http://subdomain.domain2.com",
- false},
-
- {"example.com",
- {"domain1.com", "domain2.com"},
- "http://example.com",
- "http://domain3.com",
+ {{"domain.com", "~a.domain.com", "~b.domain.com"},
+ "http://b.domain.com",
true},
- {"example.com",
- {"~domain1.com", "~domain2.com"},
- "http://example.com",
- "http://domain2.com",
+ {{"domain.com", "~a.domain.com", "b.a.domain.com"},
+ "http://domain.com",
+ false},
+ {{"domain.com", "~a.domain.com", "b.a.domain.com"},
+ "http://a.domain.com",
true},
-
- {"example.com",
- {"~domain1.com", "~domain2.com"},
- "http://example.com",
- "http://domain3.com",
+ {{"domain.com", "~a.domain.com", "b.a.domain.com"},
+ "http://b.a.domain.com",
false},
-
- {"example.com",
- {"domain1.com", "~subdomain1.domain1.com"},
- "http://example.com",
- "http://subdomain2.domain1.com",
+ {{"domain.com", "~a.domain.com", "b.a.domain.com"},
+ "http://c.b.a.domain.com",
false},
- {"example.com",
- {"domain1.com", "~subdomain1.domain1.com"},
- "http://example.com",
- "http://subdomain1.domain1.com",
- true},
-
- {"example.com",
- {"domain1.com", "domain2.com"},
- "http://example.com",
- nullptr,
- true},
-
// The following test addresses a former bug in domain list matcher. When
// "domain.com" was matched, the positive filters lookup stopped, and the
// next domain was considered as a negative. The initial character was
// skipped (supposing it's a '~') and the remainder was considered a
// domain. So "ddomain.com" would be matched and thus the whole rule would
// be classified as non-matching, which is not correct.
- {"ex.com",
- {"domain.com", "ddomain.com", "~sub.domain.com"},
- "http://ex.com",
+ {{"domain.com", "ddomain.com", "~sub.domain.com"},
"http://domain.com",
false},
};
for (const auto& test_case : kTestCases) {
SCOPED_TRACE(testing::Message()
- << "Rule: " << test_case.url_pattern
- << "; URL: " << test_case.url
+ << "Domains: " << base::JoinString(test_case.domains, "|")
<< "; document: " << test_case.document_origin);
- UrlRuleBuilder builder(UrlPattern(test_case.url_pattern, kSubstring));
+ UrlRuleBuilder builder(UrlPattern(kUrl, kSubstring));
builder.AddDomains(test_case.domains);
AddUrlRule(builder.rule());
Finish();
EXPECT_EQ(test_case.expect_allowed,
- ShouldAllow(test_case.url, test_case.document_origin));
+ ShouldAllow(kUrl, test_case.document_origin));
Reset();
}
}
+TEST_F(SubresourceFilterIndexedRulesetTest, OneRuleWithLongDomainList) {
+ constexpr const char* kUrl = "http://example.com";
+ constexpr size_t kDomains = 200;
+
+ std::vector<std::string> domains;
+ for (size_t i = 0; i < kDomains; ++i) {
+ const std::string domain = "domain" + std::to_string(i) + ".com";
+ domains.push_back(domain);
+ domains.push_back("~sub." + domain);
+ domains.push_back("a.sub." + domain);
+ domains.push_back("b.sub." + domain);
+ domains.push_back("c.sub." + domain);
+ domains.push_back("~aa.sub." + domain);
+ domains.push_back("~ab.sub." + domain);
+ domains.push_back("~ba.sub." + domain);
+ domains.push_back("~bb.sub." + domain);
+ domains.push_back("~sub.sub.c.sub." + domain);
+ }
+
+ UrlRuleBuilder builder(UrlPattern(kUrl, kSubstring));
+ builder.AddDomains(domains);
+ AddUrlRule(builder.rule());
+ Finish();
+
+ for (size_t i = 0; i < kDomains; ++i) {
+ SCOPED_TRACE(testing::Message() << "Iteration: " << i);
+ const std::string domain = "domain" + std::to_string(i) + ".com";
+
+ EXPECT_FALSE(ShouldAllow(kUrl, ("http://" + domain).c_str()));
+ EXPECT_TRUE(ShouldAllow(kUrl, ("http://sub." + domain).c_str()));
+ EXPECT_FALSE(ShouldAllow(kUrl, ("http://a.sub." + domain).c_str()));
+ EXPECT_FALSE(ShouldAllow(kUrl, ("http://b.sub." + domain).c_str()));
+ EXPECT_FALSE(ShouldAllow(kUrl, ("http://c.sub." + domain).c_str()));
+ EXPECT_TRUE(ShouldAllow(kUrl, ("http://aa.sub." + domain).c_str()));
+ EXPECT_TRUE(ShouldAllow(kUrl, ("http://ab.sub." + domain).c_str()));
+ EXPECT_TRUE(ShouldAllow(kUrl, ("http://ba.sub." + domain).c_str()));
+ EXPECT_TRUE(ShouldAllow(kUrl, ("http://bb.sub." + domain).c_str()));
+ EXPECT_FALSE(ShouldAllow(kUrl, ("http://sub.c.sub." + domain).c_str()));
+ EXPECT_TRUE(ShouldAllow(kUrl, ("http://sub.sub.c.sub." + domain).c_str()));
+ }
+}
+
TEST_F(SubresourceFilterIndexedRulesetTest, OneRuleWithElementTypes) {
constexpr proto::ElementType kAll = proto::ELEMENT_TYPE_ALL;
constexpr proto::ElementType kImage = proto::ELEMENT_TYPE_IMAGE;
« no previous file with comments | « components/subresource_filter/core/common/indexed_ruleset.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698