1ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com// Copyright 2014 The Chromium Authors. All rights reserved.
2ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com// Use of this source code is governed by a BSD-style license that can be
3ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com// found in the LICENSE file.
4ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
5ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "base/bind.h"
6ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "base/bind_helpers.h"
7ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "base/message_loop/message_loop.h"
8ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "base/run_loop.h"
9ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "chrome/browser/supervised_user/supervised_user_url_filter.h"
10ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "testing/gtest/include/gtest/gtest.h"
11ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "url/gurl.h"
12ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
13ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comclass SupervisedUserURLFilterTest : public ::testing::Test,
14ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                    public SupervisedUserURLFilter::Observer {
15ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com public:
16ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  SupervisedUserURLFilterTest() : filter_(new SupervisedUserURLFilter) {
17ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    filter_->SetDefaultFilteringBehavior(SupervisedUserURLFilter::BLOCK);
18ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    filter_->AddObserver(this);
19ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  }
20ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
21ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  virtual ~SupervisedUserURLFilterTest() {
22ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    filter_->RemoveObserver(this);
23ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  }
24ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
25ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  // SupervisedUserURLFilter::Observer:
26ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  virtual void OnSiteListUpdated() OVERRIDE {
27ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    run_loop_.Quit();
28ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  }
29ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
30ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com protected:
31ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  bool IsURLWhitelisted(const std::string& url) {
32ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    return filter_->GetFilteringBehaviorForURL(GURL(url)) ==
33ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com           SupervisedUserURLFilter::ALLOW;
34ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  }
35ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
361c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com  base::MessageLoop message_loop_;
371c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com  base::RunLoop run_loop_;
38ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  scoped_refptr<SupervisedUserURLFilter> filter_;
391c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com};
401c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com
41ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comTEST_F(SupervisedUserURLFilterTest, Basic) {
42ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  std::vector<std::string> list;
43ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  // Allow domain and all subdomains, for any filtered scheme.
44ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  list.push_back("google.com");
45ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  filter_->SetFromPatterns(list);
461c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com  run_loop_.Run();
471c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com
48ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted("http://google.com"));
49ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted("http://google.com/"));
50ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted("http://google.com/whatever"));
51ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted("https://google.com/"));
52ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_FALSE(IsURLWhitelisted("http://notgoogle.com/"));
53ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted("http://mail.google.com"));
54ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted("http://x.mail.google.com"));
55ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted("https://x.mail.google.com/"));
56ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted("http://x.y.google.com/a/b"));
57ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_FALSE(IsURLWhitelisted("http://youtube.com/"));
58ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
59ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted("bogus://youtube.com/"));
60ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted("chrome://youtube.com/"));
611c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com  EXPECT_TRUE(IsURLWhitelisted("chrome://extensions/"));
62ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted("chrome-extension://foo/main.html"));
63ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted("file:///home/chronos/user/Downloads/img.jpg"));
64ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
65ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
66ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comTEST_F(SupervisedUserURLFilterTest, Inactive) {
67ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  filter_->SetDefaultFilteringBehavior(SupervisedUserURLFilter::ALLOW);
68ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
69ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  std::vector<std::string> list;
701c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com  list.push_back("google.com");
71ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  filter_->SetFromPatterns(list);
72ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  run_loop_.Run();
73ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
74ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  // If the filter is inactive, every URL should be whitelisted.
75ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted("http://google.com"));
761c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com  EXPECT_TRUE(IsURLWhitelisted("https://www.example.com"));
771c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com}
78ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
79ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comTEST_F(SupervisedUserURLFilterTest, Scheme) {
80ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  std::vector<std::string> list;
81ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  // Filter only http, ftp and ws schemes.
82ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  list.push_back("http://secure.com");
83ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  list.push_back("ftp://secure.com");
84ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  list.push_back("ws://secure.com");
85ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  filter_->SetFromPatterns(list);
861c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com  run_loop_.Run();
87ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
88ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted("http://secure.com"));
89ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted("http://secure.com/whatever"));
90ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted("ftp://secure.com/"));
91ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted("ws://secure.com"));
92ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_FALSE(IsURLWhitelisted("https://secure.com/"));
931c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com  EXPECT_FALSE(IsURLWhitelisted("wss://secure.com"));
941c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com  EXPECT_TRUE(IsURLWhitelisted("http://www.secure.com"));
951c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com  EXPECT_FALSE(IsURLWhitelisted("https://www.secure.com"));
96ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_FALSE(IsURLWhitelisted("wss://www.secure.com"));
97ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
98ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
99ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comTEST_F(SupervisedUserURLFilterTest, Path) {
100ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  std::vector<std::string> list;
101ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  // Filter only a certain path prefix.
102ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  list.push_back("path.to/ruin");
103ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  filter_->SetFromPatterns(list);
104ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  run_loop_.Run();
105ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
106ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted("http://path.to/ruin"));
107ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted("https://path.to/ruin"));
108ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted("http://path.to/ruins"));
109ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted("http://path.to/ruin/signup"));
110ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted("http://www.path.to/ruin"));
111ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_FALSE(IsURLWhitelisted("http://path.to/fortune"));
112ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
113ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
114ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comTEST_F(SupervisedUserURLFilterTest, PathAndScheme) {
115ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  std::vector<std::string> list;
1161c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com  // Filter only a certain path prefix and scheme.
117ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  list.push_back("https://s.aaa.com/path");
118ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  filter_->SetFromPatterns(list);
119ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  run_loop_.Run();
120ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
121ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted("https://s.aaa.com/path"));
1221c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com  EXPECT_TRUE(IsURLWhitelisted("https://s.aaa.com/path/bbb"));
1231c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com  EXPECT_FALSE(IsURLWhitelisted("http://s.aaa.com/path"));
1241c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com  EXPECT_FALSE(IsURLWhitelisted("https://aaa.com/path"));
1251c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com  EXPECT_FALSE(IsURLWhitelisted("https://x.aaa.com/path"));
1261c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com  EXPECT_FALSE(IsURLWhitelisted("https://s.aaa.com/bbb"));
127ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_FALSE(IsURLWhitelisted("https://s.aaa.com/"));
128ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
129ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
130ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comTEST_F(SupervisedUserURLFilterTest, Host) {
131ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  std::vector<std::string> list;
132ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  // Filter only a certain hostname, without subdomains.
133ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  list.push_back(".www.example.com");
134ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  filter_->SetFromPatterns(list);
135ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  run_loop_.Run();
136ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
137ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted("http://www.example.com"));
138ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_FALSE(IsURLWhitelisted("http://example.com"));
139ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_FALSE(IsURLWhitelisted("http://subdomain.example.com"));
140ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
141ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
142ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comTEST_F(SupervisedUserURLFilterTest, IPAddress) {
143ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  std::vector<std::string> list;
144ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  // Filter an ip address.
145ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  list.push_back("123.123.123.123");
146ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  filter_->SetFromPatterns(list);
1471c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com  run_loop_.Run();
148ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
149ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted("http://123.123.123.123/"));
150ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_FALSE(IsURLWhitelisted("http://123.123.123.124/"));
151ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
152ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
153ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comTEST_F(SupervisedUserURLFilterTest, Canonicalization) {
1541c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com  // We assume that the hosts and URLs are already canonicalized.
155ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  std::map<std::string, bool> hosts;
156ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  hosts["www.moose.org"] = true;
157ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  hosts["www.xn--n3h.net"] = true;
158ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  std::map<GURL, bool> urls;
159ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  urls[GURL("http://www.example.com/foo/")] = true;
160ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  urls[GURL("http://www.example.com/%C3%85t%C3%B8mstr%C3%B6m")] = true;
161ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  filter_->SetManualHosts(&hosts);
162ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  filter_->SetManualURLs(&urls);
1631c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com
164ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  // Base cases.
165ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted("http://www.example.com/foo/"));
166ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted(
167ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      "http://www.example.com/%C3%85t%C3%B8mstr%C3%B6m"));
168ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
169ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  // Verify that non-URI characters are escaped.
170ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted(
1711c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com      "http://www.example.com/\xc3\x85t\xc3\xb8mstr\xc3\xb6m"));
172ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
173ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  // Verify that unnecessary URI escapes are unescaped.
174ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted("http://www.example.com/%66%6F%6F/"));
175ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
176ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  // Verify that the default port are removed.
177ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted("http://www.example.com:80/foo/"));
178ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
1791c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com  // Verify that scheme and hostname are lowercased.
180ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted("htTp://wWw.eXamPle.com/foo/"));
181ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted("HttP://WwW.mOOsE.orG/blurp/"));
182ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
183ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  // Verify that UTF-8 in hostnames are converted to punycode.
184ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted("http://www.\xe2\x98\x83\x0a.net/bla/"));
185ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
186ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  // Verify that query and ref are stripped.
187ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(IsURLWhitelisted("http://www.example.com/foo/?bar=baz#ref"));
188ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
189ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
1901c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.comTEST_F(SupervisedUserURLFilterTest, HasFilteredScheme) {
1911c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com  EXPECT_TRUE(
192ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HasFilteredScheme(GURL("http://example.com")));
1931c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com  EXPECT_TRUE(
194ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HasFilteredScheme(GURL("https://example.com")));
195ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(
196ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HasFilteredScheme(GURL("ftp://example.com")));
197ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(
198ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HasFilteredScheme(GURL("gopher://example.com")));
199ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(
2001c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com      SupervisedUserURLFilter::HasFilteredScheme(GURL("ws://example.com")));
201ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(
202ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HasFilteredScheme(GURL("wss://example.com")));
203ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
204ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_FALSE(
205ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HasFilteredScheme(GURL("file://example.com")));
2061c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com  EXPECT_FALSE(
2071c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com      SupervisedUserURLFilter::HasFilteredScheme(
208ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com          GURL("filesystem://80cols.com")));
209ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_FALSE(
2101c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com      SupervisedUserURLFilter::HasFilteredScheme(GURL("chrome://example.com")));
211ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_FALSE(
212ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HasFilteredScheme(GURL("wtf://example.com")));
213ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
214ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
215ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comTEST_F(SupervisedUserURLFilterTest, HostMatchesPattern) {
216ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(
2171c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com      SupervisedUserURLFilter::HostMatchesPattern("www.google.com",
2181c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com                                                  "*.google.com"));
2191c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com  EXPECT_TRUE(
220ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HostMatchesPattern("google.com",
221ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                                  "*.google.com"));
222ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(
223ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HostMatchesPattern("accounts.google.com",
224ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                                  "*.google.com"));
225ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_FALSE(
226ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HostMatchesPattern("www.google.de",
2271c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com                                                  "*.google.com"));
228ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_FALSE(
2291c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com      SupervisedUserURLFilter::HostMatchesPattern("notgoogle.com",
230ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                                  "*.google.com"));
231ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
232ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
2331c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com  EXPECT_TRUE(
234ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HostMatchesPattern("www.google.com",
2351c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com                                                  "www.google.*"));
236ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(
237ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HostMatchesPattern("www.google.de",
238ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                                  "www.google.*"));
2391c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com  EXPECT_TRUE(
240ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HostMatchesPattern("www.google.co.uk",
2411c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com                                                  "www.google.*"));
242ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_FALSE(
243ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HostMatchesPattern("www.google.blogspot.com",
244ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                                  "www.google.*"));
2451c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com  EXPECT_FALSE(
246ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HostMatchesPattern("www.google",
2471c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com                                                  "www.google.*"));
2481c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com  EXPECT_FALSE(
249ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HostMatchesPattern("google.com",
250ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                                  "www.google.*"));
251ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_FALSE(
252ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HostMatchesPattern("mail.google.com",
2531c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com                                                  "www.google.*"));
2541c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com  EXPECT_FALSE(
255ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HostMatchesPattern("www.googleplex.com",
256ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                                  "www.google.*"));
257ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_FALSE(
258ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HostMatchesPattern("www.googleco.uk",
259ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                                  "www.google.*"));
260ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
2611c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com
2621c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com  EXPECT_TRUE(
2631c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com      SupervisedUserURLFilter::HostMatchesPattern("www.google.com",
2641c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com                                                  "*.google.*"));
2651c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com  EXPECT_TRUE(
2661c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com      SupervisedUserURLFilter::HostMatchesPattern("google.com",
2671c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com                                                  "*.google.*"));
268ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(
2691c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com      SupervisedUserURLFilter::HostMatchesPattern("accounts.google.com",
2701c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com                                                  "*.google.*"));
271ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(
272ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HostMatchesPattern("mail.google.com",
273ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                                  "*.google.*"));
274ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(
275ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HostMatchesPattern("www.google.de",
276ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                                  "*.google.*"));
277ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_TRUE(
278ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HostMatchesPattern("google.de",
279ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                                  "*.google.*"));
280ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_FALSE(
281ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HostMatchesPattern("google.blogspot.com",
282ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                                  "*.google.*"));
283ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_FALSE(
284ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HostMatchesPattern("google", "*.google.*"));
285ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_FALSE(
286ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HostMatchesPattern("notgoogle.com",
287ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                                  "*.google.*"));
288ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_FALSE(
289ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HostMatchesPattern("www.googleplex.com",
290ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                                  "*.google.*"));
291ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
292ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  // Now test a few invalid patterns. They should never match.
2931c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com  EXPECT_FALSE(
294ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HostMatchesPattern("www.google.com", ""));
295ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_FALSE(
296ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HostMatchesPattern("www.google.com", "."));
297ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_FALSE(
298ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HostMatchesPattern("www.google.com", "*"));
299ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_FALSE(
300ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HostMatchesPattern("www.google.com", ".*"));
301ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_FALSE(
302ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HostMatchesPattern("www.google.com", "*."));
303ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_FALSE(
304ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HostMatchesPattern("www.google.com", "*.*"));
305ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_FALSE(
3061c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com      SupervisedUserURLFilter::HostMatchesPattern("www.google..com", "*..*"));
3071c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com  EXPECT_FALSE(
3081c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com      SupervisedUserURLFilter::HostMatchesPattern("www.google.com", "*.*.com"));
309ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_FALSE(
310ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HostMatchesPattern("www.google.com", "www.*.*"));
311ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_FALSE(
312ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HostMatchesPattern("www.google.com",
313ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                                  "*.goo.*le.*"));
314ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_FALSE(
315ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com      SupervisedUserURLFilter::HostMatchesPattern("www.google.com",
316ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                                  "*google*"));
317ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com  EXPECT_FALSE(
318      SupervisedUserURLFilter::HostMatchesPattern("www.google.com",
319                                                  "www.*.google.com"));
320}
321
322TEST_F(SupervisedUserURLFilterTest, Patterns) {
323  std::map<std::string, bool> hosts;
324
325  // Initally, the second rule is ignored because has the same value as the
326  // default (block). When we change the default to allow, the first rule is
327  // ignored instead.
328  hosts["*.google.com"] = true;
329  hosts["www.google.*"] = false;
330
331  hosts["accounts.google.com"] = false;
332  hosts["mail.google.com"] = true;
333  filter_->SetManualHosts(&hosts);
334
335  // Initially, the default filtering behavior is BLOCK.
336  EXPECT_TRUE(IsURLWhitelisted("http://www.google.com/foo/"));
337  EXPECT_FALSE(IsURLWhitelisted("http://accounts.google.com/bar/"));
338  EXPECT_FALSE(IsURLWhitelisted("http://www.google.co.uk/blurp/"));
339  EXPECT_TRUE(IsURLWhitelisted("http://mail.google.com/moose/"));
340
341  filter_->SetDefaultFilteringBehavior(SupervisedUserURLFilter::ALLOW);
342  EXPECT_FALSE(IsURLWhitelisted("http://www.google.com/foo/"));
343  EXPECT_FALSE(IsURLWhitelisted("http://accounts.google.com/bar/"));
344  EXPECT_FALSE(IsURLWhitelisted("http://www.google.co.uk/blurp/"));
345  EXPECT_TRUE(IsURLWhitelisted("http://mail.google.com/moose/"));
346}
347