File: url_pattern_unittest.cc

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (206 lines) | stat: -rw-r--r-- 10,129 bytes parent folder | download | duplicates (11)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
// Copyright 2016 The Chromium Authors
// 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