Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6405)

Unified Diff: chrome/browser/policy/url_blacklist_manager_unittest.cc

Issue 7716003: WIP: URL blacklisting by policy. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Reviewed Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/policy/url_blacklist_manager.cc ('k') | chrome/browser/prefs/browser_prefs.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/policy/url_blacklist_manager_unittest.cc
diff --git a/chrome/browser/policy/url_blacklist_manager_unittest.cc b/chrome/browser/policy/url_blacklist_manager_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..b1201dfe56017aef51ae7549eb26924d2ffc6716
--- /dev/null
+++ b/chrome/browser/policy/url_blacklist_manager_unittest.cc
@@ -0,0 +1,382 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/policy/url_blacklist_manager.h"
+
+#include "base/basictypes.h"
+#include "base/message_loop.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/test/base/testing_pref_service.h"
+#include "chrome/test/base/testing_profile.h"
+#include "content/browser/browser_thread.h"
+#include "content/common/notification_service.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace policy {
+
+namespace {
+
+using ::testing::_;
+using ::testing::Invoke;
+using ::testing::Mock;
+
+class TestingURLBlacklistManager : public URLBlacklistManager {
+ public:
+ explicit TestingURLBlacklistManager(Profile* profile)
+ : URLBlacklistManager(profile) {
+ }
+
+ virtual ~TestingURLBlacklistManager() {
+ }
+
+ // Make this method public for testing.
+ using URLBlacklistManager::ScheduleUpdate;
+
+ virtual void PostUpdateTask(Task* task) OVERRIDE {
+ // Post tasks without a delay during tests.
+ MessageLoop::current()->PostTask(FROM_HERE, task);
+ }
+
+ MOCK_METHOD0(Update, void());
+ MOCK_METHOD1(SetBlacklist, void(Blacklist*));
+
+ void UpdateNotMocked() {
+ URLBlacklistManager::Update();
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(TestingURLBlacklistManager);
+};
+
+class URLBlacklistManagerTest : public testing::Test {
+ protected:
+ URLBlacklistManagerTest()
+ : ui_thread_(BrowserThread::UI, &loop_),
+ file_thread_(BrowserThread::FILE, &loop_),
+ io_thread_(BrowserThread::IO, &loop_) {
+ }
+
+ virtual void SetUp() OVERRIDE {
+ pref_service_ = profile_.GetTestingPrefService();
+ url_blacklist_manager_.reset(new TestingURLBlacklistManager(&profile_));
+ url_blacklist_manager_->InitializeOnIOThread();
+ loop_.RunAllPending();
+ }
+
+ virtual void TearDown() OVERRIDE {
+ if (url_blacklist_manager_.get())
+ url_blacklist_manager_->ShutdownOnUIThread();
+ loop_.RunAllPending();
+ }
+
+ void ExpectUpdate() {
+ EXPECT_CALL(*url_blacklist_manager_, Update())
+ .WillOnce(Invoke(url_blacklist_manager_.get(),
+ &TestingURLBlacklistManager::UpdateNotMocked));
+ }
+
+ MessageLoop loop_;
+ TestingProfile profile_;
+ TestingPrefService* pref_service_;
+ scoped_ptr<TestingURLBlacklistManager> url_blacklist_manager_;
+
+ private:
+ BrowserThread ui_thread_;
+ BrowserThread file_thread_;
+ BrowserThread io_thread_;
+
+ DISALLOW_COPY_AND_ASSIGN(URLBlacklistManagerTest);
+};
+
+TEST_F(URLBlacklistManagerTest, SingleUpdateForTwoPrefChanges) {
+ ExpectUpdate();
+
+ ListValue* blacklist = new ListValue;
+ blacklist->Append(new StringValue("*.google.com"));
+ ListValue* whitelist = new ListValue;
+ whitelist->Append(new StringValue("mail.google.com"));
+ pref_service_->SetManagedPref(prefs::kUrlBlacklist, blacklist);
+ pref_service_->SetManagedPref(prefs::kUrlBlacklist, whitelist);
+ loop_.RunAllPending();
+
+ Mock::VerifyAndClearExpectations(url_blacklist_manager_.get());
+}
+
+TEST_F(URLBlacklistManagerTest, ShutdownWithPendingTask0) {
+ // Post an update task to the UI thread.
+ url_blacklist_manager_->ScheduleUpdate();
+ // Shutdown comes before the task is executed.
+ url_blacklist_manager_->ShutdownOnUIThread();
+ url_blacklist_manager_.reset();
+ // Run the task after shutdown and deletion.
+ loop_.RunAllPending();
+}
+
+TEST_F(URLBlacklistManagerTest, ShutdownWithPendingTask1) {
+ EXPECT_CALL(*url_blacklist_manager_, Update()).Times(0);
+ // Post an update task.
+ url_blacklist_manager_->ScheduleUpdate();
+ // Shutdown comes before the task is executed.
+ url_blacklist_manager_->ShutdownOnUIThread();
+ // Run the task after shutdown, but before deletion.
+ loop_.RunAllPending();
+ Mock::VerifyAndClearExpectations(url_blacklist_manager_.get());
+ url_blacklist_manager_.reset();
+ loop_.RunAllPending();
+}
+
+TEST_F(URLBlacklistManagerTest, ShutdownWithPendingTask2) {
+ // Update posts a BuildBlacklistTask to the FILE thread.
+ url_blacklist_manager_->UpdateNotMocked();
+ // Shutdown comes before the task is executed.
+ url_blacklist_manager_->ShutdownOnUIThread();
+ url_blacklist_manager_.reset();
+ // Run the task after shutdown and deletion.
+ loop_.RunAllPending();
+}
+
+TEST_F(URLBlacklistManagerTest, ShutdownWithPendingTask3) {
+ EXPECT_CALL(*url_blacklist_manager_, SetBlacklist(_)).Times(0);
+ // Update posts a BuildBlacklistTask to the FILE thread.
+ url_blacklist_manager_->UpdateNotMocked();
+ // Shutdown comes before the task is executed.
+ url_blacklist_manager_->ShutdownOnUIThread();
+ // Run the task after shutdown, but before deletion.
+ loop_.RunAllPending();
+ Mock::VerifyAndClearExpectations(url_blacklist_manager_.get());
+ url_blacklist_manager_.reset();
+ loop_.RunAllPending();
+}
+
+TEST_F(URLBlacklistManagerTest, SchemeToFlag) {
+ Blacklist::SchemeFlag flag;
+ EXPECT_TRUE(Blacklist::SchemeToFlag("http", &flag));
+ EXPECT_EQ(Blacklist::SCHEME_HTTP, flag);
+ EXPECT_TRUE(Blacklist::SchemeToFlag("https", &flag));
+ EXPECT_EQ(Blacklist::SCHEME_HTTPS, flag);
+ EXPECT_TRUE(Blacklist::SchemeToFlag("ftp", &flag));
+ EXPECT_EQ(Blacklist::SCHEME_FTP, flag);
+ EXPECT_TRUE(Blacklist::SchemeToFlag("", &flag));
+ EXPECT_EQ(Blacklist::SCHEME_ALL, flag);
+ EXPECT_FALSE(Blacklist::SchemeToFlag("wtf", &flag));
+}
+
+TEST_F(URLBlacklistManagerTest, FilterToComponents) {
+ std::string scheme;
+ std::string host;
+ uint16 port;
+ std::string path;
+
+ Blacklist::FilterToComponents("google.com", &scheme, &host, &port, &path);
+ EXPECT_EQ("", scheme);
+ EXPECT_EQ("google.com", host);
+ EXPECT_EQ(0u, port);
+ EXPECT_EQ("", path);
+
+ Blacklist::FilterToComponents(
+ "http://google.com", &scheme, &host, &port, &path);
+ EXPECT_EQ("http", scheme);
+ EXPECT_EQ("google.com", host);
+ EXPECT_EQ(0u, port);
+ EXPECT_EQ("", path);
+
+ Blacklist::FilterToComponents("google.com/", &scheme, &host, &port, &path);
+ EXPECT_EQ("", scheme);
+ EXPECT_EQ("google.com", host);
+ EXPECT_EQ(0u, port);
+ EXPECT_EQ("/", path);
+
+ Blacklist::FilterToComponents(
+ "http://google.com:8080/whatever", &scheme, &host, &port, &path);
+ EXPECT_EQ("http", scheme);
+ EXPECT_EQ("google.com", host);
+ EXPECT_EQ(8080u, port);
+ EXPECT_EQ("/whatever", path);
+
+ Blacklist::FilterToComponents(
+ "http://user:pass@google.com:8080/whatever",
+ &scheme, &host, &port, &path);
+ EXPECT_EQ("http", scheme);
+ EXPECT_EQ("google.com", host);
+ EXPECT_EQ(8080u, port);
+ EXPECT_EQ("/whatever", path);
+
+ Blacklist::FilterToComponents(
+ "123.123.123.123", &scheme, &host, &port, &path);
+ EXPECT_EQ("", scheme);
+ EXPECT_EQ("123.123.123.123", host);
+ EXPECT_EQ(0u, port);
+ EXPECT_EQ("", path);
+
+ Blacklist::FilterToComponents(
+ "https://123.123.123.123", &scheme, &host, &port, &path);
+ EXPECT_EQ("https", scheme);
+ EXPECT_EQ("123.123.123.123", host);
+ EXPECT_EQ(0u, port);
+ EXPECT_EQ("", path);
+
+ Blacklist::FilterToComponents(
+ "123.123.123.123/", &scheme, &host, &port, &path);
+ EXPECT_EQ("", scheme);
+ EXPECT_EQ("123.123.123.123", host);
+ EXPECT_EQ(0u, port);
+ EXPECT_EQ("/", path);
+
+ Blacklist::FilterToComponents(
+ "http://123.123.123.123:123/whatever", &scheme, &host, &port, &path);
+ EXPECT_EQ("http", scheme);
+ EXPECT_EQ("123.123.123.123", host);
+ EXPECT_EQ(123u, port);
+ EXPECT_EQ("/whatever", path);
+
+ Blacklist::FilterToComponents("*", &scheme, &host, &port, &path);
+ EXPECT_EQ("", scheme);
+ EXPECT_EQ("", host);
+ EXPECT_EQ(0u, port);
+ EXPECT_EQ("", path);
+
+ Blacklist::FilterToComponents("ftp://*", &scheme, &host, &port, &path);
+ EXPECT_EQ("ftp", scheme);
+ EXPECT_EQ("", host);
+ EXPECT_EQ(0u, port);
+ EXPECT_EQ("", path);
+
+ Blacklist::FilterToComponents(
+ "http://*/whatever", &scheme, &host, &port, &path);
+ EXPECT_EQ("http", scheme);
+ EXPECT_EQ("", host);
+ EXPECT_EQ(0u, port);
+ EXPECT_EQ("/whatever", path);
+}
+
+TEST_F(URLBlacklistManagerTest, Filtering) {
+ Blacklist blacklist;
+
+ // Block domain and all subdomains, for any filtered scheme.
+ blacklist.Block("google.com");
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://google.com")));
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://google.com/")));
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://google.com/whatever")));
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://google.com/")));
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("bogus://google.com/")));
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://mail.google.com")));
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://x.mail.google.com")));
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://x.mail.google.com/")));
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://x.y.google.com/a/b")));
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://youtube.com/")));
+
+ // Filter only http and ftp schemes.
+ blacklist.Block("http://secure.com");
+ blacklist.Block("ftp://secure.com");
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://secure.com")));
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://secure.com/whatever")));
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("ftp://secure.com/")));
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://secure.com/")));
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://www.secure.com")));
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://www.secure.com")));
+
+ // Filter only a certain path prefix.
+ blacklist.Block("path.to/ruin");
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://path.to/ruin")));
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://path.to/ruin")));
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://path.to/ruins")));
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://path.to/ruin/signup")));
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://www.path.to/ruin")));
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://path.to/fortune")));
+
+ // Filter only a certain path prefix and scheme.
+ blacklist.Block("https://s.aaa.com/path");
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://s.aaa.com/path")));
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://s.aaa.com/path/bbb")));
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://s.aaa.com/path")));
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://aaa.com/path")));
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://x.aaa.com/path")));
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://s.aaa.com/bbb")));
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://s.aaa.com/")));
+
+ // Test exceptions to path prefixes, and most specific matches.
+ blacklist.Block("s.xxx.com/a");
+ blacklist.Allow("s.xxx.com/a/b");
+ blacklist.Block("https://s.xxx.com/a/b/c");
+ blacklist.Allow("https://s.xxx.com/a/b/c/d");
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://s.xxx.com/a")));
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://s.xxx.com/a/x")));
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://s.xxx.com/a/x")));
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://s.xxx.com/a/b")));
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://s.xxx.com/a/b")));
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://s.xxx.com/a/b/x")));
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://s.xxx.com/a/b/c")));
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://s.xxx.com/a/b/c")));
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://s.xxx.com/a/b/c/x")));
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://s.xxx.com/a/b/c/d")));
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://s.xxx.com/a/b/c/d")));
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://s.xxx.com/a/b/c/d/x")));
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://s.xxx.com/a/b/c/d/x")));
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://xxx.com/a")));
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://xxx.com/a/b")));
+
+ // Block an ip address.
+ blacklist.Block("123.123.123.123");
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://123.123.123.123/")));
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://123.123.123.124/")));
+
+ // Open an exception.
+ blacklist.Allow("plus.google.com");
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://google.com/")));
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://www.google.com/")));
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://plus.google.com/")));
+
+ // Open an exception only when using https for mail.
+ blacklist.Allow("https://mail.google.com");
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://google.com/")));
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://mail.google.com/")));
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://www.google.com/")));
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://www.google.com/")));
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://mail.google.com/")));
+
+ // Match exactly "google.com", only for http. Subdomains without exceptions
+ // are still blocked.
+ blacklist.Allow("http://.google.com");
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://google.com/")));
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://google.com/")));
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://www.google.com/")));
+
+ // A smaller path match in an exact host overrides a longer path for hosts
+ // that also match subdomains.
+ blacklist.Block("yyy.com/aaa");
+ blacklist.Allow(".yyy.com/a");
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://yyy.com")));
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://yyy.com/aaa")));
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://yyy.com/aaa2")));
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://www.yyy.com")));
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://www.yyy.com/aaa")));
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://www.yyy.com/aaa2")));
+}
+
+TEST_F(URLBlacklistManagerTest, BlockAllWithExceptions) {
+ Blacklist blacklist;
+
+ blacklist.Block("*");
+ blacklist.Allow(".www.google.com");
+ blacklist.Allow("plus.google.com");
+ blacklist.Allow("https://mail.google.com");
+ blacklist.Allow("https://very.safe/path");
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://random.com")));
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://google.com")));
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://s.www.google.com")));
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://www.google.com")));
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://plus.google.com")));
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("http://s.plus.google.com")));
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://mail.google.com")));
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://mail.google.com")));
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://s.mail.google.com")));
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("https://very.safe/")));
+ EXPECT_TRUE(blacklist.IsURLBlocked(GURL("http://very.safe/path")));
+ EXPECT_FALSE(blacklist.IsURLBlocked(GURL("https://very.safe/path")));
+}
+
+} // namespace
+
+} // namespace policy
« no previous file with comments | « chrome/browser/policy/url_blacklist_manager.cc ('k') | chrome/browser/prefs/browser_prefs.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698