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.
6 #include "base/bind_helpers.h"
7 #include "base/message_loop/message_loop.h"
8 #include "base/run_loop.h"
9 #include "chrome/browser/managed_mode/managed_mode_url_filter.h"
10 #include "testing/gtest/include/gtest/gtest.h"
13 class ManagedModeURLFilterTest : public ::testing::Test,
14 public ManagedModeURLFilter::Observer {
16 ManagedModeURLFilterTest() : filter_(new ManagedModeURLFilter) {
17 filter_->SetDefaultFilteringBehavior(ManagedModeURLFilter::BLOCK);
18 filter_->AddObserver(this);
21 virtual ~ManagedModeURLFilterTest() {
22 filter_->RemoveObserver(this);
25 // ManagedModeURLFilter::Observer:
26 virtual void OnSiteListUpdated() OVERRIDE {
31 bool IsURLWhitelisted(const std::string& url) {
32 return filter_->GetFilteringBehaviorForURL(GURL(url)) ==
33 ManagedModeURLFilter::ALLOW;
36 base::MessageLoop message_loop_;
37 base::RunLoop run_loop_;
38 scoped_refptr<ManagedModeURLFilter> filter_;
41 TEST_F(ManagedModeURLFilterTest, Basic) {
42 std::vector<std::string> list;
43 // Allow domain and all subdomains, for any filtered scheme.
44 list.push_back("google.com");
45 filter_->SetFromPatterns(list);
48 EXPECT_TRUE(IsURLWhitelisted("http://google.com"));
49 EXPECT_TRUE(IsURLWhitelisted("http://google.com/"));
50 EXPECT_TRUE(IsURLWhitelisted("http://google.com/whatever"));
51 EXPECT_TRUE(IsURLWhitelisted("https://google.com/"));
52 EXPECT_FALSE(IsURLWhitelisted("http://notgoogle.com/"));
53 EXPECT_TRUE(IsURLWhitelisted("http://mail.google.com"));
54 EXPECT_TRUE(IsURLWhitelisted("http://x.mail.google.com"));
55 EXPECT_TRUE(IsURLWhitelisted("https://x.mail.google.com/"));
56 EXPECT_TRUE(IsURLWhitelisted("http://x.y.google.com/a/b"));
57 EXPECT_FALSE(IsURLWhitelisted("http://youtube.com/"));
59 EXPECT_TRUE(IsURLWhitelisted("bogus://youtube.com/"));
60 EXPECT_TRUE(IsURLWhitelisted("chrome://youtube.com/"));
61 EXPECT_TRUE(IsURLWhitelisted("chrome://extensions/"));
62 EXPECT_TRUE(IsURLWhitelisted("chrome-extension://foo/main.html"));
63 EXPECT_TRUE(IsURLWhitelisted("file:///home/chronos/user/Downloads/img.jpg"));
66 TEST_F(ManagedModeURLFilterTest, Inactive) {
67 filter_->SetDefaultFilteringBehavior(ManagedModeURLFilter::ALLOW);
69 std::vector<std::string> list;
70 list.push_back("google.com");
71 filter_->SetFromPatterns(list);
74 // If the filter is inactive, every URL should be whitelisted.
75 EXPECT_TRUE(IsURLWhitelisted("http://google.com"));
76 EXPECT_TRUE(IsURLWhitelisted("https://www.example.com"));
79 TEST_F(ManagedModeURLFilterTest, Scheme) {
80 std::vector<std::string> list;
81 // Filter only http, ftp and ws schemes.
82 list.push_back("http://secure.com");
83 list.push_back("ftp://secure.com");
84 list.push_back("ws://secure.com");
85 filter_->SetFromPatterns(list);
88 EXPECT_TRUE(IsURLWhitelisted("http://secure.com"));
89 EXPECT_TRUE(IsURLWhitelisted("http://secure.com/whatever"));
90 EXPECT_TRUE(IsURLWhitelisted("ftp://secure.com/"));
91 EXPECT_TRUE(IsURLWhitelisted("ws://secure.com"));
92 EXPECT_FALSE(IsURLWhitelisted("https://secure.com/"));
93 EXPECT_FALSE(IsURLWhitelisted("wss://secure.com"));
94 EXPECT_TRUE(IsURLWhitelisted("http://www.secure.com"));
95 EXPECT_FALSE(IsURLWhitelisted("https://www.secure.com"));
96 EXPECT_FALSE(IsURLWhitelisted("wss://www.secure.com"));
99 TEST_F(ManagedModeURLFilterTest, Path) {
100 std::vector<std::string> list;
101 // Filter only a certain path prefix.
102 list.push_back("path.to/ruin");
103 filter_->SetFromPatterns(list);
106 EXPECT_TRUE(IsURLWhitelisted("http://path.to/ruin"));
107 EXPECT_TRUE(IsURLWhitelisted("https://path.to/ruin"));
108 EXPECT_TRUE(IsURLWhitelisted("http://path.to/ruins"));
109 EXPECT_TRUE(IsURLWhitelisted("http://path.to/ruin/signup"));
110 EXPECT_TRUE(IsURLWhitelisted("http://www.path.to/ruin"));
111 EXPECT_FALSE(IsURLWhitelisted("http://path.to/fortune"));
114 TEST_F(ManagedModeURLFilterTest, PathAndScheme) {
115 std::vector<std::string> list;
116 // Filter only a certain path prefix and scheme.
117 list.push_back("https://s.aaa.com/path");
118 filter_->SetFromPatterns(list);
121 EXPECT_TRUE(IsURLWhitelisted("https://s.aaa.com/path"));
122 EXPECT_TRUE(IsURLWhitelisted("https://s.aaa.com/path/bbb"));
123 EXPECT_FALSE(IsURLWhitelisted("http://s.aaa.com/path"));
124 EXPECT_FALSE(IsURLWhitelisted("https://aaa.com/path"));
125 EXPECT_FALSE(IsURLWhitelisted("https://x.aaa.com/path"));
126 EXPECT_FALSE(IsURLWhitelisted("https://s.aaa.com/bbb"));
127 EXPECT_FALSE(IsURLWhitelisted("https://s.aaa.com/"));
130 TEST_F(ManagedModeURLFilterTest, Host) {
131 std::vector<std::string> list;
132 // Filter only a certain hostname, without subdomains.
133 list.push_back(".www.example.com");
134 filter_->SetFromPatterns(list);
137 EXPECT_TRUE(IsURLWhitelisted("http://www.example.com"));
138 EXPECT_FALSE(IsURLWhitelisted("http://example.com"));
139 EXPECT_FALSE(IsURLWhitelisted("http://subdomain.example.com"));
142 TEST_F(ManagedModeURLFilterTest, IPAddress) {
143 std::vector<std::string> list;
144 // Filter an ip address.
145 list.push_back("123.123.123.123");
146 filter_->SetFromPatterns(list);
149 EXPECT_TRUE(IsURLWhitelisted("http://123.123.123.123/"));
150 EXPECT_FALSE(IsURLWhitelisted("http://123.123.123.124/"));
153 TEST_F(ManagedModeURLFilterTest, Canonicalization) {
154 // We assume that the hosts and URLs are already canonicalized.
155 std::map<std::string, bool> hosts;
156 hosts["www.moose.org"] = true;
157 hosts["www.xn--n3h.net"] = true;
158 std::map<GURL, bool> urls;
159 urls[GURL("http://www.example.com/foo/")] = true;
160 urls[GURL("http://www.example.com/%C3%85t%C3%B8mstr%C3%B6m")] = true;
161 filter_->SetManualHosts(&hosts);
162 filter_->SetManualURLs(&urls);
165 EXPECT_TRUE(IsURLWhitelisted("http://www.example.com/foo/"));
166 EXPECT_TRUE(IsURLWhitelisted(
167 "http://www.example.com/%C3%85t%C3%B8mstr%C3%B6m"));
169 // Verify that non-URI characters are escaped.
170 EXPECT_TRUE(IsURLWhitelisted(
171 "http://www.example.com/\xc3\x85t\xc3\xb8mstr\xc3\xb6m"));
173 // Verify that unnecessary URI escapes are unescaped.
174 EXPECT_TRUE(IsURLWhitelisted("http://www.example.com/%66%6F%6F/"));
176 // Verify that the default port are removed.
177 EXPECT_TRUE(IsURLWhitelisted("http://www.example.com:80/foo/"));
179 // Verify that scheme and hostname are lowercased.
180 EXPECT_TRUE(IsURLWhitelisted("htTp://wWw.eXamPle.com/foo/"));
181 EXPECT_TRUE(IsURLWhitelisted("HttP://WwW.mOOsE.orG/blurp/"));
183 // Verify that UTF-8 in hostnames are converted to punycode.
184 EXPECT_TRUE(IsURLWhitelisted("http://www.\xe2\x98\x83\x0a.net/bla/"));
186 // Verify that query and ref are stripped.
187 EXPECT_TRUE(IsURLWhitelisted("http://www.example.com/foo/?bar=baz#ref"));
190 TEST_F(ManagedModeURLFilterTest, HasFilteredScheme) {
192 ManagedModeURLFilter::HasFilteredScheme(GURL("http://example.com")));
194 ManagedModeURLFilter::HasFilteredScheme(GURL("https://example.com")));
196 ManagedModeURLFilter::HasFilteredScheme(GURL("ftp://example.com")));
198 ManagedModeURLFilter::HasFilteredScheme(GURL("gopher://example.com")));
200 ManagedModeURLFilter::HasFilteredScheme(GURL("ws://example.com")));
202 ManagedModeURLFilter::HasFilteredScheme(GURL("wss://example.com")));
205 ManagedModeURLFilter::HasFilteredScheme(GURL("file://example.com")));
207 ManagedModeURLFilter::HasFilteredScheme(GURL("filesystem://80cols.com")));
209 ManagedModeURLFilter::HasFilteredScheme(GURL("chrome://example.com")));
211 ManagedModeURLFilter::HasFilteredScheme(GURL("wtf://example.com")));
214 TEST_F(ManagedModeURLFilterTest, HostMatchesPattern) {
216 ManagedModeURLFilter::HostMatchesPattern("www.google.com",
219 ManagedModeURLFilter::HostMatchesPattern("google.com", "*.google.com"));
221 ManagedModeURLFilter::HostMatchesPattern("accounts.google.com",
224 ManagedModeURLFilter::HostMatchesPattern("www.google.de",
227 ManagedModeURLFilter::HostMatchesPattern("notgoogle.com",
232 ManagedModeURLFilter::HostMatchesPattern("www.google.com",
235 ManagedModeURLFilter::HostMatchesPattern("www.google.de",
238 ManagedModeURLFilter::HostMatchesPattern("www.google.co.uk",
241 ManagedModeURLFilter::HostMatchesPattern("www.google.blogspot.com",
244 ManagedModeURLFilter::HostMatchesPattern("www.google", "www.google.*"));
246 ManagedModeURLFilter::HostMatchesPattern("google.com", "www.google.*"));
248 ManagedModeURLFilter::HostMatchesPattern("mail.google.com",
251 ManagedModeURLFilter::HostMatchesPattern("www.googleplex.com",
254 ManagedModeURLFilter::HostMatchesPattern("www.googleco.uk",
259 ManagedModeURLFilter::HostMatchesPattern("www.google.com", "*.google.*"));
261 ManagedModeURLFilter::HostMatchesPattern("google.com", "*.google.*"));
263 ManagedModeURLFilter::HostMatchesPattern("accounts.google.com",
266 ManagedModeURLFilter::HostMatchesPattern("mail.google.com",
269 ManagedModeURLFilter::HostMatchesPattern("www.google.de",
272 ManagedModeURLFilter::HostMatchesPattern("google.de",
275 ManagedModeURLFilter::HostMatchesPattern("google.blogspot.com",
278 ManagedModeURLFilter::HostMatchesPattern("google", "*.google.*"));
280 ManagedModeURLFilter::HostMatchesPattern("notgoogle.com", "*.google.*"));
282 ManagedModeURLFilter::HostMatchesPattern("www.googleplex.com",
285 // Now test a few invalid patterns. They should never match.
287 ManagedModeURLFilter::HostMatchesPattern("www.google.com", ""));
289 ManagedModeURLFilter::HostMatchesPattern("www.google.com", "."));
291 ManagedModeURLFilter::HostMatchesPattern("www.google.com", "*"));
293 ManagedModeURLFilter::HostMatchesPattern("www.google.com", ".*"));
295 ManagedModeURLFilter::HostMatchesPattern("www.google.com", "*."));
297 ManagedModeURLFilter::HostMatchesPattern("www.google.com", "*.*"));
299 ManagedModeURLFilter::HostMatchesPattern("www.google..com", "*..*"));
301 ManagedModeURLFilter::HostMatchesPattern("www.google.com", "*.*.com"));
303 ManagedModeURLFilter::HostMatchesPattern("www.google.com", "www.*.*"));
304 EXPECT_FALSE(ManagedModeURLFilter::HostMatchesPattern("www.google.com",
307 ManagedModeURLFilter::HostMatchesPattern("www.google.com", "*google*"));
308 EXPECT_FALSE(ManagedModeURLFilter::HostMatchesPattern("www.google.com",
309 "www.*.google.com"));
312 TEST_F(ManagedModeURLFilterTest, Patterns) {
313 std::map<std::string, bool> hosts;
315 // Initally, the second rule is ignored because has the same value as the
316 // default (block). When we change the default to allow, the first rule is
318 hosts["*.google.com"] = true;
319 hosts["www.google.*"] = false;
321 hosts["accounts.google.com"] = false;
322 hosts["mail.google.com"] = true;
323 filter_->SetManualHosts(&hosts);
325 // Initially, the default filtering behavior is BLOCK.
326 EXPECT_TRUE(IsURLWhitelisted("http://www.google.com/foo/"));
327 EXPECT_FALSE(IsURLWhitelisted("http://accounts.google.com/bar/"));
328 EXPECT_FALSE(IsURLWhitelisted("http://www.google.co.uk/blurp/"));
329 EXPECT_TRUE(IsURLWhitelisted("http://mail.google.com/moose/"));
331 filter_->SetDefaultFilteringBehavior(ManagedModeURLFilter::ALLOW);
332 EXPECT_FALSE(IsURLWhitelisted("http://www.google.com/foo/"));
333 EXPECT_FALSE(IsURLWhitelisted("http://accounts.google.com/bar/"));
334 EXPECT_FALSE(IsURLWhitelisted("http://www.google.co.uk/blurp/"));
335 EXPECT_TRUE(IsURLWhitelisted("http://mail.google.com/moose/"));