15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
7ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/run_loop.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/managed_mode/managed_mode_url_filter.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ManagedModeURLFilterTest : public ::testing::Test,
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 public ManagedModeURLFilter::Observer {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ManagedModeURLFilterTest() : filter_(new ManagedModeURLFilter) {
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    filter_->SetDefaultFilteringBehavior(ManagedModeURLFilter::BLOCK);
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    filter_->AddObserver(this);
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~ManagedModeURLFilterTest() {
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    filter_->RemoveObserver(this);
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ManagedModeURLFilter::Observer:
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnSiteListUpdated() OVERRIDE {
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    run_loop_.Quit();
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsURLWhitelisted(const std::string& url) {
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return filter_->GetFilteringBehaviorForURL(GURL(url)) ==
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           ManagedModeURLFilter::ALLOW;
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop message_loop_;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::RunLoop run_loop_;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<ManagedModeURLFilter> filter_;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ManagedModeURLFilterTest, Basic) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> list;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allow domain and all subdomains, for any filtered scheme.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list.push_back("google.com");
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  filter_->SetFromPatterns(list);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  run_loop_.Run();
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("http://google.com"));
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("http://google.com/"));
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("http://google.com/whatever"));
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("https://google.com/"));
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(IsURLWhitelisted("http://notgoogle.com/"));
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("http://mail.google.com"));
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("http://x.mail.google.com"));
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("https://x.mail.google.com/"));
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("http://x.y.google.com/a/b"));
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(IsURLWhitelisted("http://youtube.com/"));
584e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("bogus://youtube.com/"));
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("chrome://youtube.com/"));
614e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch  EXPECT_TRUE(IsURLWhitelisted("chrome://extensions/"));
624e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch  EXPECT_TRUE(IsURLWhitelisted("chrome-extension://foo/main.html"));
634e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch  EXPECT_TRUE(IsURLWhitelisted("file:///home/chronos/user/Downloads/img.jpg"));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ManagedModeURLFilterTest, Inactive) {
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  filter_->SetDefaultFilteringBehavior(ManagedModeURLFilter::ALLOW);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> list;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list.push_back("google.com");
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  filter_->SetFromPatterns(list);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  run_loop_.Run();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the filter is inactive, every URL should be whitelisted.
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("http://google.com"));
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("https://www.example.com"));
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ManagedModeURLFilterTest, Scheme) {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> list;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Filter only http, ftp and ws schemes.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list.push_back("http://secure.com");
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list.push_back("ftp://secure.com");
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list.push_back("ws://secure.com");
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  filter_->SetFromPatterns(list);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  run_loop_.Run();
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("http://secure.com"));
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("http://secure.com/whatever"));
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("ftp://secure.com/"));
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("ws://secure.com"));
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(IsURLWhitelisted("https://secure.com/"));
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(IsURLWhitelisted("wss://secure.com"));
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("http://www.secure.com"));
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(IsURLWhitelisted("https://www.secure.com"));
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(IsURLWhitelisted("wss://www.secure.com"));
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ManagedModeURLFilterTest, Path) {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> list;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Filter only a certain path prefix.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list.push_back("path.to/ruin");
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  filter_->SetFromPatterns(list);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  run_loop_.Run();
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("http://path.to/ruin"));
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("https://path.to/ruin"));
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("http://path.to/ruins"));
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("http://path.to/ruin/signup"));
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("http://www.path.to/ruin"));
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(IsURLWhitelisted("http://path.to/fortune"));
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ManagedModeURLFilterTest, PathAndScheme) {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> list;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Filter only a certain path prefix and scheme.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list.push_back("https://s.aaa.com/path");
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  filter_->SetFromPatterns(list);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  run_loop_.Run();
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("https://s.aaa.com/path"));
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("https://s.aaa.com/path/bbb"));
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(IsURLWhitelisted("http://s.aaa.com/path"));
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(IsURLWhitelisted("https://aaa.com/path"));
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(IsURLWhitelisted("https://x.aaa.com/path"));
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(IsURLWhitelisted("https://s.aaa.com/bbb"));
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(IsURLWhitelisted("https://s.aaa.com/"));
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ManagedModeURLFilterTest, Host) {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> list;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Filter only a certain hostname, without subdomains.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list.push_back(".www.example.com");
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  filter_->SetFromPatterns(list);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  run_loop_.Run();
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("http://www.example.com"));
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(IsURLWhitelisted("http://example.com"));
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(IsURLWhitelisted("http://subdomain.example.com"));
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ManagedModeURLFilterTest, IPAddress) {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> list;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Filter an ip address.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list.push_back("123.123.123.123");
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  filter_->SetFromPatterns(list);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  run_loop_.Run();
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("http://123.123.123.123/"));
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(IsURLWhitelisted("http://123.123.123.124/"));
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ManagedModeURLFilterTest, Canonicalization) {
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // We assume that the hosts and URLs are already canonicalized.
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::map<std::string, bool> hosts;
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  hosts["www.moose.org"] = true;
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  hosts["www.xn--n3h.net"] = true;
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::map<GURL, bool> urls;
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  urls[GURL("http://www.example.com/foo/")] = true;
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  urls[GURL("http://www.example.com/%C3%85t%C3%B8mstr%C3%B6m")] = true;
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  filter_->SetManualHosts(&hosts);
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  filter_->SetManualURLs(&urls);
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Base cases.
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("http://www.example.com/foo/"));
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted(
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "http://www.example.com/%C3%85t%C3%B8mstr%C3%B6m"));
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Verify that non-URI characters are escaped.
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted(
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "http://www.example.com/\xc3\x85t\xc3\xb8mstr\xc3\xb6m"));
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Verify that unnecessary URI escapes are unescaped.
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("http://www.example.com/%66%6F%6F/"));
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Verify that the default port are removed.
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("http://www.example.com:80/foo/"));
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Verify that scheme and hostname are lowercased.
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("htTp://wWw.eXamPle.com/foo/"));
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("HttP://WwW.mOOsE.orG/blurp/"));
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Verify that UTF-8 in hostnames are converted to punycode.
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("http://www.\xe2\x98\x83\x0a.net/bla/"));
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Verify that query and ref are stripped.
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("http://www.example.com/foo/?bar=baz#ref"));
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1904e4e753d5cd2290fa40ed922142a29a98128a209Ben MurdochTEST_F(ManagedModeURLFilterTest, HasFilteredScheme) {
191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(
1924e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch      ManagedModeURLFilter::HasFilteredScheme(GURL("http://example.com")));
193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(
1944e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch      ManagedModeURLFilter::HasFilteredScheme(GURL("https://example.com")));
195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(
1964e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch      ManagedModeURLFilter::HasFilteredScheme(GURL("ftp://example.com")));
197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(
1984e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch      ManagedModeURLFilter::HasFilteredScheme(GURL("gopher://example.com")));
199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(
2004e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch      ManagedModeURLFilter::HasFilteredScheme(GURL("ws://example.com")));
201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(
2024e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch      ManagedModeURLFilter::HasFilteredScheme(GURL("wss://example.com")));
2034e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch
2044e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch  EXPECT_FALSE(
2054e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch      ManagedModeURLFilter::HasFilteredScheme(GURL("file://example.com")));
2064e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch  EXPECT_FALSE(
2074e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch      ManagedModeURLFilter::HasFilteredScheme(GURL("filesystem://80cols.com")));
2084e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch  EXPECT_FALSE(
2094e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch      ManagedModeURLFilter::HasFilteredScheme(GURL("chrome://example.com")));
210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(
2114e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch      ManagedModeURLFilter::HasFilteredScheme(GURL("wtf://example.com")));
212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(ManagedModeURLFilterTest, HostMatchesPattern) {
2154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(
2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("www.google.com",
2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                               "*.google.com"));
2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(
2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("google.com", "*.google.com"));
2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(
2214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("accounts.google.com",
2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                               "*.google.com"));
2234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(
2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("www.google.de",
2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                               "*.google.com"));
2264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(
2274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("notgoogle.com",
2284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                               "*.google.com"));
2294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(
2324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("www.google.com",
2334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                               "www.google.*"));
2344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(
2354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("www.google.de",
2364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                               "www.google.*"));
2374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(
2384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("www.google.co.uk",
2394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                               "www.google.*"));
2404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(
2414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("www.google.blogspot.com",
2424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                               "www.google.*"));
2434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(
2444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("www.google", "www.google.*"));
2454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(
2464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("google.com", "www.google.*"));
2474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(
2484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("mail.google.com",
2494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                               "www.google.*"));
2504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(
2514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("www.googleplex.com",
2524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                               "www.google.*"));
2534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(
2544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("www.googleco.uk",
2554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                               "www.google.*"));
2564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(
2594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("www.google.com", "*.google.*"));
2604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(
2614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("google.com", "*.google.*"));
2624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(
2634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("accounts.google.com",
2644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                               "*.google.*"));
2654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(
2664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("mail.google.com",
2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                               "*.google.*"));
2684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(
2694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("www.google.de",
2704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                               "*.google.*"));
2714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(
2724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("google.de",
2734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                               "*.google.*"));
2744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(
2754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("google.blogspot.com",
2764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                               "*.google.*"));
2774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(
2784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("google", "*.google.*"));
2794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(
2804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("notgoogle.com", "*.google.*"));
2814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(
2824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("www.googleplex.com",
2834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                               "*.google.*"));
2844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Now test a few invalid patterns. They should never match.
2864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(
2874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("www.google.com", ""));
2884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(
2894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("www.google.com", "."));
2904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(
2914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("www.google.com", "*"));
2924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(
2934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("www.google.com", ".*"));
2944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(
2954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("www.google.com", "*."));
2964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(
2974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("www.google.com", "*.*"));
2984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(
2994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("www.google..com", "*..*"));
3004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(
3014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("www.google.com", "*.*.com"));
3024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(
3034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("www.google.com", "www.*.*"));
3044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(ManagedModeURLFilter::HostMatchesPattern("www.google.com",
3054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                                        "*.goo.*le.*"));
3064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(
3074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ManagedModeURLFilter::HostMatchesPattern("www.google.com", "*google*"));
3084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(ManagedModeURLFilter::HostMatchesPattern("www.google.com",
3094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                                        "www.*.google.com"));
3104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
3114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(ManagedModeURLFilterTest, Patterns) {
3134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::map<std::string, bool> hosts;
3144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Initally, the second rule is ignored because has the same value as the
3164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // default (block). When we change the default to allow, the first rule is
3174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // ignored instead.
3184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  hosts["*.google.com"] = true;
3194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  hosts["www.google.*"] = false;
3204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  hosts["accounts.google.com"] = false;
3224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  hosts["mail.google.com"] = true;
3234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  filter_->SetManualHosts(&hosts);
3244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Initially, the default filtering behavior is BLOCK.
3264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("http://www.google.com/foo/"));
3274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(IsURLWhitelisted("http://accounts.google.com/bar/"));
3284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(IsURLWhitelisted("http://www.google.co.uk/blurp/"));
3294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("http://mail.google.com/moose/"));
3304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  filter_->SetDefaultFilteringBehavior(ManagedModeURLFilter::ALLOW);
3324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(IsURLWhitelisted("http://www.google.com/foo/"));
3334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(IsURLWhitelisted("http://accounts.google.com/bar/"));
3344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(IsURLWhitelisted("http://www.google.co.uk/blurp/"));
3354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(IsURLWhitelisted("http://mail.google.com/moose/"));
3364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
337