| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/policy/url_blacklist_manager.h" | 5 #include "chrome/browser/policy/url_blacklist_manager.h" |
| 6 | 6 |
| 7 #include <ostream> | 7 #include <ostream> |
| 8 | 8 |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
| 11 #include "base/message_loop/message_loop_proxy.h" |
| 11 #include "base/prefs/pref_registry_simple.h" | 12 #include "base/prefs/pref_registry_simple.h" |
| 12 #include "base/prefs/testing_pref_service.h" | 13 #include "base/prefs/testing_pref_service.h" |
| 13 #include "chrome/common/pref_names.h" | 14 #include "chrome/browser/policy/policy_helpers.h" |
| 14 #include "content/public/test/test_browser_thread.h" | 15 #include "chrome/common/net/url_fixer_upper.h" |
| 16 #include "components/policy/core/common/policy_pref_names.h" |
| 15 #include "google_apis/gaia/gaia_urls.h" | 17 #include "google_apis/gaia/gaia_urls.h" |
| 16 #include "net/base/request_priority.h" | 18 #include "net/base/request_priority.h" |
| 17 #include "net/url_request/url_request.h" | 19 #include "net/url_request/url_request.h" |
| 18 #include "net/url_request/url_request_test_util.h" | 20 #include "net/url_request/url_request_test_util.h" |
| 19 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
| 20 #include "url/gurl.h" | 22 #include "url/gurl.h" |
| 21 | 23 |
| 22 namespace policy { | 24 namespace policy { |
| 23 | 25 |
| 24 namespace { | 26 namespace { |
| 25 | 27 |
| 26 using content::BrowserThread; | 28 // Helper to get the disambiguated SegmentURL() function. |
| 29 URLBlacklist::SegmentURLCallback GetSegmentURLCallback() { |
| 30 return URLFixerUpper::SegmentURL; |
| 31 } |
| 27 | 32 |
| 28 class TestingURLBlacklistManager : public URLBlacklistManager { | 33 class TestingURLBlacklistManager : public URLBlacklistManager { |
| 29 public: | 34 public: |
| 30 explicit TestingURLBlacklistManager(PrefService* pref_service) | 35 explicit TestingURLBlacklistManager(PrefService* pref_service) |
| 31 : URLBlacklistManager(pref_service), | 36 : URLBlacklistManager(pref_service, |
| 37 base::MessageLoopProxy::current(), |
| 38 GetSegmentURLCallback(), |
| 39 SkipBlacklistForURL), |
| 32 update_called_(0), | 40 update_called_(0), |
| 33 set_blacklist_called_(false) { | 41 set_blacklist_called_(false) {} |
| 34 } | |
| 35 | 42 |
| 36 virtual ~TestingURLBlacklistManager() { | 43 virtual ~TestingURLBlacklistManager() { |
| 37 } | 44 } |
| 38 | 45 |
| 39 // Make this method public for testing. | 46 // Make this method public for testing. |
| 40 using URLBlacklistManager::ScheduleUpdate; | 47 using URLBlacklistManager::ScheduleUpdate; |
| 41 | 48 |
| 42 // Makes a direct call to UpdateOnIO during tests. | 49 // Makes a direct call to UpdateOnIO during tests. |
| 43 void UpdateOnIOForTesting() { | 50 void UpdateOnIOForTesting() { |
| 44 scoped_ptr<base::ListValue> block(new base::ListValue); | 51 scoped_ptr<base::ListValue> block(new base::ListValue); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 63 | 70 |
| 64 private: | 71 private: |
| 65 int update_called_; | 72 int update_called_; |
| 66 bool set_blacklist_called_; | 73 bool set_blacklist_called_; |
| 67 | 74 |
| 68 DISALLOW_COPY_AND_ASSIGN(TestingURLBlacklistManager); | 75 DISALLOW_COPY_AND_ASSIGN(TestingURLBlacklistManager); |
| 69 }; | 76 }; |
| 70 | 77 |
| 71 class URLBlacklistManagerTest : public testing::Test { | 78 class URLBlacklistManagerTest : public testing::Test { |
| 72 protected: | 79 protected: |
| 73 URLBlacklistManagerTest() | 80 URLBlacklistManagerTest() : loop_(base::MessageLoop::TYPE_IO) {} |
| 74 : loop_(base::MessageLoop::TYPE_IO), | |
| 75 ui_thread_(BrowserThread::UI, &loop_), | |
| 76 file_thread_(BrowserThread::FILE, &loop_), | |
| 77 io_thread_(BrowserThread::IO, &loop_) { | |
| 78 } | |
| 79 | 81 |
| 80 virtual void SetUp() OVERRIDE { | 82 virtual void SetUp() OVERRIDE { |
| 81 pref_service_.registry()->RegisterListPref(prefs::kUrlBlacklist); | 83 pref_service_.registry()->RegisterListPref(policy_prefs::kUrlBlacklist); |
| 82 pref_service_.registry()->RegisterListPref(prefs::kUrlWhitelist); | 84 pref_service_.registry()->RegisterListPref(policy_prefs::kUrlWhitelist); |
| 83 blacklist_manager_.reset( | 85 blacklist_manager_.reset(new TestingURLBlacklistManager(&pref_service_)); |
| 84 new TestingURLBlacklistManager(&pref_service_)); | |
| 85 loop_.RunUntilIdle(); | 86 loop_.RunUntilIdle(); |
| 86 } | 87 } |
| 87 | 88 |
| 88 virtual void TearDown() OVERRIDE { | 89 virtual void TearDown() OVERRIDE { |
| 89 if (blacklist_manager_.get()) | 90 if (blacklist_manager_.get()) |
| 90 blacklist_manager_->ShutdownOnUIThread(); | 91 blacklist_manager_->ShutdownOnUIThread(); |
| 91 loop_.RunUntilIdle(); | 92 loop_.RunUntilIdle(); |
| 92 // Delete |blacklist_manager_| while |io_thread_| is mapping IO to | 93 // Delete |blacklist_manager_| while |io_thread_| is mapping IO to |
| 93 // |loop_|. | 94 // |loop_|. |
| 94 blacklist_manager_.reset(); | 95 blacklist_manager_.reset(); |
| 95 } | 96 } |
| 96 | 97 |
| 97 base::MessageLoop loop_; | 98 base::MessageLoop loop_; |
| 98 TestingPrefServiceSimple pref_service_; | 99 TestingPrefServiceSimple pref_service_; |
| 99 scoped_ptr<TestingURLBlacklistManager> blacklist_manager_; | 100 scoped_ptr<TestingURLBlacklistManager> blacklist_manager_; |
| 100 | |
| 101 private: | |
| 102 content::TestBrowserThread ui_thread_; | |
| 103 content::TestBrowserThread file_thread_; | |
| 104 content::TestBrowserThread io_thread_; | |
| 105 | |
| 106 DISALLOW_COPY_AND_ASSIGN(URLBlacklistManagerTest); | |
| 107 }; | 101 }; |
| 108 | 102 |
| 109 // Parameters for the FilterToComponents test. | 103 // Parameters for the FilterToComponents test. |
| 110 struct FilterTestParams { | 104 struct FilterTestParams { |
| 111 public: | 105 public: |
| 112 FilterTestParams(const std::string& filter, const std::string& scheme, | 106 FilterTestParams(const std::string& filter, const std::string& scheme, |
| 113 const std::string& host, bool match_subdomains, uint16 port, | 107 const std::string& host, bool match_subdomains, uint16 port, |
| 114 const std::string& path) | 108 const std::string& path) |
| 115 : filter_(filter), scheme_(scheme), host_(host), | 109 : filter_(filter), scheme_(scheme), host_(host), |
| 116 match_subdomains_(match_subdomains), port_(port), path_(path) {} | 110 match_subdomains_(match_subdomains), port_(port), path_(path) {} |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 164 | 158 |
| 165 } // namespace | 159 } // namespace |
| 166 | 160 |
| 167 TEST_P(URLBlacklistFilterToComponentsTest, FilterToComponents) { | 161 TEST_P(URLBlacklistFilterToComponentsTest, FilterToComponents) { |
| 168 std::string scheme; | 162 std::string scheme; |
| 169 std::string host; | 163 std::string host; |
| 170 bool match_subdomains = true; | 164 bool match_subdomains = true; |
| 171 uint16 port = 42; | 165 uint16 port = 42; |
| 172 std::string path; | 166 std::string path; |
| 173 | 167 |
| 174 URLBlacklist::FilterToComponents(GetParam().filter(), &scheme, &host, | 168 URLBlacklist::FilterToComponents(GetSegmentURLCallback(), GetParam().filter(), |
| 175 &match_subdomains, &port, &path); | 169 &scheme, &host, &match_subdomains, &port, |
| 170 &path); |
| 176 EXPECT_EQ(GetParam().scheme(), scheme); | 171 EXPECT_EQ(GetParam().scheme(), scheme); |
| 177 EXPECT_EQ(GetParam().host(), host); | 172 EXPECT_EQ(GetParam().host(), host); |
| 178 EXPECT_EQ(GetParam().match_subdomains(), match_subdomains); | 173 EXPECT_EQ(GetParam().match_subdomains(), match_subdomains); |
| 179 EXPECT_EQ(GetParam().port(), port); | 174 EXPECT_EQ(GetParam().port(), port); |
| 180 EXPECT_EQ(GetParam().path(), path); | 175 EXPECT_EQ(GetParam().path(), path); |
| 181 } | 176 } |
| 182 | 177 |
| 183 TEST_F(URLBlacklistManagerTest, SingleUpdateForTwoPrefChanges) { | 178 TEST_F(URLBlacklistManagerTest, SingleUpdateForTwoPrefChanges) { |
| 184 ListValue* blacklist = new ListValue; | 179 ListValue* blacklist = new ListValue; |
| 185 blacklist->Append(new StringValue("*.google.com")); | 180 blacklist->Append(new StringValue("*.google.com")); |
| 186 ListValue* whitelist = new ListValue; | 181 ListValue* whitelist = new ListValue; |
| 187 whitelist->Append(new StringValue("mail.google.com")); | 182 whitelist->Append(new StringValue("mail.google.com")); |
| 188 pref_service_.SetManagedPref(prefs::kUrlBlacklist, blacklist); | 183 pref_service_.SetManagedPref(policy_prefs::kUrlBlacklist, blacklist); |
| 189 pref_service_.SetManagedPref(prefs::kUrlBlacklist, whitelist); | 184 pref_service_.SetManagedPref(policy_prefs::kUrlBlacklist, whitelist); |
| 190 loop_.RunUntilIdle(); | 185 loop_.RunUntilIdle(); |
| 191 | 186 |
| 192 EXPECT_EQ(1, blacklist_manager_->update_called()); | 187 EXPECT_EQ(1, blacklist_manager_->update_called()); |
| 193 } | 188 } |
| 194 | 189 |
| 195 TEST_F(URLBlacklistManagerTest, ShutdownWithPendingTask0) { | 190 TEST_F(URLBlacklistManagerTest, ShutdownWithPendingTask0) { |
| 196 // Post an update task to the UI thread. | 191 // Post an update task to the UI thread. |
| 197 blacklist_manager_->ScheduleUpdate(); | 192 blacklist_manager_->ScheduleUpdate(); |
| 198 // Shutdown comes before the task is executed. | 193 // Shutdown comes before the task is executed. |
| 199 blacklist_manager_->ShutdownOnUIThread(); | 194 blacklist_manager_->ShutdownOnUIThread(); |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 303 0u, | 298 0u, |
| 304 std::string()), | 299 std::string()), |
| 305 FilterTestParams("http://*/whatever", | 300 FilterTestParams("http://*/whatever", |
| 306 "http", | 301 "http", |
| 307 std::string(), | 302 std::string(), |
| 308 true, | 303 true, |
| 309 0u, | 304 0u, |
| 310 "/whatever"))); | 305 "/whatever"))); |
| 311 | 306 |
| 312 TEST_F(URLBlacklistManagerTest, Filtering) { | 307 TEST_F(URLBlacklistManagerTest, Filtering) { |
| 313 URLBlacklist blacklist; | 308 URLBlacklist blacklist(GetSegmentURLCallback()); |
| 314 | 309 |
| 315 // Block domain and all subdomains, for any filtered scheme. | 310 // Block domain and all subdomains, for any filtered scheme. |
| 316 scoped_ptr<base::ListValue> blocked(new base::ListValue); | 311 scoped_ptr<base::ListValue> blocked(new base::ListValue); |
| 317 blocked->Append(new base::StringValue("google.com")); | 312 blocked->Append(new base::StringValue("google.com")); |
| 318 blacklist.Block(blocked.get()); | 313 blacklist.Block(blocked.get()); |
| 319 EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://google.com"))); | 314 EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://google.com"))); |
| 320 EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://google.com/"))); | 315 EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://google.com/"))); |
| 321 EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://google.com/whatever"))); | 316 EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://google.com/whatever"))); |
| 322 EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://google.com/"))); | 317 EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://google.com/"))); |
| 323 EXPECT_FALSE(blacklist.IsURLBlocked(GURL("bogus://google.com/"))); | 318 EXPECT_FALSE(blacklist.IsURLBlocked(GURL("bogus://google.com/"))); |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 456 blocked.reset(new base::ListValue); | 451 blocked.reset(new base::ListValue); |
| 457 blocked->Append(new base::StringValue("example.com")); | 452 blocked->Append(new base::StringValue("example.com")); |
| 458 blacklist.Block(blocked.get()); | 453 blacklist.Block(blocked.get()); |
| 459 allowed.reset(new base::ListValue); | 454 allowed.reset(new base::ListValue); |
| 460 allowed->Append(new base::StringValue("example.com")); | 455 allowed->Append(new base::StringValue("example.com")); |
| 461 blacklist.Allow(allowed.get()); | 456 blacklist.Allow(allowed.get()); |
| 462 EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://example.com"))); | 457 EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://example.com"))); |
| 463 } | 458 } |
| 464 | 459 |
| 465 TEST_F(URLBlacklistManagerTest, BlockAllWithExceptions) { | 460 TEST_F(URLBlacklistManagerTest, BlockAllWithExceptions) { |
| 466 URLBlacklist blacklist; | 461 URLBlacklist blacklist(GetSegmentURLCallback()); |
| 467 | 462 |
| 468 scoped_ptr<base::ListValue> blocked(new base::ListValue); | 463 scoped_ptr<base::ListValue> blocked(new base::ListValue); |
| 469 scoped_ptr<base::ListValue> allowed(new base::ListValue); | 464 scoped_ptr<base::ListValue> allowed(new base::ListValue); |
| 470 blocked->Append(new base::StringValue("*")); | 465 blocked->Append(new base::StringValue("*")); |
| 471 allowed->Append(new base::StringValue(".www.google.com")); | 466 allowed->Append(new base::StringValue(".www.google.com")); |
| 472 allowed->Append(new base::StringValue("plus.google.com")); | 467 allowed->Append(new base::StringValue("plus.google.com")); |
| 473 allowed->Append(new base::StringValue("https://mail.google.com")); | 468 allowed->Append(new base::StringValue("https://mail.google.com")); |
| 474 allowed->Append(new base::StringValue("https://very.safe/path")); | 469 allowed->Append(new base::StringValue("https://very.safe/path")); |
| 475 blacklist.Block(blocked.get()); | 470 blacklist.Block(blocked.get()); |
| 476 blacklist.Allow(allowed.get()); | 471 blacklist.Allow(allowed.get()); |
| 477 EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://random.com"))); | 472 EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://random.com"))); |
| 478 EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://google.com"))); | 473 EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://google.com"))); |
| 479 EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://s.www.google.com"))); | 474 EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://s.www.google.com"))); |
| 480 EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://www.google.com"))); | 475 EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://www.google.com"))); |
| 481 EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://plus.google.com"))); | 476 EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://plus.google.com"))); |
| 482 EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://s.plus.google.com"))); | 477 EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://s.plus.google.com"))); |
| 483 EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://mail.google.com"))); | 478 EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://mail.google.com"))); |
| 484 EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://mail.google.com"))); | 479 EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://mail.google.com"))); |
| 485 EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://s.mail.google.com"))); | 480 EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://s.mail.google.com"))); |
| 486 EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://very.safe/"))); | 481 EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://very.safe/"))); |
| 487 EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://very.safe/path"))); | 482 EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://very.safe/path"))); |
| 488 EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://very.safe/path"))); | 483 EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://very.safe/path"))); |
| 489 } | 484 } |
| 490 | 485 |
| 491 TEST_F(URLBlacklistManagerTest, DontBlockResources) { | 486 TEST_F(URLBlacklistManagerTest, DontBlockResources) { |
| 492 scoped_ptr<URLBlacklist> blacklist(new URLBlacklist()); | 487 scoped_ptr<URLBlacklist> blacklist(new URLBlacklist(GetSegmentURLCallback())); |
| 493 scoped_ptr<base::ListValue> blocked(new base::ListValue); | 488 scoped_ptr<base::ListValue> blocked(new base::ListValue); |
| 494 blocked->Append(new base::StringValue("google.com")); | 489 blocked->Append(new base::StringValue("google.com")); |
| 495 blacklist->Block(blocked.get()); | 490 blacklist->Block(blocked.get()); |
| 496 blacklist_manager_->SetBlacklist(blacklist.Pass()); | 491 blacklist_manager_->SetBlacklist(blacklist.Pass()); |
| 497 EXPECT_TRUE(blacklist_manager_->IsURLBlocked(GURL("http://google.com"))); | 492 EXPECT_TRUE(blacklist_manager_->IsURLBlocked(GURL("http://google.com"))); |
| 498 | 493 |
| 499 net::TestURLRequestContext context; | 494 net::TestURLRequestContext context; |
| 500 net::URLRequest request( | 495 net::URLRequest request( |
| 501 GURL("http://google.com"), net::DEFAULT_PRIORITY, NULL, &context); | 496 GURL("http://google.com"), net::DEFAULT_PRIORITY, NULL, &context); |
| 502 | 497 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 517 | 512 |
| 518 GURL sync_url(GaiaUrls::GetInstance()->service_login_url().Resolve( | 513 GURL sync_url(GaiaUrls::GetInstance()->service_login_url().Resolve( |
| 519 "?service=chromiumsync")); | 514 "?service=chromiumsync")); |
| 520 net::URLRequest sync_request(sync_url, net::DEFAULT_PRIORITY, NULL, &context); | 515 net::URLRequest sync_request(sync_url, net::DEFAULT_PRIORITY, NULL, &context); |
| 521 sync_request.SetLoadFlags(net::LOAD_MAIN_FRAME); | 516 sync_request.SetLoadFlags(net::LOAD_MAIN_FRAME); |
| 522 EXPECT_EQ(block_signin_urls, | 517 EXPECT_EQ(block_signin_urls, |
| 523 blacklist_manager_->IsRequestBlocked(sync_request)); | 518 blacklist_manager_->IsRequestBlocked(sync_request)); |
| 524 } | 519 } |
| 525 | 520 |
| 526 } // namespace policy | 521 } // namespace policy |
| OLD | NEW |