url_blacklist_manager_unittest.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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"
109ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_registry_simple.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/testing_pref_service.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/policy/policy_helpers.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/net/url_fixer_upper.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/common/policy_pref_names.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "google_apis/gaia/gaia_urls.h"
180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "net/base/request_priority.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/url_request.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/url_request_test_util.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// TODO(joaodasilva): this file should be moved next to
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// components/policy/core/browser/url_blacklist_manager.(cc|h).
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// However, url_fixer_upper.h can't be included from the component. Rather
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// than having it mocked out, the actual URLFixerUpper::SegmentURL call is used
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// to make sure that the parsing of URL filters is correct.
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace policy {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Helper to get the disambiguated SegmentURL() function.
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)URLBlacklist::SegmentURLCallback GetSegmentURLCallback() {
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return URLFixerUpper::SegmentURL;
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestingURLBlacklistManager : public URLBlacklistManager {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit TestingURLBlacklistManager(PrefService* pref_service)
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : URLBlacklistManager(pref_service,
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            base::MessageLoopProxy::current(),
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            base::MessageLoopProxy::current(),
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            GetSegmentURLCallback(),
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            SkipBlacklistForURL),
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        update_called_(0),
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        set_blacklist_called_(false) {}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestingURLBlacklistManager() {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make this method public for testing.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  using URLBlacklistManager::ScheduleUpdate;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Makes a direct call to UpdateOnIO during tests.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateOnIOForTesting() {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<base::ListValue> block(new base::ListValue);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    block->Append(new base::StringValue("example.com"));
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<base::ListValue> allow(new base::ListValue);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLBlacklistManager::UpdateOnIO(block.Pass(), allow.Pass());
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // URLBlacklistManager overrides:
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetBlacklist(scoped_ptr<URLBlacklist> blacklist) OVERRIDE {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_blacklist_called_ = true;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLBlacklistManager::SetBlacklist(blacklist.Pass());
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Update() OVERRIDE {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    update_called_++;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLBlacklistManager::Update();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int update_called() const { return update_called_; }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool set_blacklist_called() const { return set_blacklist_called_; }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int update_called_;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool set_blacklist_called_;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestingURLBlacklistManager);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLBlacklistManagerTest : public testing::Test {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  URLBlacklistManagerTest() {}
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    pref_service_.registry()->RegisterListPref(policy_prefs::kUrlBlacklist);
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    pref_service_.registry()->RegisterListPref(policy_prefs::kUrlWhitelist);
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    blacklist_manager_.reset(new TestingURLBlacklistManager(&pref_service_));
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loop_.RunUntilIdle();
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (blacklist_manager_.get())
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      blacklist_manager_->ShutdownOnUIThread();
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loop_.RunUntilIdle();
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Delete |blacklist_manager_| while |io_thread_| is mapping IO to
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |loop_|.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    blacklist_manager_.reset();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::MessageLoopForIO loop_;
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSimple pref_service_;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestingURLBlacklistManager> blacklist_manager_;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Parameters for the FilterToComponents test.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FilterTestParams {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilterTestParams(const std::string& filter, const std::string& scheme,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const std::string& host, bool match_subdomains, uint16 port,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const std::string& path)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : filter_(filter), scheme_(scheme), host_(host),
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        match_subdomains_(match_subdomains), port_(port), path_(path) {}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilterTestParams(const FilterTestParams& params)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : filter_(params.filter_), scheme_(params.scheme_), host_(params.host_),
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        match_subdomains_(params.match_subdomains_), port_(params.port_),
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        path_(params.path_) {}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FilterTestParams& operator=(const FilterTestParams& params) {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    filter_ = params.filter_;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scheme_ = params.scheme_;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_ = params.host_;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    match_subdomains_ = params.match_subdomains_;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    port_ = params.port_;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path_ = params.path_;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *this;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& filter() const { return filter_; }
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& scheme() const { return scheme_; }
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& host() const { return host_; }
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool match_subdomains() const { return match_subdomains_; }
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 port() const { return port_; }
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& path() const { return path_; }
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string filter_;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string scheme_;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string host_;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool match_subdomains_;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 port_;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string path_;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make Valgrind happy. Without this function, a generic one will print the
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// raw bytes in FilterTestParams, which due to some likely padding will access
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// uninitialized memory.
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintTo(const FilterTestParams& params, std::ostream* os) {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *os << params.filter();
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLBlacklistFilterToComponentsTest
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public testing::TestWithParam<FilterTestParams> {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLBlacklistFilterToComponentsTest() {}
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(URLBlacklistFilterToComponentsTest);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(URLBlacklistFilterToComponentsTest, FilterToComponents) {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string scheme;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string host;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool match_subdomains = true;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 port = 42;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string path;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  URLBlacklist::FilterToComponents(GetSegmentURLCallback(), GetParam().filter(),
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   &scheme, &host, &match_subdomains, &port,
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   &path);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetParam().scheme(), scheme);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetParam().host(), host);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetParam().match_subdomains(), match_subdomains);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetParam().port(), port);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetParam().path(), path);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLBlacklistManagerTest, SingleUpdateForTwoPrefChanges) {
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue* blacklist = new base::ListValue;
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  blacklist->Append(new base::StringValue("*.google.com"));
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue* whitelist = new base::ListValue;
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  whitelist->Append(new base::StringValue("mail.google.com"));
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  pref_service_.SetManagedPref(policy_prefs::kUrlBlacklist, blacklist);
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  pref_service_.SetManagedPref(policy_prefs::kUrlBlacklist, whitelist);
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_.RunUntilIdle();
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, blacklist_manager_->update_called());
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLBlacklistManagerTest, ShutdownWithPendingTask0) {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Post an update task to the UI thread.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist_manager_->ScheduleUpdate();
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shutdown comes before the task is executed.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist_manager_->ShutdownOnUIThread();
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist_manager_.reset();
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the task after shutdown and deletion.
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_.RunUntilIdle();
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLBlacklistManagerTest, ShutdownWithPendingTask1) {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Post an update task.
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist_manager_->ScheduleUpdate();
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shutdown comes before the task is executed.
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist_manager_->ShutdownOnUIThread();
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the task after shutdown, but before deletion.
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_.RunUntilIdle();
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, blacklist_manager_->update_called());
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist_manager_.reset();
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_.RunUntilIdle();
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLBlacklistManagerTest, ShutdownWithPendingTask2) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This posts a task to the FILE thread.
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist_manager_->UpdateOnIOForTesting();
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // But shutdown happens before it is done.
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist_manager_->ShutdownOnUIThread();
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist_manager_->set_blacklist_called());
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist_manager_.reset();
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_.RunUntilIdle();
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLBlacklistFilterToComponentsTestInstance,
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLBlacklistFilterToComponentsTest,
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testing::Values(
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("google.com",
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string(),
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         ".google.com",
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         true,
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0u,
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string()),
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams(".google.com",
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string(),
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "google.com",
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         false,
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0u,
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string()),
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("http://google.com",
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "http",
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         ".google.com",
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         true,
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0u,
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string()),
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("google.com/",
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string(),
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         ".google.com",
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         true,
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0u,
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "/"),
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("http://google.com:8080/whatever",
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "http",
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         ".google.com",
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         true,
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         8080u,
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "/whatever"),
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("http://user:pass@google.com:8080/whatever",
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "http",
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         ".google.com",
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         true,
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         8080u,
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "/whatever"),
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("123.123.123.123",
272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string(),
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "123.123.123.123",
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         false,
275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0u,
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string()),
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("https://123.123.123.123",
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "https",
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "123.123.123.123",
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         false,
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0u,
282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string()),
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("123.123.123.123/",
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string(),
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "123.123.123.123",
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         false,
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0u,
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "/"),
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("http://123.123.123.123:123/whatever",
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "http",
291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "123.123.123.123",
292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         false,
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         123u,
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "/whatever"),
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("*",
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string(),
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string(),
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         true,
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0u,
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string()),
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("ftp://*",
302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "ftp",
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string(),
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         true,
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0u,
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string()),
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("http://*/whatever",
308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "http",
309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string(),
310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         true,
311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0u,
312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "/whatever")));
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLBlacklistManagerTest, Filtering) {
3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  URLBlacklist blacklist(GetSegmentURLCallback());
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Block domain and all subdomains, for any filtered scheme.
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::ListValue> blocked(new base::ListValue);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("google.com"));
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Block(blocked.get());
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://google.com")));
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://google.com/")));
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://google.com/whatever")));
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://google.com/")));
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("bogus://google.com/")));
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://notgoogle.com/")));
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://mail.google.com")));
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://x.mail.google.com")));
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://x.mail.google.com/")));
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://x.y.google.com/a/b")));
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://youtube.com/")));
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Filter only http, ftp and ws schemes.
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked.reset(new base::ListValue);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("http://secure.com"));
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("ftp://secure.com"));
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("ws://secure.com"));
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Block(blocked.get());
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://secure.com")));
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://secure.com/whatever")));
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("ftp://secure.com/")));
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("ws://secure.com")));
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://secure.com/")));
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("wss://secure.com")));
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://www.secure.com")));
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://www.secure.com")));
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("wss://www.secure.com")));
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Filter only a certain path prefix.
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked.reset(new base::ListValue);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("path.to/ruin"));
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Block(blocked.get());
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://path.to/ruin")));
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://path.to/ruin")));
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://path.to/ruins")));
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://path.to/ruin/signup")));
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://www.path.to/ruin")));
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://path.to/fortune")));
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Filter only a certain path prefix and scheme.
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked.reset(new base::ListValue);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("https://s.aaa.com/path"));
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Block(blocked.get());
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://s.aaa.com/path")));
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://s.aaa.com/path/bbb")));
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://s.aaa.com/path")));
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://aaa.com/path")));
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://x.aaa.com/path")));
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://s.aaa.com/bbb")));
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://s.aaa.com/")));
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Filter only ws and wss schemes.
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked.reset(new base::ListValue);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("ws://ws.aaa.com"));
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("wss://ws.aaa.com"));
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Block(blocked.get());
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("ws://ws.aaa.com")));
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("wss://ws.aaa.com")));
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://ws.aaa.com")));
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://ws.aaa.com")));
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("ftp://ws.aaa.com")));
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test exceptions to path prefixes, and most specific matches.
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked.reset(new base::ListValue);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::ListValue> allowed(new base::ListValue);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("s.xxx.com/a"));
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue("s.xxx.com/a/b"));
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("https://s.xxx.com/a/b/c"));
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue("https://s.xxx.com/a/b/c/d"));
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Block(blocked.get());
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Allow(allowed.get());
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://s.xxx.com/a")));
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://s.xxx.com/a/x")));
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://s.xxx.com/a/x")));
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://s.xxx.com/a/b")));
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://s.xxx.com/a/b")));
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://s.xxx.com/a/b/x")));
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://s.xxx.com/a/b/c")));
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://s.xxx.com/a/b/c")));
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://s.xxx.com/a/b/c/x")));
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://s.xxx.com/a/b/c/d")));
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://s.xxx.com/a/b/c/d")));
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://s.xxx.com/a/b/c/d/x")));
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://s.xxx.com/a/b/c/d/x")));
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://xxx.com/a")));
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://xxx.com/a/b")));
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Block an ip address.
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked.reset(new base::ListValue);
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("123.123.123.123"));
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Block(blocked.get());
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://123.123.123.123/")));
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://123.123.123.124/")));
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open an exception.
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed.reset(new base::ListValue);
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue("plus.google.com"));
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Allow(allowed.get());
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://google.com/")));
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://www.google.com/")));
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://plus.google.com/")));
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open an exception only when using https for mail.
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed.reset(new base::ListValue);
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue("https://mail.google.com"));
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Allow(allowed.get());
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://google.com/")));
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://mail.google.com/")));
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://www.google.com/")));
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://www.google.com/")));
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://mail.google.com/")));
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Match exactly "google.com", only for http. Subdomains without exceptions
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // are still blocked.
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed.reset(new base::ListValue);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue("http://.google.com"));
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Allow(allowed.get());
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://google.com/")));
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://google.com/")));
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://www.google.com/")));
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A smaller path match in an exact host overrides a longer path for hosts
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that also match subdomains.
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked.reset(new base::ListValue);
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("yyy.com/aaa"));
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Block(blocked.get());
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed.reset(new base::ListValue);
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue(".yyy.com/a"));
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Allow(allowed.get());
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://yyy.com")));
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://yyy.com/aaa")));
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://yyy.com/aaa2")));
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://www.yyy.com")));
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://www.yyy.com/aaa")));
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://www.yyy.com/aaa2")));
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the exact entry is both allowed and blocked, allowing takes precedence.
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked.reset(new base::ListValue);
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("example.com"));
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Block(blocked.get());
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed.reset(new base::ListValue);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue("example.com"));
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Allow(allowed.get());
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://example.com")));
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLBlacklistManagerTest, BlockAllWithExceptions) {
4685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  URLBlacklist blacklist(GetSegmentURLCallback());
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::ListValue> blocked(new base::ListValue);
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::ListValue> allowed(new base::ListValue);
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("*"));
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue(".www.google.com"));
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue("plus.google.com"));
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue("https://mail.google.com"));
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue("https://very.safe/path"));
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Block(blocked.get());
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Allow(allowed.get());
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://random.com")));
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://google.com")));
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://s.www.google.com")));
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://www.google.com")));
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://plus.google.com")));
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://s.plus.google.com")));
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://mail.google.com")));
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://mail.google.com")));
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://s.mail.google.com")));
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://very.safe/")));
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://very.safe/path")));
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://very.safe/path")));
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLBlacklistManagerTest, DontBlockResources) {
4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<URLBlacklist> blacklist(new URLBlacklist(GetSegmentURLCallback()));
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::ListValue> blocked(new base::ListValue);
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  blocked->Append(new base::StringValue("google.com"));
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  blacklist->Block(blocked.get());
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  blacklist_manager_->SetBlacklist(blacklist.Pass());
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(blacklist_manager_->IsURLBlocked(GURL("http://google.com")));
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::TestURLRequestContext context;
5020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  net::URLRequest request(
5030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      GURL("http://google.com"), net::DEFAULT_PRIORITY, NULL, &context);
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Background requests aren't filtered.
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(blacklist_manager_->IsRequestBlocked(request));
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Main frames are filtered.
509f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  request.SetLoadFlags(net::LOAD_MAIN_FRAME);
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(blacklist_manager_->IsRequestBlocked(request));
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // On most platforms, sync gets a free pass due to signin flows.
513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool block_signin_urls = false;
514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS)
515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // There are no sync specific signin flows on Chrome OS, so no special
516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // treatment.
517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  block_signin_urls = true;
518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
520d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  GURL sync_url(GaiaUrls::GetInstance()->service_login_url().Resolve(
521d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      "?service=chromiumsync"));
5220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  net::URLRequest sync_request(sync_url, net::DEFAULT_PRIORITY, NULL, &context);
523f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  sync_request.SetLoadFlags(net::LOAD_MAIN_FRAME);
524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(block_signin_urls,
525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            blacklist_manager_->IsRequestBlocked(sync_request));
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace policy
529