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)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/browser/url_blacklist_manager.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <ostream>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/callback.h"
119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_registry_simple.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/testing_pref_service.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/policy/policy_helpers.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/common/policy_pref_names.h"
17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/url_fixer/url_fixer.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "google_apis/gaia/gaia_urls.h"
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "net/base/load_flags.h"
20c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "net/base/net_errors.h"
210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "net/base/request_priority.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/url_request.h"
2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "net/url_request/url_request_context.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/url_request_test_util.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// TODO(joaodasilva): this file should be moved next to
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// components/policy/core/browser/url_blacklist_manager.(cc|h).
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// However, url_fixer_upper.h can't be included from the component. Rather
31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// than having it mocked out, the actual url_fixer::SegmentURL call is used
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// to make sure that the parsing of URL filters is correct.
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace policy {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Helper to get the disambiguated SegmentURL() function.
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)URLBlacklist::SegmentURLCallback GetSegmentURLCallback() {
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return url_fixer::SegmentURL;
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestingURLBlacklistManager : public URLBlacklistManager {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit TestingURLBlacklistManager(PrefService* pref_service)
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : URLBlacklistManager(pref_service,
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            base::MessageLoopProxy::current(),
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            base::MessageLoopProxy::current(),
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            GetSegmentURLCallback(),
50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                            base::Bind(OverrideBlacklistForURL)),
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        update_called_(0),
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        set_blacklist_called_(false) {}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestingURLBlacklistManager() {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make this method public for testing.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  using URLBlacklistManager::ScheduleUpdate;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Makes a direct call to UpdateOnIO during tests.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateOnIOForTesting() {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<base::ListValue> block(new base::ListValue);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    block->Append(new base::StringValue("example.com"));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<base::ListValue> allow(new base::ListValue);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLBlacklistManager::UpdateOnIO(block.Pass(), allow.Pass());
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // URLBlacklistManager overrides:
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetBlacklist(scoped_ptr<URLBlacklist> blacklist) OVERRIDE {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_blacklist_called_ = true;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLBlacklistManager::SetBlacklist(blacklist.Pass());
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Update() OVERRIDE {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    update_called_++;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLBlacklistManager::Update();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int update_called() const { return update_called_; }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool set_blacklist_called() const { return set_blacklist_called_; }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int update_called_;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool set_blacklist_called_;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestingURLBlacklistManager);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLBlacklistManagerTest : public testing::Test {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  URLBlacklistManagerTest() {}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    pref_service_.registry()->RegisterListPref(policy_prefs::kUrlBlacklist);
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    pref_service_.registry()->RegisterListPref(policy_prefs::kUrlWhitelist);
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    blacklist_manager_.reset(new TestingURLBlacklistManager(&pref_service_));
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loop_.RunUntilIdle();
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (blacklist_manager_.get())
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      blacklist_manager_->ShutdownOnUIThread();
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loop_.RunUntilIdle();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Delete |blacklist_manager_| while |io_thread_| is mapping IO to
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |loop_|.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    blacklist_manager_.reset();
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::MessageLoopForIO loop_;
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSimple pref_service_;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestingURLBlacklistManager> blacklist_manager_;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Parameters for the FilterToComponents test.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FilterTestParams {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilterTestParams(const std::string& filter, const std::string& scheme,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const std::string& host, bool match_subdomains, uint16 port,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const std::string& path)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : filter_(filter), scheme_(scheme), host_(host),
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        match_subdomains_(match_subdomains), port_(port), path_(path) {}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilterTestParams(const FilterTestParams& params)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : filter_(params.filter_), scheme_(params.scheme_), host_(params.host_),
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        match_subdomains_(params.match_subdomains_), port_(params.port_),
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        path_(params.path_) {}
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FilterTestParams& operator=(const FilterTestParams& params) {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    filter_ = params.filter_;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scheme_ = params.scheme_;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_ = params.host_;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    match_subdomains_ = params.match_subdomains_;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    port_ = params.port_;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path_ = params.path_;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *this;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& filter() const { return filter_; }
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& scheme() const { return scheme_; }
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& host() const { return host_; }
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool match_subdomains() const { return match_subdomains_; }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 port() const { return port_; }
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& path() const { return path_; }
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string filter_;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string scheme_;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string host_;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool match_subdomains_;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 port_;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string path_;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make Valgrind happy. Without this function, a generic one will print the
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// raw bytes in FilterTestParams, which due to some likely padding will access
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// uninitialized memory.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintTo(const FilterTestParams& params, std::ostream* os) {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *os << params.filter();
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLBlacklistFilterToComponentsTest
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public testing::TestWithParam<FilterTestParams> {
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLBlacklistFilterToComponentsTest() {}
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(URLBlacklistFilterToComponentsTest);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(URLBlacklistFilterToComponentsTest, FilterToComponents) {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string scheme;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string host;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool match_subdomains = true;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 port = 42;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string path;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
179a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  URLBlacklist::FilterToComponents(GetSegmentURLCallback(),
180a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                   GetParam().filter(),
181a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                   &scheme,
182a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                   &host,
183a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                   &match_subdomains,
184a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                   &port,
185a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                   &path,
186a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                   NULL);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetParam().scheme(), scheme);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetParam().host(), host);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetParam().match_subdomains(), match_subdomains);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetParam().port(), port);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetParam().path(), path);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLBlacklistManagerTest, SingleUpdateForTwoPrefChanges) {
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue* blacklist = new base::ListValue;
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  blacklist->Append(new base::StringValue("*.google.com"));
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue* whitelist = new base::ListValue;
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  whitelist->Append(new base::StringValue("mail.google.com"));
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  pref_service_.SetManagedPref(policy_prefs::kUrlBlacklist, blacklist);
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  pref_service_.SetManagedPref(policy_prefs::kUrlBlacklist, whitelist);
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_.RunUntilIdle();
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, blacklist_manager_->update_called());
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLBlacklistManagerTest, ShutdownWithPendingTask0) {
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Post an update task to the UI thread.
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist_manager_->ScheduleUpdate();
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shutdown comes before the task is executed.
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist_manager_->ShutdownOnUIThread();
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist_manager_.reset();
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the task after shutdown and deletion.
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_.RunUntilIdle();
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLBlacklistManagerTest, ShutdownWithPendingTask1) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Post an update task.
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist_manager_->ScheduleUpdate();
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shutdown comes before the task is executed.
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist_manager_->ShutdownOnUIThread();
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the task after shutdown, but before deletion.
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_.RunUntilIdle();
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, blacklist_manager_->update_called());
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist_manager_.reset();
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_.RunUntilIdle();
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLBlacklistManagerTest, ShutdownWithPendingTask2) {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This posts a task to the FILE thread.
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist_manager_->UpdateOnIOForTesting();
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // But shutdown happens before it is done.
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist_manager_->ShutdownOnUIThread();
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist_manager_->set_blacklist_called());
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist_manager_.reset();
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_.RunUntilIdle();
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLBlacklistFilterToComponentsTestInstance,
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLBlacklistFilterToComponentsTest,
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testing::Values(
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("google.com",
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string(),
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         ".google.com",
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         true,
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0u,
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string()),
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams(".google.com",
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string(),
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "google.com",
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         false,
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0u,
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string()),
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("http://google.com",
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "http",
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         ".google.com",
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         true,
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0u,
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string()),
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("google.com/",
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string(),
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         ".google.com",
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         true,
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0u,
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "/"),
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("http://google.com:8080/whatever",
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "http",
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         ".google.com",
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         true,
272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         8080u,
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "/whatever"),
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("http://user:pass@google.com:8080/whatever",
275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "http",
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         ".google.com",
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         true,
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         8080u,
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "/whatever"),
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("123.123.123.123",
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string(),
282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "123.123.123.123",
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         false,
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0u,
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string()),
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("https://123.123.123.123",
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "https",
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "123.123.123.123",
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         false,
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0u,
291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string()),
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("123.123.123.123/",
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string(),
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "123.123.123.123",
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         false,
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0u,
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "/"),
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("http://123.123.123.123:123/whatever",
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "http",
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "123.123.123.123",
301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         false,
302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         123u,
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "/whatever"),
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("*",
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string(),
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string(),
307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         true,
308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0u,
309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string()),
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("ftp://*",
311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "ftp",
312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string(),
313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         true,
314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0u,
315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string()),
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("http://*/whatever",
317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "http",
318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string(),
319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         true,
320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0u,
321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "/whatever")));
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLBlacklistManagerTest, Filtering) {
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  URLBlacklist blacklist(GetSegmentURLCallback());
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Block domain and all subdomains, for any filtered scheme.
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::ListValue> blocked(new base::ListValue);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("google.com"));
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Block(blocked.get());
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://google.com")));
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://google.com/")));
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://google.com/whatever")));
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://google.com/")));
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("bogus://google.com/")));
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://notgoogle.com/")));
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://mail.google.com")));
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://x.mail.google.com")));
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://x.mail.google.com/")));
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://x.y.google.com/a/b")));
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://youtube.com/")));
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Filter only http, ftp and ws schemes.
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked.reset(new base::ListValue);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("http://secure.com"));
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("ftp://secure.com"));
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("ws://secure.com"));
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Block(blocked.get());
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://secure.com")));
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://secure.com/whatever")));
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("ftp://secure.com/")));
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("ws://secure.com")));
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://secure.com/")));
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("wss://secure.com")));
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://www.secure.com")));
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://www.secure.com")));
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("wss://www.secure.com")));
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Filter only a certain path prefix.
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked.reset(new base::ListValue);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("path.to/ruin"));
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Block(blocked.get());
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://path.to/ruin")));
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://path.to/ruin")));
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://path.to/ruins")));
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://path.to/ruin/signup")));
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://www.path.to/ruin")));
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://path.to/fortune")));
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Filter only a certain path prefix and scheme.
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked.reset(new base::ListValue);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("https://s.aaa.com/path"));
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Block(blocked.get());
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://s.aaa.com/path")));
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://s.aaa.com/path/bbb")));
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://s.aaa.com/path")));
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://aaa.com/path")));
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://x.aaa.com/path")));
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://s.aaa.com/bbb")));
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://s.aaa.com/")));
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Filter only ws and wss schemes.
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked.reset(new base::ListValue);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("ws://ws.aaa.com"));
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("wss://ws.aaa.com"));
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Block(blocked.get());
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("ws://ws.aaa.com")));
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("wss://ws.aaa.com")));
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://ws.aaa.com")));
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://ws.aaa.com")));
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("ftp://ws.aaa.com")));
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test exceptions to path prefixes, and most specific matches.
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked.reset(new base::ListValue);
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::ListValue> allowed(new base::ListValue);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("s.xxx.com/a"));
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue("s.xxx.com/a/b"));
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("https://s.xxx.com/a/b/c"));
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue("https://s.xxx.com/a/b/c/d"));
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Block(blocked.get());
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Allow(allowed.get());
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://s.xxx.com/a")));
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://s.xxx.com/a/x")));
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://s.xxx.com/a/x")));
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://s.xxx.com/a/b")));
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://s.xxx.com/a/b")));
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://s.xxx.com/a/b/x")));
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://s.xxx.com/a/b/c")));
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://s.xxx.com/a/b/c")));
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://s.xxx.com/a/b/c/x")));
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://s.xxx.com/a/b/c/d")));
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://s.xxx.com/a/b/c/d")));
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://s.xxx.com/a/b/c/d/x")));
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://s.xxx.com/a/b/c/d/x")));
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://xxx.com/a")));
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://xxx.com/a/b")));
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Block an ip address.
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked.reset(new base::ListValue);
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("123.123.123.123"));
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Block(blocked.get());
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://123.123.123.123/")));
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://123.123.123.124/")));
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open an exception.
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed.reset(new base::ListValue);
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue("plus.google.com"));
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Allow(allowed.get());
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://google.com/")));
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://www.google.com/")));
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://plus.google.com/")));
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open an exception only when using https for mail.
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed.reset(new base::ListValue);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue("https://mail.google.com"));
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Allow(allowed.get());
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://google.com/")));
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://mail.google.com/")));
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://www.google.com/")));
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://www.google.com/")));
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://mail.google.com/")));
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Match exactly "google.com", only for http. Subdomains without exceptions
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // are still blocked.
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed.reset(new base::ListValue);
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue("http://.google.com"));
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Allow(allowed.get());
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://google.com/")));
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://google.com/")));
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://www.google.com/")));
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A smaller path match in an exact host overrides a longer path for hosts
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that also match subdomains.
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked.reset(new base::ListValue);
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("yyy.com/aaa"));
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Block(blocked.get());
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed.reset(new base::ListValue);
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue(".yyy.com/a"));
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Allow(allowed.get());
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://yyy.com")));
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://yyy.com/aaa")));
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://yyy.com/aaa2")));
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://www.yyy.com")));
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://www.yyy.com/aaa")));
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://www.yyy.com/aaa2")));
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the exact entry is both allowed and blocked, allowing takes precedence.
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked.reset(new base::ListValue);
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("example.com"));
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Block(blocked.get());
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed.reset(new base::ListValue);
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue("example.com"));
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Allow(allowed.get());
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://example.com")));
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
476a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(URLBlacklistManagerTest, QueryParameters) {
477a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  URLBlacklist blacklist(GetSegmentURLCallback());
478a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  scoped_ptr<base::ListValue> blocked(new base::ListValue);
479a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  scoped_ptr<base::ListValue> allowed(new base::ListValue);
480a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
481a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Block domain and all subdomains, for any filtered scheme.
482a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blocked->AppendString("youtube.com");
483a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  allowed->AppendString("youtube.com/watch?v=XYZ");
484a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blacklist.Block(blocked.get());
485a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blacklist.Allow(allowed.get());
486a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
487a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://youtube.com")));
488a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://youtube.com/watch?v=123")));
489a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(
490a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube.com/watch?v=123&v=XYZ")));
491a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(
492a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube.com/watch?v=XYZ&v=123")));
493a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://youtube.com/watch?v=XYZ")));
494a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(
495a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube.com/watch?v=XYZ&foo=bar")));
496a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(
497a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube.com/watch?foo=bar&v=XYZ")));
498a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
499a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  allowed.reset(new base::ListValue);
500a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  allowed->AppendString("youtube.com/watch?av=XYZ&ag=123");
501a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blacklist.Allow(allowed.get());
502a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://youtube.com")));
503a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://youtube.com/watch?av=123")));
504a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://youtube.com/watch?av=XYZ")));
505a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(
506a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube.com/watch?av=123&ag=XYZ")));
507a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(
508a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube.com/watch?ag=XYZ&av=123")));
509a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(
510a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube.com/watch?av=XYZ&ag=123")));
511a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(
512a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube.com/watch?ag=123&av=XYZ")));
513a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(blacklist.IsURLBlocked(
514a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      GURL("http://youtube.com/watch?av=XYZ&ag=123&av=123")));
515a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(blacklist.IsURLBlocked(
516a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      GURL("http://youtube.com/watch?av=XYZ&ag=123&ag=1234")));
517a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
518a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  allowed.reset(new base::ListValue);
519a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  allowed->AppendString("youtube.com/watch?foo=bar*&vid=2*");
520a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blacklist.Allow(allowed.get());
521a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://youtube.com")));
522a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://youtube.com/watch?vid=2")));
523a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://youtube.com/watch?foo=bar")));
524a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(
525a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube.com/watch?vid=2&foo=bar")));
526a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(
527a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube.com/watch?vid=2&foo=bar1")));
528a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(
529a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube.com/watch?vid=234&foo=bar")));
530a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(
531a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      GURL("http://youtube.com/watch?vid=234&foo=bar23")));
532a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
533a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blocked.reset(new base::ListValue);
534a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blocked->AppendString("youtube1.com/disallow?v=44678");
535a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blacklist.Block(blocked.get());
536a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://youtube1.com")));
537a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://youtube1.com?v=123")));
538a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Path does not match
539a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://youtube1.com?v=44678")));
540a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(
541a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube1.com/disallow?v=44678")));
542a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(
543a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube1.com/disallow?v=4467")));
544a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(
545a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      GURL("http://youtube1.com/disallow?v=4467&v=123")));
546a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(blacklist.IsURLBlocked(
547a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      GURL("http://youtube1.com/disallow?v=4467&v=123&v=44678")));
548a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
549a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blocked.reset(new base::ListValue);
550a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blocked->AppendString("youtube1.com/disallow?g=*");
551a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blacklist.Block(blocked.get());
552a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://youtube1.com")));
553a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://youtube1.com?ag=123")));
554a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(
555a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube1.com/disallow?g=123")));
556a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(
557a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube1.com/disallow?ag=13&g=123")));
558a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
559a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blocked.reset(new base::ListValue);
560a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blocked->AppendString("youtube2.com/disallow?a*");
561a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blacklist.Block(blocked.get());
562a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://youtube2.com")));
563a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(blacklist.IsURLBlocked(
564a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      GURL("http://youtube2.com/disallow?b=123&a21=467")));
565a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(
566a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube2.com/disallow?abba=true")));
567a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(
568a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube2.com/disallow?baba=true")));
569a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
570a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  allowed.reset(new base::ListValue);
571a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blocked.reset(new base::ListValue);
572a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blocked->AppendString("youtube3.com");
573a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  allowed->AppendString("youtube3.com/watch?fo*");
574a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blacklist.Block(blocked.get());
575a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blacklist.Allow(allowed.get());
576a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://youtube3.com")));
577a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(
578a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube3.com/watch?b=123&a21=467")));
579a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(
580a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      GURL("http://youtube3.com/watch?b=123&a21=467&foo1")));
581a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(
582a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      GURL("http://youtube3.com/watch?b=123&a21=467&foo=bar")));
583a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(
584a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      GURL("http://youtube3.com/watch?b=123&a21=467&fo=ba")));
585a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(
586a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube3.com/watch?foriegn=true")));
587a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://youtube3.com/watch?fold")));
588a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
589a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  allowed.reset(new base::ListValue);
590a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blocked.reset(new base::ListValue);
591a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blocked->AppendString("youtube4.com");
592a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  allowed->AppendString("youtube4.com?*");
593a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blacklist.Block(blocked.get());
594a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blacklist.Allow(allowed.get());
595a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://youtube4.com")));
596a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://youtube4.com/?hello")));
597a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://youtube4.com/?foo")));
598a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
599a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  allowed.reset(new base::ListValue);
600a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blocked.reset(new base::ListValue);
601a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blocked->AppendString("youtube5.com?foo=bar");
602a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  allowed->AppendString("youtube5.com?foo1=bar1&foo2=bar2&");
603a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blacklist.Block(blocked.get());
604a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blacklist.Allow(allowed.get());
605a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://youtube5.com")));
606a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://youtube5.com/?foo=bar&a=b")));
607a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // More specific filter is given precedence.
608a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(
609a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      GURL("http://youtube5.com/?a=b&foo=bar&foo1=bar1&foo2=bar2")));
610a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
611a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLBlacklistManagerTest, BlockAllWithExceptions) {
6135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  URLBlacklist blacklist(GetSegmentURLCallback());
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::ListValue> blocked(new base::ListValue);
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::ListValue> allowed(new base::ListValue);
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("*"));
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue(".www.google.com"));
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue("plus.google.com"));
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue("https://mail.google.com"));
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue("https://very.safe/path"));
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Block(blocked.get());
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Allow(allowed.get());
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://random.com")));
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://google.com")));
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://s.www.google.com")));
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://www.google.com")));
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://plus.google.com")));
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://s.plus.google.com")));
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://mail.google.com")));
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://mail.google.com")));
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://s.mail.google.com")));
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://very.safe/")));
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://very.safe/path")));
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://very.safe/path")));
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLBlacklistManagerTest, DontBlockResources) {
6395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<URLBlacklist> blacklist(new URLBlacklist(GetSegmentURLCallback()));
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::ListValue> blocked(new base::ListValue);
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  blocked->Append(new base::StringValue("google.com"));
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  blacklist->Block(blocked.get());
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  blacklist_manager_->SetBlacklist(blacklist.Pass());
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(blacklist_manager_->IsURLBlocked(GURL("http://google.com")));
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::TestURLRequestContext context;
64703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_ptr<net::URLRequest> request(context.CreateRequest(
64803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      GURL("http://google.com"), net::DEFAULT_PRIORITY, NULL, NULL));
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
650c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  int reason = net::ERR_UNEXPECTED;
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Background requests aren't filtered.
65203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(blacklist_manager_->IsRequestBlocked(*request.get(), &reason));
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Main frames are filtered.
65503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  request->SetLoadFlags(net::LOAD_MAIN_FRAME);
65603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(blacklist_manager_->IsRequestBlocked(*request.get(), &reason));
657c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(net::ERR_BLOCKED_BY_ADMINISTRATOR, reason);
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // On most platforms, sync gets a free pass due to signin flows.
660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool block_signin_urls = false;
661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS)
662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // There are no sync specific signin flows on Chrome OS, so no special
663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // treatment.
664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  block_signin_urls = true;
665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
667d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  GURL sync_url(GaiaUrls::GetInstance()->service_login_url().Resolve(
668d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      "?service=chromiumsync"));
66903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_ptr<net::URLRequest> sync_request(context.CreateRequest(
67003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      sync_url, net::DEFAULT_PRIORITY, NULL, NULL));
67103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  sync_request->SetLoadFlags(net::LOAD_MAIN_FRAME);
672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(block_signin_urls,
67303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            blacklist_manager_->IsRequestBlocked(*sync_request.get(), &reason));
67403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
67503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
67603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(URLBlacklistManagerTest, DefaultBlacklistExceptions) {
67703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  URLBlacklist blacklist(GetSegmentURLCallback());
67803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_ptr<base::ListValue> blocked(new base::ListValue);
67903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
68003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Blacklist everything:
68103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  blocked->Append(new base::StringValue("*"));
68203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  blacklist.Block(blocked.get());
68303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
68403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Internal NTP and extension URLs are not blocked by the "*":
68503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://www.google.com")));
68603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE((blacklist.IsURLBlocked(GURL("chrome-extension://xyz"))));
68703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE((blacklist.IsURLBlocked(GURL("chrome-search://local-ntp"))));
68803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE((blacklist.IsURLBlocked(GURL("chrome-native://ntp"))));
68903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
69003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Unless they are explicitly blacklisted:
69103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  blocked->Append(new base::StringValue("chrome-extension://*"));
69203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_ptr<base::ListValue> allowed(new base::ListValue);
69303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  allowed->Append(new base::StringValue("chrome-extension://abc"));
69403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  blacklist.Block(blocked.get());
69503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  blacklist.Allow(allowed.get());
69603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
69703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://www.google.com")));
69803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE((blacklist.IsURLBlocked(GURL("chrome-extension://xyz"))));
69903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE((blacklist.IsURLBlocked(GURL("chrome-extension://abc"))));
70003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE((blacklist.IsURLBlocked(GURL("chrome-search://local-ntp"))));
70103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE((blacklist.IsURLBlocked(GURL("chrome-native://ntp"))));
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace policy
705