| 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 8bd9dca0eebccb8d721379aaf6fee699b45b7e89..41778883a7dda6972823ca7e9f8f48cdd8b334bd 100644
|
| --- a/components/subresource_filter/core/common/indexed_ruleset_unittest.cc
|
| +++ b/components/subresource_filter/core/common/indexed_ruleset_unittest.cc
|
| @@ -10,160 +10,78 @@
|
|
|
| #include "base/logging.h"
|
| #include "base/macros.h"
|
| -#include "base/strings/string_util.h"
|
| +#include "base/strings/string_piece.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"
|
| +#include "components/subresource_filter/core/common/url_rule_test_support.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| #include "url/gurl.h"
|
| #include "url/origin.h"
|
|
|
| namespace subresource_filter {
|
|
|
| -namespace {
|
| +using namespace testing;
|
|
|
| -constexpr proto::AnchorType kAnchorNone = proto::ANCHOR_TYPE_NONE;
|
| -constexpr proto::AnchorType kBoundary = proto::ANCHOR_TYPE_BOUNDARY;
|
| -constexpr proto::AnchorType kSubdomain = proto::ANCHOR_TYPE_SUBDOMAIN;
|
| -constexpr proto::UrlPatternType kSubstring = proto::URL_PATTERN_TYPE_SUBSTRING;
|
| -
|
| -constexpr proto::SourceType kAnyParty = proto::SOURCE_TYPE_ANY;
|
| -constexpr proto::SourceType kFirstParty = proto::SOURCE_TYPE_FIRST_PARTY;
|
| -constexpr proto::SourceType kThirdParty = proto::SOURCE_TYPE_THIRD_PARTY;
|
| -
|
| -constexpr proto::ElementType kAllElementTypes = proto::ELEMENT_TYPE_ALL;
|
| -constexpr proto::ElementType kOther = proto::ELEMENT_TYPE_OTHER;
|
| -constexpr proto::ElementType kImage = proto::ELEMENT_TYPE_IMAGE;
|
| -constexpr proto::ElementType kFont = proto::ELEMENT_TYPE_FONT;
|
| -constexpr proto::ElementType kScript = proto::ELEMENT_TYPE_SCRIPT;
|
| -constexpr proto::ElementType kPopup = proto::ELEMENT_TYPE_POPUP;
|
| -constexpr proto::ElementType kWebSocket = proto::ELEMENT_TYPE_WEBSOCKET;
|
| -
|
| -constexpr proto::ActivationType kDocument = proto::ACTIVATION_TYPE_DOCUMENT;
|
| -constexpr proto::ActivationType kGenericBlock =
|
| - proto::ACTIVATION_TYPE_GENERICBLOCK;
|
| -
|
| -// Note: Returns unique origin on origin_string == nullptr.
|
| -url::Origin GetOrigin(const char* origin_string) {
|
| - return origin_string ? url::Origin(GURL(origin_string)) : url::Origin();
|
| -}
|
| -
|
| -class UrlRuleBuilder {
|
| +class SubresourceFilterIndexedRulesetTest : public ::testing::Test {
|
| public:
|
| - explicit UrlRuleBuilder(const UrlPattern& url_pattern,
|
| - bool is_whitelist = false)
|
| - : UrlRuleBuilder(url_pattern, kAnyParty, is_whitelist) {}
|
| -
|
| - UrlRuleBuilder(const UrlPattern& url_pattern,
|
| - proto::SourceType source_type,
|
| - bool is_whitelist) {
|
| - rule_.set_semantics(is_whitelist ? proto::RULE_SEMANTICS_WHITELIST
|
| - : proto::RULE_SEMANTICS_BLACKLIST);
|
| -
|
| - rule_.set_source_type(source_type);
|
| - rule_.set_element_types(kAllElementTypes);
|
| -
|
| - rule_.set_url_pattern_type(url_pattern.type());
|
| - rule_.set_anchor_left(url_pattern.anchor_left());
|
| - rule_.set_anchor_right(url_pattern.anchor_right());
|
| - rule_.set_match_case(url_pattern.match_case());
|
| - rule_.set_url_pattern(url_pattern.url_pattern().as_string());
|
| - }
|
| -
|
| - UrlRuleBuilder& AddDomain(std::string domain_pattern) {
|
| - DCHECK(!domain_pattern.empty());
|
| - auto* domain = rule_.add_domains();
|
| - if (domain_pattern[0] == '~') {
|
| - domain_pattern.erase(0, 1);
|
| - domain->set_exclude(true);
|
| - }
|
| - domain->set_domain(domain_pattern);
|
| - return *this;
|
| - }
|
| -
|
| - UrlRuleBuilder& AddDomains(const std::vector<std::string>& domains) {
|
| - for (const std::string domain : domains)
|
| - AddDomain(domain);
|
| - return *this;
|
| - }
|
| -
|
| - const proto::UrlRule& rule() const { return rule_; }
|
| - proto::UrlRule& rule() { return rule_; }
|
| -
|
| - private:
|
| - proto::UrlRule rule_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(UrlRuleBuilder);
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -class SubresourceFilterIndexedRulesetTest : public testing::Test {
|
| - public:
|
| - SubresourceFilterIndexedRulesetTest() = default;
|
| + SubresourceFilterIndexedRulesetTest() { Reset(); }
|
|
|
| protected:
|
| - bool ShouldAllow(const char* url,
|
| - const char* document_origin = nullptr,
|
| + bool ShouldAllow(base::StringPiece url,
|
| + base::StringPiece document_origin = nullptr,
|
| proto::ElementType element_type = kOther,
|
| bool disable_generic_rules = false) const {
|
| - DCHECK_NE(matcher_.get(), nullptr);
|
| - url::Origin origin = GetOrigin(document_origin);
|
| - FirstPartyOrigin first_party(origin);
|
| + DCHECK(matcher_);
|
| return !matcher_->ShouldDisallowResourceLoad(
|
| - GURL(url), first_party, element_type, disable_generic_rules);
|
| - }
|
| -
|
| - bool ShouldAllow(const char* url,
|
| - const char* document_origin,
|
| - bool disable_generic_rules) const {
|
| - return ShouldAllow(url, document_origin, kOther, disable_generic_rules);
|
| + GURL(url), FirstPartyOrigin(GetOrigin(document_origin)), element_type,
|
| + disable_generic_rules);
|
| }
|
|
|
| - bool ShouldDeactivate(const char* document_url,
|
| - const char* parent_document_origin = nullptr,
|
| - proto::ActivationType activation_type =
|
| - proto::ACTIVATION_TYPE_UNSPECIFIED) const {
|
| + bool ShouldDeactivate(
|
| + base::StringPiece document_url,
|
| + base::StringPiece parent_document_origin = nullptr,
|
| + proto::ActivationType activation_type = kNoActivation) const {
|
| DCHECK(matcher_);
|
| - url::Origin origin = GetOrigin(parent_document_origin);
|
| - return matcher_->ShouldDisableFilteringForDocument(GURL(document_url),
|
| - origin, activation_type);
|
| + return matcher_->ShouldDisableFilteringForDocument(
|
| + GURL(document_url), GetOrigin(parent_document_origin), activation_type);
|
| }
|
|
|
| - void AddUrlRule(const proto::UrlRule& rule) {
|
| - ASSERT_TRUE(indexer_.AddUrlRule(rule)) << "URL pattern: "
|
| - << rule.url_pattern();
|
| + bool AddUrlRule(const proto::UrlRule& rule) {
|
| + return indexer_->AddUrlRule(rule);
|
| }
|
|
|
| - void AddSimpleRule(const UrlPattern& url_pattern, bool is_whitelist) {
|
| - AddUrlRule(UrlRuleBuilder(url_pattern, is_whitelist).rule());
|
| + bool AddSimpleRule(base::StringPiece url_pattern) {
|
| + return AddUrlRule(MakeUrlRule(UrlPattern(url_pattern, kSubstring)));
|
| }
|
|
|
| - void AddBlacklistRule(const UrlPattern& url_pattern,
|
| - proto::SourceType source_type = kAnyParty) {
|
| - AddUrlRule(UrlRuleBuilder(url_pattern, source_type, false).rule());
|
| + bool AddSimpleWhitelistRule(base::StringPiece url_pattern) {
|
| + auto rule = MakeUrlRule(UrlPattern(url_pattern, kSubstring));
|
| + rule.set_semantics(proto::RULE_SEMANTICS_WHITELIST);
|
| + return AddUrlRule(rule);
|
| }
|
|
|
| - void AddWhitelistRuleWithActivationTypes(const UrlPattern& url_pattern,
|
| - int32_t activation_types) {
|
| - UrlRuleBuilder builder(url_pattern, kAnyParty, true);
|
| - builder.rule().set_element_types(proto::ELEMENT_TYPE_UNSPECIFIED);
|
| - builder.rule().set_activation_types(activation_types);
|
| - AddUrlRule(builder.rule());
|
| + bool AddSimpleWhitelistRule(base::StringPiece url_pattern,
|
| + int32_t activation_types) {
|
| + auto rule = MakeUrlRule(url_pattern);
|
| + rule.set_semantics(proto::RULE_SEMANTICS_WHITELIST);
|
| + rule.clear_element_types();
|
| + rule.set_activation_types(activation_types);
|
| + return AddUrlRule(rule);
|
| }
|
|
|
| void Finish() {
|
| - indexer_.Finish();
|
| - matcher_.reset(new IndexedRulesetMatcher(indexer_.data(), indexer_.size()));
|
| + indexer_->Finish();
|
| + matcher_.reset(
|
| + new IndexedRulesetMatcher(indexer_->data(), indexer_->size()));
|
| }
|
|
|
| void Reset() {
|
| matcher_.reset(nullptr);
|
| - indexer_.~RulesetIndexer();
|
| - new (&indexer_) RulesetIndexer();
|
| + indexer_.reset(new RulesetIndexer);
|
| }
|
|
|
| - RulesetIndexer indexer_;
|
| + std::unique_ptr<RulesetIndexer> indexer_;
|
| std::unique_ptr<IndexedRulesetMatcher> matcher_;
|
|
|
| private:
|
| @@ -177,138 +95,103 @@ TEST_F(SubresourceFilterIndexedRulesetTest, OneRuleWithoutMetaInfo) {
|
| bool expect_allowed;
|
| } kTestCases[] = {
|
| // SUBSTRING
|
| - {{"abcd", kSubstring}, "http://example.com/abcd", false},
|
| - {{"abcd", kSubstring}, "http://example.com/dcab", true},
|
| - {{"42", kSubstring}, "http://example.com/adcd/picture42.png", false},
|
| + {{"abcd", kSubstring}, "http://ex.com/abcd", false},
|
| + {{"abcd", kSubstring}, "http://ex.com/dcab", true},
|
| + {{"42", kSubstring}, "http://ex.com/adcd/picture42.png", false},
|
| {{"&test", kSubstring},
|
| - "http://example.com/params?para1=false&test=true",
|
| + "http://ex.com/params?para1=false&test=true",
|
| false},
|
| - {{"-test-42.", kSubstring}, "http://example.com/unit-test-42.1", false},
|
| + {{"-test-42.", kSubstring}, "http://ex.com/unit-test-42.1", false},
|
| {{"/abcdtest160x600.", kSubstring},
|
| - "http://example.com/abcdtest160x600.png",
|
| + "http://ex.com/abcdtest160x600.png",
|
| false},
|
|
|
| // WILDCARDED
|
| - {{"http://example.com/abcd/picture*.png"},
|
| - "http://example.com/abcd/picture42.png",
|
| - false},
|
| - {{"example.com", kSubdomain, kAnchorNone}, "http://example.com", false},
|
| - {{"example.com", kSubdomain, kAnchorNone},
|
| - "http://test.example.com",
|
| - false},
|
| - {{"example.com", kSubdomain, kAnchorNone},
|
| - "https://test.example.com.com",
|
| - false},
|
| - {{"example.com", kSubdomain, kAnchorNone},
|
| - "https://test.rest.example.com",
|
| - false},
|
| - {{"example.com", kSubdomain, kAnchorNone},
|
| - "https://test_example.com",
|
| - true},
|
| -
|
| - {{"http://example.com", kBoundary, kAnchorNone},
|
| - "http://example.com/",
|
| - false},
|
| - {{"http://example.com", kBoundary, kAnchorNone},
|
| - "http://example.com/42",
|
| + {{"http://ex.com/abcd/picture*.png"},
|
| + "http://ex.com/abcd/picture42.png",
|
| false},
|
| - {{"http://example.com", kBoundary, kAnchorNone},
|
| - "http://example.com/42/http://example.com/",
|
| + {{"ex.com", kSubdomain, kAnchorNone}, "http://ex.com", false},
|
| + {{"ex.com", kSubdomain, kAnchorNone}, "http://test.ex.com", false},
|
| + {{"ex.com", kSubdomain, kAnchorNone}, "https://test.ex.com.com", false},
|
| + {{"ex.com", kSubdomain, kAnchorNone}, "https://test.rest.ex.com", false},
|
| + {{"ex.com", kSubdomain, kAnchorNone}, "https://test_ex.com", true},
|
| +
|
| + {{"http://ex.com", kBoundary, kAnchorNone}, "http://ex.com/", false},
|
| + {{"http://ex.com", kBoundary, kAnchorNone}, "http://ex.com/42", false},
|
| + {{"http://ex.com", kBoundary, kAnchorNone},
|
| + "http://ex.com/42/http://ex.com/",
|
| false},
|
| - {{"http://example.com", kBoundary, kAnchorNone},
|
| - "http://example.com/42/http://example.info/",
|
| + {{"http://ex.com", kBoundary, kAnchorNone},
|
| + "http://ex.com/42/http://ex.info/",
|
| false},
|
| - {{"http://example.com/", kBoundary, kBoundary},
|
| - "http://example.com",
|
| - false},
|
| - {{"http://example.com/", kBoundary, kBoundary},
|
| - "http://example.com/42",
|
| - true},
|
| - {{"http://example.com/", kBoundary, kBoundary},
|
| - "http://example.info/42/http://example.com/",
|
| + {{"http://ex.com/", kBoundary, kBoundary}, "http://ex.com", false},
|
| + {{"http://ex.com/", kBoundary, kBoundary}, "http://ex.com/42", true},
|
| + {{"http://ex.com/", kBoundary, kBoundary},
|
| + "http://ex.info/42/http://ex.com/",
|
| true},
|
| - {{"http://example.com/", kBoundary, kBoundary},
|
| - "http://example.info/42/http://example.com/",
|
| - true},
|
| - {{"http://example.com/", kBoundary, kBoundary},
|
| - "http://example.com/",
|
| - false},
|
| - {{"http://example.com/", kBoundary, kBoundary},
|
| - "http://example.com/42.swf",
|
| + {{"http://ex.com/", kBoundary, kBoundary},
|
| + "http://ex.info/42/http://ex.com/",
|
| true},
|
| - {{"http://example.com/", kBoundary, kBoundary},
|
| - "http://example.info/redirect/http://example.com/",
|
| + {{"http://ex.com/", kBoundary, kBoundary}, "http://ex.com/", false},
|
| + {{"http://ex.com/", kBoundary, kBoundary}, "http://ex.com/42.swf", true},
|
| + {{"http://ex.com/", kBoundary, kBoundary},
|
| + "http://ex.info/redirect/http://ex.com/",
|
| true},
|
| - {{"pdf", kAnchorNone, kBoundary}, "http://example.com/abcd.pdf", false},
|
| - {{"pdf", kAnchorNone, kBoundary}, "http://example.com/pdfium", true},
|
| - {{"http://example.com^"}, "http://example.com/", false},
|
| - {{"http://example.com^"}, "http://example.com:8000/", false},
|
| - {{"http://example.com^"}, "http://example.com.ru", true},
|
| - {{"^example.com^"},
|
| - "http://example.com:8000/42.loss?a=12&b=%D1%82%D0%B5%D1%81%D1%82",
|
| + {{"pdf", kAnchorNone, kBoundary}, "http://ex.com/abcd.pdf", false},
|
| + {{"pdf", kAnchorNone, kBoundary}, "http://ex.com/pdfium", true},
|
| + {{"http://ex.com^"}, "http://ex.com/", false},
|
| + {{"http://ex.com^"}, "http://ex.com:8000/", false},
|
| + {{"http://ex.com^"}, "http://ex.com.ru", true},
|
| + {{"^ex.com^"},
|
| + "http://ex.com:8000/42.loss?a=12&b=%D1%82%D0%B5%D1%81%D1%82",
|
| false},
|
| {{"^42.loss^"},
|
| - "http://example.com:8000/42.loss?a=12&b=%D1%82%D0%B5%D1%81%D1%82",
|
| + "http://ex.com:8000/42.loss?a=12&b=%D1%82%D0%B5%D1%81%D1%82",
|
| false},
|
|
|
| - // FIXME(pkalinnikov): The '^' at the end should match end-of-string.
|
| + // TODO(pkalinnikov): The '^' at the end should match end-of-string.
|
| + //
|
| // {"^%D1%82%D0%B5%D1%81%D1%82^",
|
| - // "http://example.com:8000/42.loss?a=12&b=%D1%82%D0%B5%D1%81%D1%82",
|
| + // "http://ex.com:8000/42.loss?a=12&b=%D1%82%D0%B5%D1%81%D1%82",
|
| // false},
|
| - // {"/abcd/*/picture^", "http://example.com/abcd/42/picture", false},
|
| -
|
| - {{"/abcd/*/picture^"},
|
| - "http://example.com/abcd/42/loss/picture?param",
|
| - false},
|
| - {{"/abcd/*/picture^"}, "http://example.com/abcd//picture/42", false},
|
| - {{"/abcd/*/picture^"}, "http://example.com/abcd/picture", true},
|
| - {{"/abcd/*/picture^"}, "http://example.com/abcd/42/pictureraph", true},
|
| - {{"/abcd/*/picture^"}, "http://example.com/abcd/42/picture.swf", true},
|
| - {{"test.example.com^", kSubdomain, kAnchorNone},
|
| - "http://test.example.com/42.swf",
|
| + // {"/abcd/*/picture^", "http://ex.com/abcd/42/picture", false},
|
| +
|
| + {{"/abcd/*/picture^"}, "http://ex.com/abcd/42/loss/picture?param", false},
|
| + {{"/abcd/*/picture^"}, "http://ex.com/abcd//picture/42", false},
|
| + {{"/abcd/*/picture^"}, "http://ex.com/abcd/picture", true},
|
| + {{"/abcd/*/picture^"}, "http://ex.com/abcd/42/pictureraph", true},
|
| + {{"/abcd/*/picture^"}, "http://ex.com/abcd/42/picture.swf", true},
|
| + {{"test.ex.com^", kSubdomain, kAnchorNone},
|
| + "http://test.ex.com/42.swf",
|
| false},
|
| - {{"test.example.com^", kSubdomain, kAnchorNone},
|
| - "http://server1.test.example.com/42.swf",
|
| + {{"test.ex.com^", kSubdomain, kAnchorNone},
|
| + "http://server1.test.ex.com/42.swf",
|
| false},
|
| - {{"test.example.com^", kSubdomain, kAnchorNone},
|
| - "https://test.example.com:8000/",
|
| + {{"test.ex.com^", kSubdomain, kAnchorNone},
|
| + "https://test.ex.com:8000/",
|
| false},
|
| - {{"test.example.com^", kSubdomain, kAnchorNone},
|
| - "http://test.example.com.ua/42.swf",
|
| + {{"test.ex.com^", kSubdomain, kAnchorNone},
|
| + "http://test.ex.com.ua/42.swf",
|
| true},
|
| - {{"test.example.com^", kSubdomain, kAnchorNone},
|
| - "http://example.com/redirect/http://test.example.com/",
|
| + {{"test.ex.com^", kSubdomain, kAnchorNone},
|
| + "http://ex.com/redirect/http://test.ex.com/",
|
| true},
|
|
|
| - {{"/abcd/*"}, "https://example.com/abcd/", false},
|
| - {{"/abcd/*"}, "http://example.com/abcd/picture.jpeg", false},
|
| - {{"/abcd/*"}, "https://example.com/abcd", true},
|
| - {{"/abcd/*"}, "http://abcd.example.com", true},
|
| - {{"*/abcd/"}, "https://example.com/abcd/", false},
|
| - {{"*/abcd/"}, "http://example.com/abcd/picture.jpeg", false},
|
| - {{"*/abcd/"}, "https://example.com/test-abcd/", true},
|
| - {{"*/abcd/"}, "http://abcd.example.com", true},
|
| -
|
| - // FIXME(pkalinnikov): Implement REGEXP matching.
|
| - // REGEXP
|
| - // {"/test|rest\\d+/", "http://example.com/test42", false},
|
| - // {"/test|rest\\d+/", "http://example.com/test", false},
|
| - // {"/test|rest\\d+/", "http://example.com/rest42", false},
|
| - // {"/test|rest\\d+/", "http://example.com/rest", true},
|
| - // {"/example\\.com/.*\\/[a-zA-Z0-9]{3}/", "http://example.com/abcd/42y",
|
| - // false},
|
| - // {"/example\\.com/.*\\/[a-zA-Z0-9]{3}/", "http://example.com/abcd/%42y",
|
| - // true},
|
| - // {"||example.com^*/test.htm", "http://example.com/unit/test.html",
|
| - // false},
|
| - // {"||example.com^*/test.htm", "http://examole.com/test.htm", true},
|
| + {{"/abcd/*"}, "https://ex.com/abcd/", false},
|
| + {{"/abcd/*"}, "http://ex.com/abcd/picture.jpeg", false},
|
| + {{"/abcd/*"}, "https://ex.com/abcd", true},
|
| + {{"/abcd/*"}, "http://abcd.ex.com", true},
|
| + {{"*/abcd/"}, "https://ex.com/abcd/", false},
|
| + {{"*/abcd/"}, "http://ex.com/abcd/picture.jpeg", false},
|
| + {{"*/abcd/"}, "https://ex.com/test-abcd/", true},
|
| + {{"*/abcd/"}, "http://abcd.ex.com", true},
|
| };
|
|
|
| for (const auto& test_case : kTestCases) {
|
| - SCOPED_TRACE(testing::Message() << "Rule: " << test_case.url_pattern
|
| - << "; URL: " << test_case.url);
|
| + SCOPED_TRACE(::testing::Message() << "UrlPattern: " << test_case.url_pattern
|
| + << "; URL: " << test_case.url);
|
|
|
| - AddBlacklistRule(test_case.url_pattern);
|
| + ASSERT_TRUE(AddUrlRule(MakeUrlRule(test_case.url_pattern)));
|
| Finish();
|
|
|
| EXPECT_EQ(test_case.expect_allowed, ShouldAllow(test_case.url));
|
| @@ -325,47 +208,39 @@ TEST_F(SubresourceFilterIndexedRulesetTest, OneRuleWithThirdParty) {
|
| const char* document_origin;
|
| bool expect_allowed;
|
| } kTestCases[] = {
|
| - {"example.com", kThirdParty, "http://example.com", "http://exmpl.org",
|
| + {"ex.com", kThirdParty, "http://ex.com", "http://exmpl.org", false},
|
| + {"ex.com", kThirdParty, "http://ex.com", "http://ex.com", true},
|
| + {"ex.com", kThirdParty, "http://ex.com/path?k=v", "http://exmpl.org",
|
| false},
|
| - {"example.com", kThirdParty, "http://example.com", "http://example.com",
|
| + {"ex.com", kThirdParty, "http://ex.com/path?k=v", "http://ex.com", true},
|
| + {"ex.com", kFirstParty, "http://ex.com/path?k=v", "http://ex.com", false},
|
| + {"ex.com", kFirstParty, "http://ex.com/path?k=v", "http://exmpl.com",
|
| true},
|
| - {"example.com", kThirdParty, "http://example.com/path?k=v",
|
| - "http://exmpl.org", false},
|
| - {"example.com", kThirdParty, "http://example.com/path?k=v",
|
| - "http://example.com", true},
|
| - {"example.com", kFirstParty, "http://example.com/path?k=v",
|
| - "http://example.com", false},
|
| - {"example.com", kFirstParty, "http://example.com/path?k=v",
|
| - "http://exmpl.com", true},
|
| - {"example.com", kAnyParty, "http://example.com/path?k=v",
|
| - "http://example.com", false},
|
| - {"example.com", kAnyParty, "http://example.com/path?k=v",
|
| - "http://exmpl.com", false},
|
| - {"example.com", kThirdParty, "http://subdomain.example.com",
|
| - "http://example.com", true},
|
| - {"example.com", kThirdParty, "http://example.com", nullptr, false},
|
| + {"ex.com", kAnyParty, "http://ex.com/path?k=v", "http://ex.com", false},
|
| + {"ex.com", kAnyParty, "http://ex.com/path?k=v", "http://exmpl.com",
|
| + false},
|
| + {"ex.com", kThirdParty, "http://subdomain.ex.com", "http://ex.com", true},
|
| + {"ex.com", kThirdParty, "http://ex.com", nullptr, false},
|
|
|
| // Public Suffix List tests.
|
| - {"example.com", kThirdParty, "http://two.example.com",
|
| - "http://one.example.com", true},
|
| - {"example.com", kThirdParty, "http://example.com",
|
| - "http://one.example.com", true},
|
| - {"example.com", kThirdParty, "http://two.example.com",
|
| - "http://example.com", true},
|
| - {"example.com", kThirdParty, "http://example.com", "http://example.org",
|
| - false},
|
| + {"ex.com", kThirdParty, "http://two.ex.com", "http://one.ex.com", true},
|
| + {"ex.com", kThirdParty, "http://ex.com", "http://one.ex.com", true},
|
| + {"ex.com", kThirdParty, "http://two.ex.com", "http://ex.com", true},
|
| + {"ex.com", kThirdParty, "http://ex.com", "http://ex.org", false},
|
| {"appspot.com", kThirdParty, "http://two.appspot.org",
|
| "http://one.appspot.com", true},
|
| };
|
|
|
| for (auto test_case : kTestCases) {
|
| - SCOPED_TRACE(testing::Message()
|
| - << "Rule: " << test_case.url_pattern << "; source: "
|
| - << (int)test_case.source_type << "; URL: " << test_case.url
|
| - << "; document: " << test_case.document_origin);
|
| -
|
| - AddBlacklistRule(UrlPattern(test_case.url_pattern, kSubstring),
|
| - test_case.source_type);
|
| + SCOPED_TRACE(::testing::Message()
|
| + << "UrlPattern: " << test_case.url_pattern
|
| + << "; SourceType: " << static_cast<int>(test_case.source_type)
|
| + << "; URL: " << test_case.url
|
| + << "; DocumentOrigin: " << test_case.document_origin);
|
| +
|
| + auto rule = MakeUrlRule(UrlPattern(test_case.url_pattern, kSubstring));
|
| + rule.set_source_type(test_case.source_type);
|
| + ASSERT_TRUE(AddUrlRule(rule));
|
| Finish();
|
|
|
| EXPECT_EQ(test_case.expect_allowed,
|
| @@ -380,7 +255,6 @@ TEST_F(SubresourceFilterIndexedRulesetTest, OneRuleWithDomainList) {
|
| const struct {
|
| std::vector<std::string> domains;
|
| const char* document_origin;
|
| -
|
| bool expect_allowed;
|
| } kTestCases[] = {
|
| {std::vector<std::string>(), nullptr, false},
|
| @@ -471,13 +345,13 @@ TEST_F(SubresourceFilterIndexedRulesetTest, OneRuleWithDomainList) {
|
| };
|
|
|
| for (const auto& test_case : kTestCases) {
|
| - SCOPED_TRACE(testing::Message()
|
| - << "Domains: " << base::JoinString(test_case.domains, "|")
|
| - << "; document: " << test_case.document_origin);
|
| + SCOPED_TRACE(::testing::Message()
|
| + << "Domains: " << ::testing::PrintToString(test_case.domains)
|
| + << "; DocumentOrigin: " << test_case.document_origin);
|
|
|
| - UrlRuleBuilder builder(UrlPattern(kUrl, kSubstring));
|
| - builder.AddDomains(test_case.domains);
|
| - AddUrlRule(builder.rule());
|
| + auto rule = MakeUrlRule(UrlPattern(kUrl, kSubstring));
|
| + AddDomains(test_case.domains, &rule);
|
| + ASSERT_TRUE(AddUrlRule(rule));
|
| Finish();
|
|
|
| EXPECT_EQ(test_case.expect_allowed,
|
| @@ -505,26 +379,26 @@ TEST_F(SubresourceFilterIndexedRulesetTest, OneRuleWithLongDomainList) {
|
| domains.push_back("~sub.sub.c.sub." + domain);
|
| }
|
|
|
| - UrlRuleBuilder builder(UrlPattern(kUrl, kSubstring));
|
| - builder.AddDomains(domains);
|
| - AddUrlRule(builder.rule());
|
| + auto rule = MakeUrlRule(UrlPattern(kUrl, kSubstring));
|
| + AddDomains(domains, &rule);
|
| + ASSERT_TRUE(AddUrlRule(rule));
|
| Finish();
|
|
|
| for (size_t i = 0; i < kDomains; ++i) {
|
| - SCOPED_TRACE(testing::Message() << "Iteration: " << 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()));
|
| + EXPECT_FALSE(ShouldAllow(kUrl, "http://" + domain));
|
| + EXPECT_TRUE(ShouldAllow(kUrl, "http://sub." + domain));
|
| + EXPECT_FALSE(ShouldAllow(kUrl, "http://a.sub." + domain));
|
| + EXPECT_FALSE(ShouldAllow(kUrl, "http://b.sub." + domain));
|
| + EXPECT_FALSE(ShouldAllow(kUrl, "http://c.sub." + domain));
|
| + EXPECT_TRUE(ShouldAllow(kUrl, "http://aa.sub." + domain));
|
| + EXPECT_TRUE(ShouldAllow(kUrl, "http://ab.sub." + domain));
|
| + EXPECT_TRUE(ShouldAllow(kUrl, "http://ba.sub." + domain));
|
| + EXPECT_TRUE(ShouldAllow(kUrl, "http://bb.sub." + domain));
|
| + EXPECT_FALSE(ShouldAllow(kUrl, "http://sub.c.sub." + domain));
|
| + EXPECT_TRUE(ShouldAllow(kUrl, "http://sub.sub.c.sub." + domain));
|
| }
|
| }
|
|
|
| @@ -561,14 +435,16 @@ TEST_F(SubresourceFilterIndexedRulesetTest, OneRuleWithElementTypes) {
|
| };
|
|
|
| for (const auto& test_case : kTestCases) {
|
| - SCOPED_TRACE(testing::Message()
|
| - << "Rule: " << test_case.url_pattern << "; ElementTypes: "
|
| - << (int)test_case.element_types << "; URL: " << test_case.url
|
| - << "; ElementType: " << (int)test_case.element_type);
|
| -
|
| - UrlRuleBuilder builder(UrlPattern(test_case.url_pattern, kSubstring));
|
| - builder.rule().set_element_types(test_case.element_types);
|
| - AddUrlRule(builder.rule());
|
| + SCOPED_TRACE(
|
| + ::testing::Message()
|
| + << "UrlPattern: " << test_case.url_pattern
|
| + << "; ElementTypes: " << static_cast<int>(test_case.element_types)
|
| + << "; URL: " << test_case.url
|
| + << "; ElementType: " << static_cast<int>(test_case.element_type));
|
| +
|
| + auto rule = MakeUrlRule(UrlPattern(test_case.url_pattern, kSubstring));
|
| + rule.set_element_types(test_case.element_types);
|
| + ASSERT_TRUE(AddUrlRule(rule));
|
| Finish();
|
|
|
| EXPECT_EQ(test_case.expect_allowed,
|
| @@ -602,15 +478,15 @@ TEST_F(SubresourceFilterIndexedRulesetTest, OneRuleWithActivationTypes) {
|
| };
|
|
|
| for (const auto& test_case : kTestCases) {
|
| - SCOPED_TRACE(testing::Message()
|
| - << "Rule: " << test_case.url_pattern
|
| - << "; ActivationTypes: " << (int)test_case.activation_types
|
| - << "; DocURL: " << test_case.document_url
|
| - << "; ActivationType: " << (int)test_case.activation_type);
|
| -
|
| - AddWhitelistRuleWithActivationTypes(
|
| - UrlPattern(test_case.url_pattern, kSubstring),
|
| - test_case.activation_types);
|
| + SCOPED_TRACE(
|
| + ::testing::Message()
|
| + << "UrlPattern: " << test_case.url_pattern
|
| + << "; ActivationTypes: " << static_cast<int>(test_case.activation_types)
|
| + << "; DocumentURL: " << test_case.document_url
|
| + << "; ActivationType: " << static_cast<int>(test_case.activation_type));
|
| +
|
| + ASSERT_TRUE(AddSimpleWhitelistRule(test_case.url_pattern,
|
| + test_case.activation_types));
|
| Finish();
|
|
|
| EXPECT_EQ(test_case.expect_disabled,
|
| @@ -628,11 +504,12 @@ TEST_F(SubresourceFilterIndexedRulesetTest, OneRuleWithActivationTypes) {
|
| }
|
|
|
| TEST_F(SubresourceFilterIndexedRulesetTest, RuleWithElementAndActivationTypes) {
|
| - UrlRuleBuilder builder(UrlPattern("allow.ex.com"), true /* is_whitelist */);
|
| - builder.rule().set_activation_types(kDocument);
|
| + auto rule = MakeUrlRule(UrlPattern("allow.ex.com", kSubstring));
|
| + rule.set_semantics(proto::RULE_SEMANTICS_WHITELIST);
|
| + rule.set_activation_types(kDocument);
|
|
|
| - AddUrlRule(builder.rule());
|
| - AddBlacklistRule(UrlPattern("ex.com"));
|
| + ASSERT_TRUE(AddUrlRule(rule));
|
| + ASSERT_TRUE(AddSimpleRule("ex.com"));
|
| Finish();
|
|
|
| EXPECT_FALSE(ShouldAllow("http://ex.com"));
|
| @@ -645,37 +522,35 @@ TEST_F(SubresourceFilterIndexedRulesetTest, RuleWithElementAndActivationTypes) {
|
| }
|
|
|
| TEST_F(SubresourceFilterIndexedRulesetTest, MatchWithDisableGenericRules) {
|
| - // Generic rules.
|
| - ASSERT_NO_FATAL_FAILURE(
|
| - AddUrlRule(UrlRuleBuilder(UrlPattern("some_text", kSubstring)).rule()));
|
| - ASSERT_NO_FATAL_FAILURE(
|
| - AddUrlRule(UrlRuleBuilder(UrlPattern("another_text", kSubstring))
|
| - .AddDomain("~example.com")
|
| - .rule()));
|
| -
|
| - // Domain specific rules.
|
| - ASSERT_NO_FATAL_FAILURE(
|
| - AddUrlRule(UrlRuleBuilder(UrlPattern("some_text", kSubstring))
|
| - .AddDomain("example1.com")
|
| - .rule()));
|
| - ASSERT_NO_FATAL_FAILURE(
|
| - AddUrlRule(UrlRuleBuilder(UrlPattern("more_text", kSubstring))
|
| - .AddDomain("example.com")
|
| - .AddDomain("~exclude.example.com")
|
| - .rule()));
|
| - ASSERT_NO_FATAL_FAILURE(
|
| - AddUrlRule(UrlRuleBuilder(UrlPattern("last_text", kSubstring))
|
| - .AddDomain("example1.com")
|
| - .AddDomain("sub.example2.com")
|
| - .rule()));
|
| + const struct {
|
| + const char* url_pattern;
|
| + std::vector<std::string> domains;
|
| + } kRules[] = {
|
| + // Generic rules.
|
| + {"some_text", std::vector<std::string>()},
|
| + {"another_text", {"~example.com"}},
|
| + {"final_text", {"~example1.com", "~example2.com"}},
|
| + // Domain specific rules.
|
| + {"some_text", {"example1.com"}},
|
| + {"more_text", {"example.com", "~exclude.example.com"}},
|
| + {"last_text", {"example1.com", "sub.example2.com"}},
|
| + };
|
| +
|
| + for (const auto& rule_data : kRules) {
|
| + auto rule = MakeUrlRule(UrlPattern(rule_data.url_pattern, kSubstring));
|
| + AddDomains(rule_data.domains, &rule);
|
| + ASSERT_TRUE(AddUrlRule(rule))
|
| + << "UrlPattern: " << rule_data.url_pattern
|
| + << "; Domains: " << ::testing::PrintToString(rule_data.domains);
|
| + }
|
| +
|
| // Note: Some of the rules have common domains (e.g., example1.com), which are
|
| // ultimately shared by FlatBuffers' CreateSharedString. The test also makes
|
| // sure that the data structure works properly with such optimization.
|
| -
|
| Finish();
|
|
|
| const struct {
|
| - const char* url_pattern;
|
| + const char* url;
|
| const char* document_origin;
|
| bool should_allow_with_disable_generic_rules;
|
| bool should_allow_with_enable_all_rules;
|
| @@ -686,6 +561,10 @@ TEST_F(SubresourceFilterIndexedRulesetTest, MatchWithDisableGenericRules) {
|
| {"http://ex.com/another_text", "http://example.com", true, true},
|
| {"http://ex.com/another_text", "http://example1.com", true, false},
|
|
|
| + {"http://ex.com/final_text", "http://example.com", true, false},
|
| + {"http://ex.com/final_text", "http://example1.com", true, true},
|
| + {"http://ex.com/final_text", "http://example2.com", true, true},
|
| +
|
| {"http://ex.com/more_text", "http://example.com", false, false},
|
| {"http://ex.com/more_text", "http://exclude.example.com", true, true},
|
| {"http://ex.com/more_text", "http://example1.com", true, true},
|
| @@ -699,37 +578,37 @@ TEST_F(SubresourceFilterIndexedRulesetTest, MatchWithDisableGenericRules) {
|
| constexpr bool kDisableGenericRules = true;
|
| constexpr bool kEnableAllRules = false;
|
| for (const auto& test_case : kTestCases) {
|
| - SCOPED_TRACE(testing::Message()
|
| - << "Url: " << test_case.url_pattern
|
| - << "; document: " << test_case.document_origin);
|
| + SCOPED_TRACE(::testing::Message()
|
| + << "URL: " << test_case.url
|
| + << "; DocumentOrigin: " << test_case.document_origin);
|
|
|
| EXPECT_EQ(test_case.should_allow_with_disable_generic_rules,
|
| - ShouldAllow(test_case.url_pattern, test_case.document_origin,
|
| + ShouldAllow(test_case.url, test_case.document_origin, kOther,
|
| kDisableGenericRules));
|
| EXPECT_EQ(test_case.should_allow_with_enable_all_rules,
|
| - ShouldAllow(test_case.url_pattern, test_case.document_origin,
|
| + ShouldAllow(test_case.url, test_case.document_origin, kOther,
|
| kEnableAllRules));
|
| }
|
| }
|
|
|
| TEST_F(SubresourceFilterIndexedRulesetTest, EmptyRuleset) {
|
| Finish();
|
| + EXPECT_TRUE(ShouldAllow(nullptr));
|
| EXPECT_TRUE(ShouldAllow("http://example.com"));
|
| EXPECT_TRUE(ShouldAllow("http://another.example.com?param=val"));
|
| - EXPECT_TRUE(ShouldAllow(nullptr));
|
| }
|
|
|
| TEST_F(SubresourceFilterIndexedRulesetTest, NoRuleApplies) {
|
| - AddSimpleRule(UrlPattern("?filtered_content=", kSubstring), false);
|
| - AddSimpleRule(UrlPattern("&filtered_content=", kSubstring), false);
|
| + ASSERT_TRUE(AddSimpleRule("?filter_out="));
|
| + ASSERT_TRUE(AddSimpleRule("&filter_out="));
|
| Finish();
|
|
|
| EXPECT_TRUE(ShouldAllow("http://example.com"));
|
| - EXPECT_TRUE(ShouldAllow("http://example.com?filtered_not"));
|
| + EXPECT_TRUE(ShouldAllow("http://example.com?filter_not"));
|
| }
|
|
|
| TEST_F(SubresourceFilterIndexedRulesetTest, SimpleBlacklist) {
|
| - AddSimpleRule(UrlPattern("?param=", kSubstring), false);
|
| + ASSERT_TRUE(AddSimpleRule("?param="));
|
| Finish();
|
|
|
| EXPECT_TRUE(ShouldAllow("https://example.com"));
|
| @@ -737,26 +616,25 @@ TEST_F(SubresourceFilterIndexedRulesetTest, SimpleBlacklist) {
|
| }
|
|
|
| TEST_F(SubresourceFilterIndexedRulesetTest, SimpleWhitelist) {
|
| - AddSimpleRule(UrlPattern("example.com/?filtered_content=", kSubstring), true);
|
| + ASSERT_TRUE(AddSimpleWhitelistRule("example.com/?filter_out="));
|
| Finish();
|
|
|
| - EXPECT_TRUE(ShouldAllow("https://example.com?filtered_content=image1"));
|
| + EXPECT_TRUE(ShouldAllow("https://example.com?filter_out=true"));
|
| }
|
|
|
| -TEST_F(SubresourceFilterIndexedRulesetTest, BlacklistWhitelist) {
|
| - AddSimpleRule(UrlPattern("?filter=", kSubstring), false);
|
| - AddSimpleRule(UrlPattern("whitelisted.com/?filter=", kSubstring), true);
|
| +TEST_F(SubresourceFilterIndexedRulesetTest, SimpleBlacklistAndWhitelist) {
|
| + ASSERT_TRUE(AddSimpleRule("?filter="));
|
| + ASSERT_TRUE(AddSimpleWhitelistRule("whitelisted.com/?filter="));
|
| Finish();
|
|
|
| - EXPECT_TRUE(ShouldAllow("https://whitelisted.com?filter=off"));
|
| - EXPECT_TRUE(ShouldAllow("https://notblacklisted.com"));
|
| EXPECT_FALSE(ShouldAllow("http://blacklisted.com?filter=on"));
|
| + EXPECT_TRUE(ShouldAllow("https://whitelisted.com?filter=on"));
|
| + EXPECT_TRUE(ShouldAllow("https://notblacklisted.com"));
|
| }
|
|
|
| TEST_F(SubresourceFilterIndexedRulesetTest, BlacklistAndActivationType) {
|
| - AddSimpleRule(UrlPattern("example.com", kSubstring), false);
|
| - AddWhitelistRuleWithActivationTypes(UrlPattern("example.com", kSubstring),
|
| - kDocument);
|
| + ASSERT_TRUE(AddSimpleRule("example.com"));
|
| + ASSERT_TRUE(AddSimpleWhitelistRule("example.com", kDocument));
|
| Finish();
|
|
|
| EXPECT_TRUE(ShouldDeactivate("https://example.com", nullptr, kDocument));
|
| @@ -765,7 +643,7 @@ TEST_F(SubresourceFilterIndexedRulesetTest, BlacklistAndActivationType) {
|
| EXPECT_TRUE(ShouldAllow("https://xample.com"));
|
| }
|
|
|
| -TEST_F(SubresourceFilterIndexedRulesetTest, RuleWithUnsupportedTypes) {
|
| +TEST_F(SubresourceFilterIndexedRulesetTest, RulesWithUnsupportedTypes) {
|
| const struct {
|
| int element_types;
|
| int activation_types;
|
| @@ -781,21 +659,24 @@ TEST_F(SubresourceFilterIndexedRulesetTest, RuleWithUnsupportedTypes) {
|
| {proto::ELEMENT_TYPE_POPUP, proto::ACTIVATION_TYPE_ELEMHIDE},
|
| };
|
|
|
| - for (const auto& rule : kRules) {
|
| - UrlRuleBuilder builder(UrlPattern("example.com"));
|
| - builder.rule().set_element_types(rule.element_types);
|
| - builder.rule().set_activation_types(rule.activation_types);
|
| - EXPECT_FALSE(indexer_.AddUrlRule(builder.rule()));
|
| + for (const auto& rule_data : kRules) {
|
| + auto rule = MakeUrlRule(UrlPattern("example.com", kSubstring));
|
| + rule.set_element_types(rule_data.element_types);
|
| + rule.set_activation_types(rule_data.activation_types);
|
| + EXPECT_FALSE(AddUrlRule(rule))
|
| + << "ElementTypes: " << static_cast<int>(rule_data.element_types)
|
| + << "; ActivationTypes: "
|
| + << static_cast<int>(rule_data.activation_types);
|
| }
|
| - AddSimpleRule(UrlPattern("exmpl.com", kSubstring), false);
|
| -
|
| + ASSERT_TRUE(AddSimpleRule("exmpl.com"));
|
| Finish();
|
| +
|
| EXPECT_TRUE(ShouldAllow("http://example.com/"));
|
| EXPECT_FALSE(ShouldAllow("https://exmpl.com/"));
|
| }
|
|
|
| TEST_F(SubresourceFilterIndexedRulesetTest,
|
| - RuleWithSupportedAndUnsupportedTypes) {
|
| + RulesWithSupportedAndUnsupportedTypes) {
|
| const struct {
|
| int element_types;
|
| int activation_types;
|
| @@ -805,18 +686,22 @@ TEST_F(SubresourceFilterIndexedRulesetTest,
|
| {0, kDocument | (proto::ACTIVATION_TYPE_MAX << 1)},
|
| };
|
|
|
| - for (const auto& rule : kRules) {
|
| - UrlRuleBuilder builder(UrlPattern("example.com"));
|
| - builder.rule().set_element_types(rule.element_types);
|
| - builder.rule().set_activation_types(rule.activation_types);
|
| - if (rule.activation_types)
|
| - builder.rule().set_semantics(proto::RULE_SEMANTICS_WHITELIST);
|
| - EXPECT_TRUE(indexer_.AddUrlRule(builder.rule()));
|
| + for (const auto& rule_data : kRules) {
|
| + auto rule = MakeUrlRule(UrlPattern("example.com", kSubstring));
|
| + rule.set_element_types(rule_data.element_types);
|
| + rule.set_activation_types(rule_data.activation_types);
|
| + if (rule_data.activation_types)
|
| + rule.set_semantics(proto::RULE_SEMANTICS_WHITELIST);
|
| + EXPECT_TRUE(AddUrlRule(rule))
|
| + << "ElementTypes: " << static_cast<int>(rule_data.element_types)
|
| + << "; ActivationTypes: "
|
| + << static_cast<int>(rule_data.activation_types);
|
| }
|
| Finish();
|
|
|
| EXPECT_FALSE(ShouldAllow("http://example.com/", nullptr, kImage));
|
| EXPECT_FALSE(ShouldAllow("http://example.com/", nullptr, kScript));
|
| + EXPECT_TRUE(ShouldAllow("http://example.com/", nullptr, kPopup));
|
| EXPECT_TRUE(ShouldAllow("http://example.com/"));
|
|
|
| EXPECT_TRUE(ShouldDeactivate("http://example.com", nullptr, kDocument));
|
|
|