blob: a2c642a4b4241fe154690ebff14e1b88f91acf54 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/url_pattern_index/url_pattern.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
namespace url_pattern_index {
namespace {
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 UrlPattern::MatchCase kMatchCase = UrlPattern::MatchCase::kTrue;
constexpr UrlPattern::MatchCase kDonotMatchCase = UrlPattern::MatchCase::kFalse;
} // namespace
TEST(UrlPatternTest, MatchesUrl) {
const struct {
UrlPattern url_pattern;
const char* url;
bool expect_match;
} kTestCases[] = {
{{"", proto::URL_PATTERN_TYPE_SUBSTRING}, "http://ex.com/", true},
{{"", proto::URL_PATTERN_TYPE_WILDCARDED}, "http://ex.com/", true},
{{"", kBoundary, kAnchorNone}, "http://ex.com/", true},
{{"", kSubdomain, kAnchorNone}, "http://ex.com/", true},
{{"", kSubdomain, kAnchorNone}, "http://ex.com/", true},
{{"^", kSubdomain, kAnchorNone}, "http://ex.com/", false},
{{".", kSubdomain, kAnchorNone}, "http://ex.com/", false},
{{"", kAnchorNone, kBoundary}, "http://ex.com/", true},
{{"^", kAnchorNone, kBoundary}, "http://ex.com/", true},
{{".", kAnchorNone, kBoundary}, "http://ex.com/", false},
{{"", kBoundary, kBoundary}, "http://ex.com/", false},
{{"", kSubdomain, kBoundary}, "http://ex.com/", false},
{{"com/", kSubdomain, kBoundary}, "http://ex.com/", true},
{{"xampl", proto::URL_PATTERN_TYPE_SUBSTRING},
"http://example.com",
true},
{{"example", proto::URL_PATTERN_TYPE_SUBSTRING},
"http://example.com",
true},
{{"/a?a"}, "http://ex.com/a?a", true},
{{"^abc"}, "http://ex.com/abc?a", true},
{{"^abc"}, "http://ex.com/a?abc", true},
{{"^abc"}, "http://ex.com/abc?abc", true},
{{"^abc^abc"}, "http://ex.com/abc?abc", true},
{{"^com^abc^abc"}, "http://ex.com/abc?abc", false},
{{"http://ex", kBoundary, kAnchorNone}, "http://example.com", true},
{{"http://ex", kAnchorNone, kAnchorNone}, "http://example.com", true},
{{"mple.com/", kAnchorNone, kBoundary}, "http://example.com", true},
{{"mple.com/", kAnchorNone, kAnchorNone}, "http://example.com", true},
{{"mple.com/", kSubdomain, kAnchorNone}, "http://example.com", false},
{{"ex.com", kSubdomain, kAnchorNone}, "http://hex.com", false},
{{"ex.com", kSubdomain, kAnchorNone}, "http://ex.com", true},
{{"ex.com", kSubdomain, kAnchorNone}, "http://hex.ex.com", true},
{{"ex.com", kSubdomain, kAnchorNone}, "http://hex.hex.com", false},
// Note: "example.com" will be normalized into "example.com/".
{{"example.com^", kSubdomain, kAnchorNone},
"http://www.example.com",
true},
{{"http://*mpl", kBoundary, kAnchorNone}, "http://example.com", true},
{{"mpl*com/", kAnchorNone, kBoundary}, "http://example.com", true},
{{"example^com"}, "http://example.com", false},
{{"example^com"}, "http://example/com", true},
{{"example.com^"}, "http://example.com:8080", true},
{{"http*.com/", kBoundary, kBoundary}, "http://example.com", true},
{{"http*.org/", kBoundary, kBoundary}, "http://example.com", false},
{{"/path?*&p1=*&p2="}, "http://ex.com/aaa/path/bbb?k=v&p1=0&p2=1", false},
{{"/path?*&p1=*&p2="}, "http://ex.com/aaa/path?k=v&p1=0&p2=1", true},
{{"/path?*&p1=*&p2="}, "http://ex.com/aaa/path?k=v&k=v&p1=0&p2=1", true},
{{"/path?*&p1=*&p2="},
"http://ex.com/aaa/path?k=v&p1=0&p3=10&p2=1",
true},
{{"/path?*&p1=*&p2="}, "http://ex.com/aaa/path&p1=0&p2=1", false},
{{"/path?*&p1=*&p2="}, "http://ex.com/aaa/path?k=v&p2=0&p1=1", false},
{{"abc*def*ghijk*xyz"},
"http://example.com/abcdeffffghijkmmmxyzzz",
true},
{{"abc*cdef"}, "http://example.com/abcdef", false},
{{"^^a^^"}, "http://ex.com/?a=/", true},
{{"^^a^^"}, "http://ex.com/?a=/&b=0", true},
{{"^^a^^"}, "http://ex.com/?a=x", false},
// The last ^ matches the end of the url.
{{"^^a^^"}, "http://ex.com/?a=", true},
{{"ex.com^path^*k=v^"}, "http://ex.com/path/?k1=v1&ak=v&kk=vv", true},
{{"ex.com^path^*k=v^"}, "http://ex.com/p/path/?k1=v1&ak=v&kk=vv", false},
{{"a^a&a^a&"}, "http://ex.com/a/a/a/a/?a&a&a&a&a", true},
{{"abc*def^"}, "http://ex.com/abc/a/ddef/", true},
{{"https://example.com/"}, "http://example.com/", false},
{{"example.com/", kSubdomain, kAnchorNone}, "http://example.com/", true},
{{"examp", kSubdomain, kAnchorNone}, "http://example.com/", true},
{{"xamp", kSubdomain, kAnchorNone}, "http://example.com/", false},
{{"examp", kSubdomain, kAnchorNone}, "http://test.example.com/", true},
{{"t.examp", kSubdomain, kAnchorNone}, "http://test.example.com/", false},
{{"com^", kSubdomain, kAnchorNone}, "http://test.example.com/", true},
{{"com^x", kSubdomain, kBoundary}, "http://a.com/x", true},
{{"x.com", kSubdomain, kAnchorNone}, "http://ex.com/?url=x.com", false},
{{"ex.com/", kSubdomain, kBoundary}, "http://ex.com/", true},
{{"ex.com^", kSubdomain, kBoundary}, "http://ex.com/", true},
{{"ex.co", kSubdomain, kBoundary}, "http://ex.com/", false},
{{"ex.com", kSubdomain, kBoundary}, "http://rex.com.ex.com/", false},
{{"ex.com/", kSubdomain, kBoundary}, "http://rex.com.ex.com/", true},
{{"http", kSubdomain, kBoundary}, "http://http.com/", false},
{{"http", kSubdomain, kAnchorNone}, "http://http.com/", true},
{{"/example.com", kSubdomain, kBoundary}, "http://example.com/", false},
{{"/example.com/", kSubdomain, kBoundary}, "http://example.com/", false},
{{".", kSubdomain, kAnchorNone}, "http://a..com/", true},
{{"^", kSubdomain, kAnchorNone}, "http://a..com/", false},
{{".", kSubdomain, kAnchorNone}, "http://a.com./", false},
{{"^", kSubdomain, kAnchorNone}, "http://a.com./", true},
{{".", kSubdomain, kAnchorNone}, "http://a.com../", true},
{{"^", kSubdomain, kAnchorNone}, "http://a.com../", true},
{{"/path", kSubdomain, kAnchorNone}, "http://a.com./path/to/x", true},
{{"^path", kSubdomain, kAnchorNone}, "http://a.com./path/to/x", true},
{{"/path", kSubdomain, kBoundary}, "http://a.com./path", true},
{{"^path", kSubdomain, kBoundary}, "http://a.com./path", true},
{{"path", kSubdomain, kBoundary}, "http://a.com./path", false},
// Case-sensitivity tests.
{{"path", proto::URL_PATTERN_TYPE_SUBSTRING, kDonotMatchCase},
"http://a.com/PaTh",
true},
{{"path", proto::URL_PATTERN_TYPE_SUBSTRING, kMatchCase},
"http://a.com/PaTh",
false},
{{"path", proto::URL_PATTERN_TYPE_SUBSTRING, kDonotMatchCase},
"http://a.com/path",
true},
{{"path", proto::URL_PATTERN_TYPE_SUBSTRING, kMatchCase},
"http://a.com/path",
true},
{{"abc*def^", proto::URL_PATTERN_TYPE_WILDCARDED, kMatchCase},
"http://a.com/abcxAdef/vo",
true},
{{"abc*def^", proto::URL_PATTERN_TYPE_WILDCARDED, kMatchCase},
"http://a.com/aBcxAdeF/vo",
false},
{{"abc*def^", proto::URL_PATTERN_TYPE_WILDCARDED, kDonotMatchCase},
"http://a.com/aBcxAdeF/vo",
true},
{{"abc*def^", proto::URL_PATTERN_TYPE_WILDCARDED, kDonotMatchCase},
"http://a.com/abcxAdef/vo",
true},
{{"abc^", kAnchorNone, kAnchorNone}, "https://xyz.com/abc/123", true},
{{"abc^", kAnchorNone, kAnchorNone}, "https://xyz.com/abc", true},
{{"abc^", kAnchorNone, kAnchorNone}, "https://abc.com", false},
{{"abc^", kAnchorNone, kBoundary}, "https://xyz.com/abc/", true},
{{"abc^", kAnchorNone, kBoundary}, "https://xyz.com/abc", true},
{{"abc^", kAnchorNone, kBoundary}, "https://xyz.com/abc/123", false},
{{"http://abc.com/x^", kBoundary, kAnchorNone}, "http://abc.com/x", true},
{{"http://abc.com/x^", kBoundary, kAnchorNone},
"http://abc.com/x/",
true},
{{"http://abc.com/x^", kBoundary, kAnchorNone},
"http://abc.com/x/123",
true},
{{"http://abc.com/x^", kBoundary, kBoundary}, "http://abc.com/x", true},
{{"http://abc.com/x^", kBoundary, kBoundary}, "http://abc.com/x/", true},
{{"http://abc.com/x^", kBoundary, kBoundary},
"http://abc.com/x/123",
false},
{{"abc.com^", kSubdomain, kAnchorNone}, "http://xyz.abc.com/123", true},
{{"abc.com^", kSubdomain, kAnchorNone}, "http://xyz.abc.com", true},
{{"abc.com^", kSubdomain, kAnchorNone},
"http://abc.com.xyz.com?q=abc.com",
false},
{{"abc.com^", kSubdomain, kBoundary}, "http://xyz.abc.com/123", false},
{{"abc.com^", kSubdomain, kBoundary}, "http://xyz.abc.com", true},
{{"abc.com^", kSubdomain, kBoundary},
"http://abc.com.xyz.com?q=abc.com/",
false},
{{"abc*^", kAnchorNone, kAnchorNone}, "https://abc.com", true},
{{"abc*^", kAnchorNone, kAnchorNone}, "https://abc.com?q=123", true},
{{"abc*^", kAnchorNone, kBoundary}, "https://abc.com", true},
{{"abc*^", kAnchorNone, kBoundary}, "https://abc.com?q=123", true},
{{"abc*", kAnchorNone, kBoundary}, "https://a.com/abcxyz", true},
{{"*google.com", kBoundary, kAnchorNone}, "https://www.google.com", true},
{{"*", kBoundary, kBoundary}, "https://example.com", true},
{{"", kBoundary, kBoundary}, "https://example.com", false},
};
for (const auto& test_case : kTestCases) {
SCOPED_TRACE(testing::Message() << "Rule: " << test_case.url_pattern
<< "; URL: " << GURL(test_case.url));
GURL url(test_case.url);
const bool is_match =
test_case.url_pattern.MatchesUrl(UrlPattern::UrlInfo(url));
EXPECT_EQ(test_case.expect_match, is_match);
}
}
} // namespace url_pattern_index