OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 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 | |
5 #include "chrome/common/extensions/extension.h" | |
6 | |
7 #include "base/values.h" | |
8 #include "googleurl/src/gurl.h" | |
9 #include "testing/gtest/include/gtest/gtest.h" | |
10 | |
11 namespace { | |
12 | |
13 void AddPattern(URLPatternSet* set, const std::string& pattern) { | |
14 int schemes = URLPattern::SCHEME_ALL; | |
15 set->AddPattern(URLPattern(schemes, pattern)); | |
16 } | |
17 | |
18 URLPatternSet Patterns(const std::string& pattern) { | |
19 URLPatternSet set; | |
20 AddPattern(&set, pattern); | |
21 return set; | |
22 } | |
23 | |
24 URLPatternSet Patterns(const std::string& pattern1, | |
25 const std::string& pattern2) { | |
26 URLPatternSet set; | |
27 AddPattern(&set, pattern1); | |
28 AddPattern(&set, pattern2); | |
29 return set; | |
30 } | |
31 | |
32 } | |
33 | |
34 TEST(URLPatternSetTest, Empty) { | |
35 URLPatternSet set; | |
36 EXPECT_FALSE(set.MatchesURL(GURL("http://www.foo.com/bar"))); | |
37 EXPECT_FALSE(set.MatchesURL(GURL())); | |
38 EXPECT_FALSE(set.MatchesURL(GURL("invalid"))); | |
39 } | |
40 | |
41 TEST(URLPatternSetTest, One) { | |
42 URLPatternSet set; | |
43 AddPattern(&set, "http://www.google.com/*"); | |
44 | |
45 EXPECT_TRUE(set.MatchesURL(GURL("http://www.google.com/"))); | |
46 EXPECT_TRUE(set.MatchesURL(GURL("http://www.google.com/monkey"))); | |
47 EXPECT_FALSE(set.MatchesURL(GURL("https://www.google.com/"))); | |
48 EXPECT_FALSE(set.MatchesURL(GURL("https://www.microsoft.com/"))); | |
49 } | |
50 | |
51 TEST(URLPatternSetTest, Two) { | |
52 URLPatternSet set; | |
53 AddPattern(&set, "http://www.google.com/*"); | |
54 AddPattern(&set, "http://www.yahoo.com/*"); | |
55 | |
56 EXPECT_TRUE(set.MatchesURL(GURL("http://www.google.com/monkey"))); | |
57 EXPECT_TRUE(set.MatchesURL(GURL("http://www.yahoo.com/monkey"))); | |
58 EXPECT_FALSE(set.MatchesURL(GURL("https://www.apple.com/monkey"))); | |
59 } | |
60 | |
61 TEST(URLPatternSetTest, OverlapsWith) { | |
62 URLPatternSet set1; | |
63 AddPattern(&set1, "http://www.google.com/f*"); | |
64 AddPattern(&set1, "http://www.yahoo.com/b*"); | |
65 | |
66 URLPatternSet set2; | |
67 AddPattern(&set2, "http://www.reddit.com/f*"); | |
68 AddPattern(&set2, "http://www.yahoo.com/z*"); | |
69 | |
70 URLPatternSet set3; | |
71 AddPattern(&set3, "http://www.google.com/q/*"); | |
72 AddPattern(&set3, "http://www.yahoo.com/b/*"); | |
73 | |
74 EXPECT_FALSE(set1.OverlapsWith(set2)); | |
75 EXPECT_FALSE(set2.OverlapsWith(set1)); | |
76 | |
77 EXPECT_TRUE(set1.OverlapsWith(set3)); | |
78 EXPECT_TRUE(set3.OverlapsWith(set1)); | |
79 } | |
80 | |
81 TEST(URLPatternSetTest, CreateDifference) { | |
82 URLPatternSet expected; | |
83 URLPatternSet set1; | |
84 URLPatternSet set2; | |
85 AddPattern(&set1, "http://www.google.com/f*"); | |
86 AddPattern(&set1, "http://www.yahoo.com/b*"); | |
87 | |
88 // Subtract an empty set. | |
89 URLPatternSet result; | |
90 URLPatternSet::CreateDifference(set1, set2, &result); | |
91 EXPECT_EQ(set1, result); | |
92 | |
93 // Subtract a real set. | |
94 AddPattern(&set2, "http://www.reddit.com/f*"); | |
95 AddPattern(&set2, "http://www.yahoo.com/z*"); | |
96 AddPattern(&set2, "http://www.google.com/f*"); | |
97 | |
98 AddPattern(&expected, "http://www.yahoo.com/b*"); | |
99 | |
100 result.ClearPatterns(); | |
101 URLPatternSet::CreateDifference(set1, set2, &result); | |
102 EXPECT_EQ(expected, result); | |
103 EXPECT_FALSE(result.is_empty()); | |
104 EXPECT_TRUE(set1.Contains(result)); | |
105 EXPECT_FALSE(result.Contains(set2)); | |
106 EXPECT_FALSE(set2.Contains(result)); | |
107 | |
108 URLPatternSet intersection; | |
109 URLPatternSet::CreateIntersection(result, set2, &intersection); | |
110 EXPECT_TRUE(intersection.is_empty()); | |
111 } | |
112 | |
113 TEST(URLPatternSetTest, CreateIntersection) { | |
114 URLPatternSet empty_set; | |
115 URLPatternSet expected; | |
116 URLPatternSet set1; | |
117 AddPattern(&set1, "http://www.google.com/f*"); | |
118 AddPattern(&set1, "http://www.yahoo.com/b*"); | |
119 | |
120 // Intersection with an empty set. | |
121 URLPatternSet result; | |
122 URLPatternSet::CreateIntersection(set1, empty_set, &result); | |
123 EXPECT_EQ(expected, result); | |
124 EXPECT_TRUE(result.is_empty()); | |
125 EXPECT_TRUE(empty_set.Contains(result)); | |
126 EXPECT_TRUE(result.Contains(empty_set)); | |
127 EXPECT_TRUE(set1.Contains(result)); | |
128 | |
129 // Intersection with a real set. | |
130 URLPatternSet set2; | |
131 AddPattern(&set2, "http://www.reddit.com/f*"); | |
132 AddPattern(&set2, "http://www.yahoo.com/z*"); | |
133 AddPattern(&set2, "http://www.google.com/f*"); | |
134 | |
135 AddPattern(&expected, "http://www.google.com/f*"); | |
136 | |
137 result.ClearPatterns(); | |
138 URLPatternSet::CreateIntersection(set1, set2, &result); | |
139 EXPECT_EQ(expected, result); | |
140 EXPECT_FALSE(result.is_empty()); | |
141 EXPECT_TRUE(set1.Contains(result)); | |
142 EXPECT_TRUE(set2.Contains(result)); | |
143 } | |
144 | |
145 TEST(URLPatternSetTest, CreateUnion) { | |
146 URLPatternSet empty_set; | |
147 | |
148 URLPatternSet set1; | |
149 AddPattern(&set1, "http://www.google.com/f*"); | |
150 AddPattern(&set1, "http://www.yahoo.com/b*"); | |
151 | |
152 URLPatternSet expected; | |
153 AddPattern(&expected, "http://www.google.com/f*"); | |
154 AddPattern(&expected, "http://www.yahoo.com/b*"); | |
155 | |
156 // Union with an empty set. | |
157 URLPatternSet result; | |
158 URLPatternSet::CreateUnion(set1, empty_set, &result); | |
159 EXPECT_EQ(expected, result); | |
160 | |
161 // Union with a real set. | |
162 URLPatternSet set2; | |
163 AddPattern(&set2, "http://www.reddit.com/f*"); | |
164 AddPattern(&set2, "http://www.yahoo.com/z*"); | |
165 AddPattern(&set2, "http://www.google.com/f*"); | |
166 | |
167 AddPattern(&expected, "http://www.reddit.com/f*"); | |
168 AddPattern(&expected, "http://www.yahoo.com/z*"); | |
169 | |
170 result.ClearPatterns(); | |
171 URLPatternSet::CreateUnion(set1, set2, &result); | |
172 EXPECT_EQ(expected, result); | |
173 } | |
174 | |
175 TEST(URLPatternSetTest, Contains) { | |
176 URLPatternSet set1; | |
177 URLPatternSet set2; | |
178 URLPatternSet empty_set; | |
179 | |
180 AddPattern(&set1, "http://www.google.com/*"); | |
181 AddPattern(&set1, "http://www.yahoo.com/*"); | |
182 | |
183 AddPattern(&set2, "http://www.reddit.com/*"); | |
184 | |
185 EXPECT_FALSE(set1.Contains(set2)); | |
186 EXPECT_TRUE(set1.Contains(empty_set)); | |
187 EXPECT_FALSE(empty_set.Contains(set1)); | |
188 | |
189 AddPattern(&set2, "http://www.yahoo.com/*"); | |
190 | |
191 EXPECT_FALSE(set1.Contains(set2)); | |
192 EXPECT_FALSE(set2.Contains(set1)); | |
193 | |
194 AddPattern(&set2, "http://www.google.com/*"); | |
195 | |
196 EXPECT_FALSE(set1.Contains(set2)); | |
197 EXPECT_TRUE(set2.Contains(set1)); | |
198 | |
199 // Note that this just checks pattern equality, and not if individual patterns | |
200 // contain other patterns. For example: | |
201 AddPattern(&set1, "http://*.reddit.com/*"); | |
202 EXPECT_FALSE(set1.Contains(set2)); | |
203 EXPECT_FALSE(set2.Contains(set1)); | |
204 } | |
205 | |
206 TEST(URLPatternSetTest, Duplicates) { | |
207 URLPatternSet set1; | |
208 URLPatternSet set2; | |
209 | |
210 AddPattern(&set1, "http://www.google.com/*"); | |
211 AddPattern(&set2, "http://www.google.com/*"); | |
212 | |
213 AddPattern(&set1, "http://www.google.com/*"); | |
214 | |
215 // The sets should still be equal after adding a duplicate. | |
216 EXPECT_EQ(set2, set1); | |
217 } | |
218 | |
219 TEST(URLPatternSetTest, ToValueAndPopulate) { | |
220 URLPatternSet set1; | |
221 URLPatternSet set2; | |
222 | |
223 std::vector<std::string> patterns; | |
224 patterns.push_back("http://www.google.com/*"); | |
225 patterns.push_back("http://www.yahoo.com/*"); | |
226 | |
227 for (size_t i = 0; i < patterns.size(); ++i) | |
228 AddPattern(&set1, patterns[i]); | |
229 | |
230 std::string error; | |
231 bool allow_file_access = false; | |
232 scoped_ptr<base::ListValue> value(set1.ToValue()); | |
233 set2.Populate(*value, URLPattern::SCHEME_ALL, allow_file_access, &error); | |
234 EXPECT_EQ(set1, set2); | |
235 | |
236 set2.ClearPatterns(); | |
237 set2.Populate(patterns, URLPattern::SCHEME_ALL, allow_file_access, &error); | |
238 EXPECT_EQ(set1, set2); | |
239 } | |
240 | |
241 TEST(URLPatternSetTest, NwayUnion) { | |
242 std::string google_a = "http://www.google.com/a*"; | |
243 std::string google_b = "http://www.google.com/b*"; | |
244 std::string google_c = "http://www.google.com/c*"; | |
245 std::string yahoo_a = "http://www.yahoo.com/a*"; | |
246 std::string yahoo_b = "http://www.yahoo.com/b*"; | |
247 std::string yahoo_c = "http://www.yahoo.com/c*"; | |
248 std::string reddit_a = "http://www.reddit.com/a*"; | |
249 std::string reddit_b = "http://www.reddit.com/b*"; | |
250 std::string reddit_c = "http://www.reddit.com/c*"; | |
251 | |
252 // Empty list. | |
253 { | |
254 std::vector<URLPatternSet> empty; | |
255 | |
256 URLPatternSet result; | |
257 URLPatternSet::CreateUnion(empty, &result); | |
258 | |
259 URLPatternSet expected; | |
260 EXPECT_EQ(expected, result); | |
261 } | |
262 | |
263 // Singleton list. | |
264 { | |
265 std::vector<URLPatternSet> test; | |
266 test.push_back(Patterns(google_a)); | |
267 | |
268 URLPatternSet result; | |
269 URLPatternSet::CreateUnion(test, &result); | |
270 | |
271 URLPatternSet expected = Patterns(google_a); | |
272 EXPECT_EQ(expected, result); | |
273 } | |
274 | |
275 // List with 2 elements. | |
276 { | |
277 | |
278 std::vector<URLPatternSet> test; | |
279 test.push_back(Patterns(google_a, google_b)); | |
280 test.push_back(Patterns(google_b, google_c)); | |
281 | |
282 URLPatternSet result; | |
283 URLPatternSet::CreateUnion(test, &result); | |
284 | |
285 URLPatternSet expected; | |
286 AddPattern(&expected, google_a); | |
287 AddPattern(&expected, google_b); | |
288 AddPattern(&expected, google_c); | |
289 EXPECT_EQ(expected, result); | |
290 } | |
291 | |
292 // List with 3 elements. | |
293 { | |
294 std::vector<URLPatternSet> test; | |
295 test.push_back(Patterns(google_a, google_b)); | |
296 test.push_back(Patterns(google_b, google_c)); | |
297 test.push_back(Patterns(yahoo_a, yahoo_b)); | |
298 | |
299 URLPatternSet result; | |
300 URLPatternSet::CreateUnion(test, &result); | |
301 | |
302 URLPatternSet expected; | |
303 AddPattern(&expected, google_a); | |
304 AddPattern(&expected, google_b); | |
305 AddPattern(&expected, google_c); | |
306 AddPattern(&expected, yahoo_a); | |
307 AddPattern(&expected, yahoo_b); | |
308 EXPECT_EQ(expected, result); | |
309 } | |
310 | |
311 // List with 7 elements. | |
312 { | |
313 std::vector<URLPatternSet> test; | |
314 test.push_back(Patterns(google_a)); | |
315 test.push_back(Patterns(google_b)); | |
316 test.push_back(Patterns(google_c)); | |
317 test.push_back(Patterns(yahoo_a)); | |
318 test.push_back(Patterns(yahoo_b)); | |
319 test.push_back(Patterns(yahoo_c)); | |
320 test.push_back(Patterns(reddit_a)); | |
321 | |
322 URLPatternSet result; | |
323 URLPatternSet::CreateUnion(test, &result); | |
324 | |
325 URLPatternSet expected; | |
326 AddPattern(&expected, google_a); | |
327 AddPattern(&expected, google_b); | |
328 AddPattern(&expected, google_c); | |
329 AddPattern(&expected, yahoo_a); | |
330 AddPattern(&expected, yahoo_b); | |
331 AddPattern(&expected, yahoo_c); | |
332 AddPattern(&expected, reddit_a); | |
333 EXPECT_EQ(expected, result); | |
334 } | |
335 | |
336 // List with 8 elements. | |
337 { | |
338 std::vector<URLPatternSet> test; | |
339 test.push_back(Patterns(google_a)); | |
340 test.push_back(Patterns(google_b)); | |
341 test.push_back(Patterns(google_c)); | |
342 test.push_back(Patterns(yahoo_a)); | |
343 test.push_back(Patterns(yahoo_b)); | |
344 test.push_back(Patterns(yahoo_c)); | |
345 test.push_back(Patterns(reddit_a)); | |
346 test.push_back(Patterns(reddit_b)); | |
347 | |
348 URLPatternSet result; | |
349 URLPatternSet::CreateUnion(test, &result); | |
350 | |
351 URLPatternSet expected; | |
352 AddPattern(&expected, google_a); | |
353 AddPattern(&expected, google_b); | |
354 AddPattern(&expected, google_c); | |
355 AddPattern(&expected, yahoo_a); | |
356 AddPattern(&expected, yahoo_b); | |
357 AddPattern(&expected, yahoo_c); | |
358 AddPattern(&expected, reddit_a); | |
359 AddPattern(&expected, reddit_b); | |
360 EXPECT_EQ(expected, result); | |
361 } | |
362 | |
363 // List with 9 elements. | |
364 { | |
365 | |
366 std::vector<URLPatternSet> test; | |
367 test.push_back(Patterns(google_a)); | |
368 test.push_back(Patterns(google_b)); | |
369 test.push_back(Patterns(google_c)); | |
370 test.push_back(Patterns(yahoo_a)); | |
371 test.push_back(Patterns(yahoo_b)); | |
372 test.push_back(Patterns(yahoo_c)); | |
373 test.push_back(Patterns(reddit_a)); | |
374 test.push_back(Patterns(reddit_b)); | |
375 test.push_back(Patterns(reddit_c)); | |
376 | |
377 URLPatternSet result; | |
378 URLPatternSet::CreateUnion(test, &result); | |
379 | |
380 URLPatternSet expected; | |
381 AddPattern(&expected, google_a); | |
382 AddPattern(&expected, google_b); | |
383 AddPattern(&expected, google_c); | |
384 AddPattern(&expected, yahoo_a); | |
385 AddPattern(&expected, yahoo_b); | |
386 AddPattern(&expected, yahoo_c); | |
387 AddPattern(&expected, reddit_a); | |
388 AddPattern(&expected, reddit_b); | |
389 AddPattern(&expected, reddit_c); | |
390 EXPECT_EQ(expected, result); | |
391 } | |
392 } | |
OLD | NEW |