url_blacklist_manager_unittest.cc revision a02191e04bc25c4935f804f2c080ae28663d096d
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 "chrome/common/net/url_fixer_upper.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/common/policy_pref_names.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "google_apis/gaia/gaia_urls.h"
19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "net/base/net_errors.h"
200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "net/base/request_priority.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/url_request.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/url_request_test_util.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// TODO(joaodasilva): this file should be moved next to
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// components/policy/core/browser/url_blacklist_manager.(cc|h).
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// However, url_fixer_upper.h can't be included from the component. Rather
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// than having it mocked out, the actual URLFixerUpper::SegmentURL call is used
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// to make sure that the parsing of URL filters is correct.
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace policy {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Helper to get the disambiguated SegmentURL() function.
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)URLBlacklist::SegmentURLCallback GetSegmentURLCallback() {
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return URLFixerUpper::SegmentURL;
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestingURLBlacklistManager : public URLBlacklistManager {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit TestingURLBlacklistManager(PrefService* pref_service)
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : URLBlacklistManager(pref_service,
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            base::MessageLoopProxy::current(),
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            base::MessageLoopProxy::current(),
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            GetSegmentURLCallback(),
48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                            base::Bind(OverrideBlacklistForURL)),
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        update_called_(0),
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        set_blacklist_called_(false) {}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestingURLBlacklistManager() {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make this method public for testing.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  using URLBlacklistManager::ScheduleUpdate;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Makes a direct call to UpdateOnIO during tests.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateOnIOForTesting() {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<base::ListValue> block(new base::ListValue);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    block->Append(new base::StringValue("example.com"));
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<base::ListValue> allow(new base::ListValue);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLBlacklistManager::UpdateOnIO(block.Pass(), allow.Pass());
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // URLBlacklistManager overrides:
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetBlacklist(scoped_ptr<URLBlacklist> blacklist) OVERRIDE {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_blacklist_called_ = true;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLBlacklistManager::SetBlacklist(blacklist.Pass());
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Update() OVERRIDE {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    update_called_++;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLBlacklistManager::Update();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int update_called() const { return update_called_; }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool set_blacklist_called() const { return set_blacklist_called_; }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int update_called_;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool set_blacklist_called_;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestingURLBlacklistManager);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLBlacklistManagerTest : public testing::Test {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  URLBlacklistManagerTest() {}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    pref_service_.registry()->RegisterListPref(policy_prefs::kUrlBlacklist);
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    pref_service_.registry()->RegisterListPref(policy_prefs::kUrlWhitelist);
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    blacklist_manager_.reset(new TestingURLBlacklistManager(&pref_service_));
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loop_.RunUntilIdle();
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (blacklist_manager_.get())
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      blacklist_manager_->ShutdownOnUIThread();
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loop_.RunUntilIdle();
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Delete |blacklist_manager_| while |io_thread_| is mapping IO to
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |loop_|.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    blacklist_manager_.reset();
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::MessageLoopForIO loop_;
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSimple pref_service_;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestingURLBlacklistManager> blacklist_manager_;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Parameters for the FilterToComponents test.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FilterTestParams {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilterTestParams(const std::string& filter, const std::string& scheme,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const std::string& host, bool match_subdomains, uint16 port,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const std::string& path)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : filter_(filter), scheme_(scheme), host_(host),
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        match_subdomains_(match_subdomains), port_(port), path_(path) {}
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilterTestParams(const FilterTestParams& params)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : filter_(params.filter_), scheme_(params.scheme_), host_(params.host_),
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        match_subdomains_(params.match_subdomains_), port_(params.port_),
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        path_(params.path_) {}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FilterTestParams& operator=(const FilterTestParams& params) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    filter_ = params.filter_;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scheme_ = params.scheme_;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_ = params.host_;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    match_subdomains_ = params.match_subdomains_;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    port_ = params.port_;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path_ = params.path_;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *this;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& filter() const { return filter_; }
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& scheme() const { return scheme_; }
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& host() const { return host_; }
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool match_subdomains() const { return match_subdomains_; }
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 port() const { return port_; }
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& path() const { return path_; }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string filter_;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string scheme_;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string host_;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool match_subdomains_;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 port_;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string path_;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make Valgrind happy. Without this function, a generic one will print the
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// raw bytes in FilterTestParams, which due to some likely padding will access
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// uninitialized memory.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintTo(const FilterTestParams& params, std::ostream* os) {
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *os << params.filter();
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLBlacklistFilterToComponentsTest
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public testing::TestWithParam<FilterTestParams> {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLBlacklistFilterToComponentsTest() {}
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(URLBlacklistFilterToComponentsTest);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(URLBlacklistFilterToComponentsTest, FilterToComponents) {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string scheme;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string host;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool match_subdomains = true;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 port = 42;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string path;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
177a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  URLBlacklist::FilterToComponents(GetSegmentURLCallback(),
178a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                   GetParam().filter(),
179a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                   &scheme,
180a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                   &host,
181a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                   &match_subdomains,
182a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                   &port,
183a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                   &path,
184a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                   NULL);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetParam().scheme(), scheme);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetParam().host(), host);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetParam().match_subdomains(), match_subdomains);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetParam().port(), port);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetParam().path(), path);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLBlacklistManagerTest, SingleUpdateForTwoPrefChanges) {
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue* blacklist = new base::ListValue;
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  blacklist->Append(new base::StringValue("*.google.com"));
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue* whitelist = new base::ListValue;
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  whitelist->Append(new base::StringValue("mail.google.com"));
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  pref_service_.SetManagedPref(policy_prefs::kUrlBlacklist, blacklist);
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  pref_service_.SetManagedPref(policy_prefs::kUrlBlacklist, whitelist);
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_.RunUntilIdle();
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, blacklist_manager_->update_called());
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLBlacklistManagerTest, ShutdownWithPendingTask0) {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Post an update task to the UI thread.
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist_manager_->ScheduleUpdate();
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shutdown comes before the task is executed.
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist_manager_->ShutdownOnUIThread();
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist_manager_.reset();
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the task after shutdown and deletion.
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_.RunUntilIdle();
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLBlacklistManagerTest, ShutdownWithPendingTask1) {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Post an update task.
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist_manager_->ScheduleUpdate();
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shutdown comes before the task is executed.
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist_manager_->ShutdownOnUIThread();
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the task after shutdown, but before deletion.
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_.RunUntilIdle();
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, blacklist_manager_->update_called());
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist_manager_.reset();
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_.RunUntilIdle();
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLBlacklistManagerTest, ShutdownWithPendingTask2) {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This posts a task to the FILE thread.
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist_manager_->UpdateOnIOForTesting();
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // But shutdown happens before it is done.
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist_manager_->ShutdownOnUIThread();
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist_manager_->set_blacklist_called());
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist_manager_.reset();
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_.RunUntilIdle();
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLBlacklistFilterToComponentsTestInstance,
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLBlacklistFilterToComponentsTest,
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testing::Values(
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("google.com",
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string(),
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         ".google.com",
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         true,
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0u,
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string()),
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams(".google.com",
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string(),
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "google.com",
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         false,
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0u,
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string()),
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("http://google.com",
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "http",
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         ".google.com",
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         true,
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0u,
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string()),
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("google.com/",
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string(),
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         ".google.com",
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         true,
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0u,
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "/"),
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("http://google.com:8080/whatever",
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "http",
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         ".google.com",
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         true,
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         8080u,
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "/whatever"),
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("http://user:pass@google.com:8080/whatever",
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "http",
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         ".google.com",
275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         true,
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         8080u,
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "/whatever"),
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("123.123.123.123",
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string(),
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "123.123.123.123",
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         false,
282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0u,
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string()),
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("https://123.123.123.123",
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "https",
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "123.123.123.123",
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         false,
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0u,
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string()),
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("123.123.123.123/",
291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string(),
292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "123.123.123.123",
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         false,
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0u,
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "/"),
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("http://123.123.123.123:123/whatever",
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "http",
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "123.123.123.123",
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         false,
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         123u,
301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "/whatever"),
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("*",
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string(),
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string(),
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         true,
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0u,
307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string()),
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("ftp://*",
309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "ftp",
310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string(),
311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         true,
312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0u,
313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string()),
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilterTestParams("http://*/whatever",
315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "http",
316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         std::string(),
317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         true,
318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0u,
319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "/whatever")));
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLBlacklistManagerTest, Filtering) {
3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  URLBlacklist blacklist(GetSegmentURLCallback());
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Block domain and all subdomains, for any filtered scheme.
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::ListValue> blocked(new base::ListValue);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("google.com"));
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Block(blocked.get());
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://google.com")));
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://google.com/")));
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://google.com/whatever")));
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://google.com/")));
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("bogus://google.com/")));
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://notgoogle.com/")));
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://mail.google.com")));
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://x.mail.google.com")));
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://x.mail.google.com/")));
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://x.y.google.com/a/b")));
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://youtube.com/")));
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Filter only http, ftp and ws schemes.
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked.reset(new base::ListValue);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("http://secure.com"));
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("ftp://secure.com"));
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("ws://secure.com"));
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Block(blocked.get());
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://secure.com")));
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://secure.com/whatever")));
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("ftp://secure.com/")));
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("ws://secure.com")));
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://secure.com/")));
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("wss://secure.com")));
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://www.secure.com")));
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://www.secure.com")));
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("wss://www.secure.com")));
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Filter only a certain path prefix.
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked.reset(new base::ListValue);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("path.to/ruin"));
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Block(blocked.get());
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://path.to/ruin")));
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://path.to/ruin")));
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://path.to/ruins")));
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://path.to/ruin/signup")));
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://www.path.to/ruin")));
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://path.to/fortune")));
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Filter only a certain path prefix and scheme.
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked.reset(new base::ListValue);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("https://s.aaa.com/path"));
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Block(blocked.get());
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://s.aaa.com/path")));
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://s.aaa.com/path/bbb")));
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://s.aaa.com/path")));
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://aaa.com/path")));
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://x.aaa.com/path")));
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://s.aaa.com/bbb")));
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://s.aaa.com/")));
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Filter only ws and wss schemes.
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked.reset(new base::ListValue);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("ws://ws.aaa.com"));
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("wss://ws.aaa.com"));
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Block(blocked.get());
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("ws://ws.aaa.com")));
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("wss://ws.aaa.com")));
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://ws.aaa.com")));
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://ws.aaa.com")));
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("ftp://ws.aaa.com")));
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test exceptions to path prefixes, and most specific matches.
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked.reset(new base::ListValue);
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::ListValue> allowed(new base::ListValue);
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("s.xxx.com/a"));
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue("s.xxx.com/a/b"));
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("https://s.xxx.com/a/b/c"));
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue("https://s.xxx.com/a/b/c/d"));
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Block(blocked.get());
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Allow(allowed.get());
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://s.xxx.com/a")));
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://s.xxx.com/a/x")));
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://s.xxx.com/a/x")));
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://s.xxx.com/a/b")));
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://s.xxx.com/a/b")));
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://s.xxx.com/a/b/x")));
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://s.xxx.com/a/b/c")));
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://s.xxx.com/a/b/c")));
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://s.xxx.com/a/b/c/x")));
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://s.xxx.com/a/b/c/d")));
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://s.xxx.com/a/b/c/d")));
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://s.xxx.com/a/b/c/d/x")));
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://s.xxx.com/a/b/c/d/x")));
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://xxx.com/a")));
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://xxx.com/a/b")));
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Block an ip address.
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked.reset(new base::ListValue);
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("123.123.123.123"));
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Block(blocked.get());
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://123.123.123.123/")));
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://123.123.123.124/")));
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open an exception.
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed.reset(new base::ListValue);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue("plus.google.com"));
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Allow(allowed.get());
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://google.com/")));
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://www.google.com/")));
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://plus.google.com/")));
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open an exception only when using https for mail.
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed.reset(new base::ListValue);
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue("https://mail.google.com"));
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Allow(allowed.get());
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://google.com/")));
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://mail.google.com/")));
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://www.google.com/")));
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://www.google.com/")));
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://mail.google.com/")));
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Match exactly "google.com", only for http. Subdomains without exceptions
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // are still blocked.
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed.reset(new base::ListValue);
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue("http://.google.com"));
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Allow(allowed.get());
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://google.com/")));
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://google.com/")));
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://www.google.com/")));
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A smaller path match in an exact host overrides a longer path for hosts
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that also match subdomains.
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked.reset(new base::ListValue);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("yyy.com/aaa"));
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Block(blocked.get());
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed.reset(new base::ListValue);
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue(".yyy.com/a"));
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Allow(allowed.get());
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://yyy.com")));
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://yyy.com/aaa")));
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://yyy.com/aaa2")));
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://www.yyy.com")));
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://www.yyy.com/aaa")));
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://www.yyy.com/aaa2")));
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the exact entry is both allowed and blocked, allowing takes precedence.
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked.reset(new base::ListValue);
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("example.com"));
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Block(blocked.get());
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed.reset(new base::ListValue);
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue("example.com"));
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Allow(allowed.get());
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://example.com")));
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
474a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(URLBlacklistManagerTest, QueryParameters) {
475a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  URLBlacklist blacklist(GetSegmentURLCallback());
476a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  scoped_ptr<base::ListValue> blocked(new base::ListValue);
477a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  scoped_ptr<base::ListValue> allowed(new base::ListValue);
478a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
479a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Block domain and all subdomains, for any filtered scheme.
480a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blocked->AppendString("youtube.com");
481a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  allowed->AppendString("youtube.com/watch?v=XYZ");
482a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blacklist.Block(blocked.get());
483a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blacklist.Allow(allowed.get());
484a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
485a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://youtube.com")));
486a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://youtube.com/watch?v=123")));
487a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(
488a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube.com/watch?v=123&v=XYZ")));
489a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(
490a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube.com/watch?v=XYZ&v=123")));
491a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://youtube.com/watch?v=XYZ")));
492a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(
493a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube.com/watch?v=XYZ&foo=bar")));
494a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(
495a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube.com/watch?foo=bar&v=XYZ")));
496a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
497a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  allowed.reset(new base::ListValue);
498a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  allowed->AppendString("youtube.com/watch?av=XYZ&ag=123");
499a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blacklist.Allow(allowed.get());
500a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://youtube.com")));
501a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://youtube.com/watch?av=123")));
502a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://youtube.com/watch?av=XYZ")));
503a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(
504a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube.com/watch?av=123&ag=XYZ")));
505a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(
506a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube.com/watch?ag=XYZ&av=123")));
507a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(
508a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube.com/watch?av=XYZ&ag=123")));
509a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(
510a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube.com/watch?ag=123&av=XYZ")));
511a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(blacklist.IsURLBlocked(
512a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      GURL("http://youtube.com/watch?av=XYZ&ag=123&av=123")));
513a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(blacklist.IsURLBlocked(
514a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      GURL("http://youtube.com/watch?av=XYZ&ag=123&ag=1234")));
515a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
516a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  allowed.reset(new base::ListValue);
517a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  allowed->AppendString("youtube.com/watch?foo=bar*&vid=2*");
518a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blacklist.Allow(allowed.get());
519a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://youtube.com")));
520a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://youtube.com/watch?vid=2")));
521a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://youtube.com/watch?foo=bar")));
522a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(
523a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube.com/watch?vid=2&foo=bar")));
524a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(
525a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube.com/watch?vid=2&foo=bar1")));
526a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(
527a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube.com/watch?vid=234&foo=bar")));
528a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(
529a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      GURL("http://youtube.com/watch?vid=234&foo=bar23")));
530a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
531a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blocked.reset(new base::ListValue);
532a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blocked->AppendString("youtube1.com/disallow?v=44678");
533a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blacklist.Block(blocked.get());
534a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://youtube1.com")));
535a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://youtube1.com?v=123")));
536a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Path does not match
537a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://youtube1.com?v=44678")));
538a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(
539a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube1.com/disallow?v=44678")));
540a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(
541a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube1.com/disallow?v=4467")));
542a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(
543a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      GURL("http://youtube1.com/disallow?v=4467&v=123")));
544a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(blacklist.IsURLBlocked(
545a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      GURL("http://youtube1.com/disallow?v=4467&v=123&v=44678")));
546a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
547a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blocked.reset(new base::ListValue);
548a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blocked->AppendString("youtube1.com/disallow?g=*");
549a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blacklist.Block(blocked.get());
550a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://youtube1.com")));
551a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://youtube1.com?ag=123")));
552a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(
553a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube1.com/disallow?g=123")));
554a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(
555a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube1.com/disallow?ag=13&g=123")));
556a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
557a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blocked.reset(new base::ListValue);
558a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blocked->AppendString("youtube2.com/disallow?a*");
559a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blacklist.Block(blocked.get());
560a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://youtube2.com")));
561a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(blacklist.IsURLBlocked(
562a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      GURL("http://youtube2.com/disallow?b=123&a21=467")));
563a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(
564a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube2.com/disallow?abba=true")));
565a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(
566a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube2.com/disallow?baba=true")));
567a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
568a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  allowed.reset(new base::ListValue);
569a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blocked.reset(new base::ListValue);
570a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blocked->AppendString("youtube3.com");
571a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  allowed->AppendString("youtube3.com/watch?fo*");
572a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blacklist.Block(blocked.get());
573a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blacklist.Allow(allowed.get());
574a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://youtube3.com")));
575a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(
576a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube3.com/watch?b=123&a21=467")));
577a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(
578a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      GURL("http://youtube3.com/watch?b=123&a21=467&foo1")));
579a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(
580a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      GURL("http://youtube3.com/watch?b=123&a21=467&foo=bar")));
581a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(
582a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      GURL("http://youtube3.com/watch?b=123&a21=467&fo=ba")));
583a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(
584a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      blacklist.IsURLBlocked(GURL("http://youtube3.com/watch?foriegn=true")));
585a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://youtube3.com/watch?fold")));
586a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
587a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  allowed.reset(new base::ListValue);
588a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blocked.reset(new base::ListValue);
589a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blocked->AppendString("youtube4.com");
590a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  allowed->AppendString("youtube4.com?*");
591a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blacklist.Block(blocked.get());
592a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blacklist.Allow(allowed.get());
593a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://youtube4.com")));
594a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://youtube4.com/?hello")));
595a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://youtube4.com/?foo")));
596a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
597a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  allowed.reset(new base::ListValue);
598a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blocked.reset(new base::ListValue);
599a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blocked->AppendString("youtube5.com?foo=bar");
600a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  allowed->AppendString("youtube5.com?foo1=bar1&foo2=bar2&");
601a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blacklist.Block(blocked.get());
602a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  blacklist.Allow(allowed.get());
603a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://youtube5.com")));
604a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://youtube5.com/?foo=bar&a=b")));
605a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // More specific filter is given precedence.
606a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(blacklist.IsURLBlocked(
607a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      GURL("http://youtube5.com/?a=b&foo=bar&foo1=bar1&foo2=bar2")));
608a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
609a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLBlacklistManagerTest, BlockAllWithExceptions) {
6115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  URLBlacklist blacklist(GetSegmentURLCallback());
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::ListValue> blocked(new base::ListValue);
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::ListValue> allowed(new base::ListValue);
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked->Append(new base::StringValue("*"));
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue(".www.google.com"));
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue("plus.google.com"));
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue("https://mail.google.com"));
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed->Append(new base::StringValue("https://very.safe/path"));
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Block(blocked.get());
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blacklist.Allow(allowed.get());
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://random.com")));
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://google.com")));
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://s.www.google.com")));
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://www.google.com")));
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://plus.google.com")));
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://s.plus.google.com")));
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://mail.google.com")));
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://mail.google.com")));
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://s.mail.google.com")));
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://very.safe/")));
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://very.safe/path")));
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://very.safe/path")));
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLBlacklistManagerTest, DontBlockResources) {
6375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<URLBlacklist> blacklist(new URLBlacklist(GetSegmentURLCallback()));
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::ListValue> blocked(new base::ListValue);
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  blocked->Append(new base::StringValue("google.com"));
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  blacklist->Block(blocked.get());
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  blacklist_manager_->SetBlacklist(blacklist.Pass());
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(blacklist_manager_->IsURLBlocked(GURL("http://google.com")));
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::TestURLRequestContext context;
6450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  net::URLRequest request(
6460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      GURL("http://google.com"), net::DEFAULT_PRIORITY, NULL, &context);
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
648c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  int reason = net::ERR_UNEXPECTED;
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Background requests aren't filtered.
650c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_FALSE(blacklist_manager_->IsRequestBlocked(request, &reason));
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Main frames are filtered.
653f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  request.SetLoadFlags(net::LOAD_MAIN_FRAME);
654c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(blacklist_manager_->IsRequestBlocked(request, &reason));
655c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(net::ERR_BLOCKED_BY_ADMINISTRATOR, reason);
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // On most platforms, sync gets a free pass due to signin flows.
658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool block_signin_urls = false;
659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS)
660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // There are no sync specific signin flows on Chrome OS, so no special
661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // treatment.
662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  block_signin_urls = true;
663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
665d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  GURL sync_url(GaiaUrls::GetInstance()->service_login_url().Resolve(
666d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      "?service=chromiumsync"));
6670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  net::URLRequest sync_request(sync_url, net::DEFAULT_PRIORITY, NULL, &context);
668f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  sync_request.SetLoadFlags(net::LOAD_MAIN_FRAME);
669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(block_signin_urls,
670c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            blacklist_manager_->IsRequestBlocked(sync_request, &reason));
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace policy
674