| Index: chrome/browser/supervised_user/supervised_user_service_unittest.cc
|
| diff --git a/chrome/browser/supervised_user/supervised_user_service_unittest.cc b/chrome/browser/supervised_user/supervised_user_service_unittest.cc
|
| index b5b5aa93d10326c5b2aba8be0f84522e481d7a17..6730401c2131ae676f6f6692bfd7d7194a4f99cd 100644
|
| --- a/chrome/browser/supervised_user/supervised_user_service_unittest.cc
|
| +++ b/chrome/browser/supervised_user/supervised_user_service_unittest.cc
|
| @@ -46,34 +46,108 @@ void OnProfileDownloadedFail(const base::string16& full_name) {
|
| ASSERT_TRUE(false) << "Profile download should not have succeeded.";
|
| }
|
|
|
| -class SupervisedUserURLFilterObserver :
|
| - public SupervisedUserURLFilter::Observer {
|
| +// Base class for helper objects that wait for certain events to happen.
|
| +// This class will ensure that calls to QuitRunLoop() (triggered by a subclass)
|
| +// are balanced with Wait() calls.
|
| +class AsyncTestHelper {
|
| public:
|
| - explicit SupervisedUserURLFilterObserver(SupervisedUserURLFilter* url_filter)
|
| - : url_filter_(url_filter) {
|
| + void Wait() {
|
| + run_loop_->Run();
|
| Reset();
|
| - url_filter_->AddObserver(this);
|
| }
|
|
|
| - ~SupervisedUserURLFilterObserver() {
|
| - url_filter_->RemoveObserver(this);
|
| + protected:
|
| + AsyncTestHelper() {
|
| + // |quit_called_| will be initialized in Reset().
|
| + Reset();
|
| }
|
|
|
| - void Wait() {
|
| - message_loop_runner_->Run();
|
| - Reset();
|
| + ~AsyncTestHelper() {
|
| + EXPECT_FALSE(quit_called_);
|
| }
|
|
|
| - // SupervisedUserURLFilter::Observer
|
| - void OnSiteListUpdated() override { message_loop_runner_->Quit(); }
|
| + void QuitRunLoop() {
|
| + // QuitRunLoop() can not be called more than once between calls to Wait().
|
| + ASSERT_FALSE(quit_called_);
|
| + quit_called_ = true;
|
| + run_loop_->Quit();
|
| + }
|
|
|
| private:
|
| void Reset() {
|
| - message_loop_runner_ = new MessageLoopRunner;
|
| + quit_called_ = false;
|
| + run_loop_.reset(new base::RunLoop);
|
| + }
|
| +
|
| + scoped_ptr<base::RunLoop> run_loop_;
|
| + bool quit_called_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(AsyncTestHelper);
|
| +};
|
| +
|
| +class SupervisedUserURLFilterObserver
|
| + : public AsyncTestHelper,
|
| + public SupervisedUserURLFilter::Observer {
|
| + public:
|
| + SupervisedUserURLFilterObserver() : scoped_observer_(this) {}
|
| + ~SupervisedUserURLFilterObserver() {}
|
| +
|
| + void Init(SupervisedUserURLFilter* url_filter) {
|
| + scoped_observer_.Add(url_filter);
|
| + }
|
| +
|
| + // SupervisedUserURLFilter::Observer
|
| + void OnSiteListUpdated() override {
|
| + QuitRunLoop();
|
| + }
|
| +
|
| + private:
|
| + ScopedObserver<SupervisedUserURLFilter, SupervisedUserURLFilter::Observer>
|
| + scoped_observer_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(SupervisedUserURLFilterObserver);
|
| +};
|
| +
|
| +class SiteListObserver : public AsyncTestHelper {
|
| + public:
|
| + SiteListObserver() {}
|
| + ~SiteListObserver() {}
|
| +
|
| + void Init(SupervisedUserWhitelistService* service) {
|
| + service->AddSiteListsChangedCallback(base::Bind(
|
| + &SiteListObserver::OnSiteListsChanged, base::Unretained(this)));
|
| +
|
| + // The initial call to AddSiteListsChangedCallback will call
|
| + // OnSiteListsChanged(), so we balance it out by calling Wait().
|
| + Wait();
|
| + }
|
| +
|
| + const std::vector<scoped_refptr<SupervisedUserSiteList>>& site_lists() {
|
| + return site_lists_;
|
| + }
|
| +
|
| + const std::vector<SupervisedUserSiteList::Site>& sites() {
|
| + return sites_;
|
| + }
|
| +
|
| + private:
|
| + void OnSiteListsChanged(
|
| + const std::vector<scoped_refptr<SupervisedUserSiteList>>& site_lists) {
|
| + site_lists_ = site_lists;
|
| + sites_.clear();
|
| + for (const scoped_refptr<SupervisedUserSiteList>& site_list : site_lists) {
|
| + const std::vector<SupervisedUserSiteList::Site>& sites =
|
| + site_list->sites();
|
| + sites_.insert(sites_.end(), sites.begin(), sites.end());
|
| + }
|
| +
|
| + QuitRunLoop();
|
| }
|
|
|
| - SupervisedUserURLFilter* url_filter_;
|
| - scoped_refptr<MessageLoopRunner> message_loop_runner_;
|
| + std::vector<scoped_refptr<SupervisedUserSiteList>> site_lists_;
|
| + std::vector<SupervisedUserSiteList::Site> sites_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(SiteListObserver);
|
| };
|
|
|
| class AsyncResultHolder {
|
| @@ -291,9 +365,20 @@ class SupervisedUserServiceExtensionTestBase
|
| SupervisedUserService* service =
|
| SupervisedUserServiceFactory::GetForProfile(profile_.get());
|
| service->Init();
|
| - service->GetWhitelistService()->AddSiteListsChangedCallback(
|
| - base::Bind(&SupervisedUserServiceExtensionTestBase::OnSiteListsChanged,
|
| - base::Unretained(this)));
|
| + site_list_observer_.Init(service->GetWhitelistService());
|
| +
|
| + SupervisedUserURLFilter* url_filter = service->GetURLFilterForUIThread();
|
| + url_filter->SetBlockingTaskRunnerForTesting(
|
| + base::MessageLoopProxy::current());
|
| + url_filter_observer_.Init(url_filter);
|
| +
|
| + // Wait for the initial update to finish.
|
| + url_filter_observer_.Wait();
|
| + }
|
| +
|
| + void TearDown() override {
|
| + // Flush the message loop, to ensure all posted tasks run.
|
| + base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| protected:
|
| @@ -322,21 +407,10 @@ class SupervisedUserServiceExtensionTestBase
|
| return extension;
|
| }
|
|
|
| - void OnSiteListsChanged(
|
| - const std::vector<scoped_refptr<SupervisedUserSiteList> >& site_lists) {
|
| - site_lists_ = site_lists;
|
| - sites_.clear();
|
| - for (const scoped_refptr<SupervisedUserSiteList>& site_list : site_lists) {
|
| - const std::vector<SupervisedUserSiteList::Site>& sites =
|
| - site_list->sites();
|
| - sites_.insert(sites_.end(), sites.begin(), sites.end());
|
| - }
|
| - }
|
| -
|
| bool is_supervised_;
|
| extensions::ScopedCurrentChannel channel_;
|
| - std::vector<scoped_refptr<SupervisedUserSiteList> > site_lists_;
|
| - std::vector<SupervisedUserSiteList::Site> sites_;
|
| + SiteListObserver site_list_observer_;
|
| + SupervisedUserURLFilterObserver url_filter_observer_;
|
| };
|
|
|
| class SupervisedUserServiceExtensionTestUnsupervised
|
| @@ -374,11 +448,7 @@ TEST_F(SupervisedUserServiceExtensionTestUnsupervised,
|
| TEST_F(SupervisedUserServiceExtensionTest, ExtensionManagementPolicyProvider) {
|
| SupervisedUserService* supervised_user_service =
|
| SupervisedUserServiceFactory::GetForProfile(profile_.get());
|
| - SupervisedUserURLFilterObserver observer(
|
| - supervised_user_service->GetURLFilterForUIThread());
|
| ASSERT_TRUE(profile_->IsSupervised());
|
| - // Wait for the initial update to finish (otherwise we'll get leaks).
|
| - observer.Wait();
|
|
|
| // Check that a supervised user can install a theme.
|
| scoped_refptr<extensions::Extension> theme = MakeThemeExtension();
|
| @@ -424,10 +494,11 @@ TEST_F(SupervisedUserServiceExtensionTest, NoContentPacks) {
|
| SupervisedUserURLFilter* url_filter =
|
| supervised_user_service->GetURLFilterForUIThread();
|
|
|
| - GURL url("http://youtube.com");
|
| - // ASSERT_EQ instead of ASSERT_TRUE(site_lists_.empty()) so that the error
|
| + // ASSERT_EQ instead of ASSERT_TRUE([...].empty()) so that the error
|
| // message contains the size in case of failure.
|
| - ASSERT_EQ(0u, site_lists_.size());
|
| + ASSERT_EQ(0u, site_list_observer_.site_lists().size());
|
| +
|
| + GURL url("http://youtube.com");
|
| EXPECT_EQ(SupervisedUserURLFilter::ALLOW,
|
| url_filter->GetFilteringBehaviorForURL(url));
|
| }
|
| @@ -437,8 +508,6 @@ TEST_F(SupervisedUserServiceExtensionTest, InstallContentPacks) {
|
| SupervisedUserServiceFactory::GetForProfile(profile_.get());
|
| SupervisedUserURLFilter* url_filter =
|
| supervised_user_service->GetURLFilterForUIThread();
|
| - SupervisedUserURLFilterObserver observer(url_filter);
|
| - observer.Wait();
|
|
|
| GURL example_url("http://example.com");
|
| GURL moose_url("http://moose.org");
|
| @@ -465,14 +534,16 @@ TEST_F(SupervisedUserServiceExtensionTest, InstallContentPacks) {
|
| base::FilePath whitelist_path =
|
| test_data_dir.AppendASCII("whitelists/content_pack/site_list.json");
|
| whitelist_service->LoadWhitelistForTesting("aaaa", whitelist_path);
|
| - observer.Wait();
|
| + site_list_observer_.Wait();
|
|
|
| - ASSERT_EQ(1u, site_lists_.size());
|
| - ASSERT_EQ(3u, sites_.size());
|
| - EXPECT_EQ(base::ASCIIToUTF16("YouTube"), sites_[0].name);
|
| - EXPECT_EQ(base::ASCIIToUTF16("Homestar Runner"), sites_[1].name);
|
| - EXPECT_EQ(base::string16(), sites_[2].name);
|
| + ASSERT_EQ(1u, site_list_observer_.site_lists().size());
|
| + ASSERT_EQ(3u, site_list_observer_.sites().size());
|
| + EXPECT_EQ(base::ASCIIToUTF16("YouTube"), site_list_observer_.sites()[0].name);
|
| + EXPECT_EQ(base::ASCIIToUTF16("Homestar Runner"),
|
| + site_list_observer_.sites()[1].name);
|
| + EXPECT_EQ(base::string16(), site_list_observer_.sites()[2].name);
|
|
|
| + url_filter_observer_.Wait();
|
| EXPECT_EQ(SupervisedUserURLFilter::ALLOW,
|
| url_filter->GetFilteringBehaviorForURL(example_url));
|
| EXPECT_EQ(SupervisedUserURLFilter::WARN,
|
| @@ -482,20 +553,21 @@ TEST_F(SupervisedUserServiceExtensionTest, InstallContentPacks) {
|
| whitelist_path =
|
| test_data_dir.AppendASCII("whitelists/content_pack_2/site_list.json");
|
| whitelist_service->LoadWhitelistForTesting("bbbb", whitelist_path);
|
| - observer.Wait();
|
| + site_list_observer_.Wait();
|
|
|
| - ASSERT_EQ(2u, site_lists_.size());
|
| - ASSERT_EQ(4u, sites_.size());
|
| + ASSERT_EQ(2u, site_list_observer_.site_lists().size());
|
| + ASSERT_EQ(4u, site_list_observer_.sites().size());
|
|
|
| // The site lists might be returned in any order, so we put them into a set.
|
| std::set<std::string> site_names;
|
| - for (const SupervisedUserSiteList::Site& site : sites_)
|
| + for (const SupervisedUserSiteList::Site& site : site_list_observer_.sites())
|
| site_names.insert(base::UTF16ToUTF8(site.name));
|
| EXPECT_EQ(1u, site_names.count("YouTube"));
|
| EXPECT_EQ(1u, site_names.count("Homestar Runner"));
|
| EXPECT_EQ(1u, site_names.count(std::string()));
|
| EXPECT_EQ(1u, site_names.count("Moose"));
|
|
|
| + url_filter_observer_.Wait();
|
| EXPECT_EQ(SupervisedUserURLFilter::ALLOW,
|
| url_filter->GetFilteringBehaviorForURL(example_url));
|
| EXPECT_EQ(SupervisedUserURLFilter::ALLOW,
|
| @@ -503,12 +575,13 @@ TEST_F(SupervisedUserServiceExtensionTest, InstallContentPacks) {
|
|
|
| // Unload the first whitelist.
|
| whitelist_service->UnloadWhitelist("aaaa");
|
| - observer.Wait();
|
| + site_list_observer_.Wait();
|
|
|
| - ASSERT_EQ(1u, site_lists_.size());
|
| - ASSERT_EQ(1u, sites_.size());
|
| - EXPECT_EQ(base::ASCIIToUTF16("Moose"), sites_[0].name);
|
| + ASSERT_EQ(1u, site_list_observer_.site_lists().size());
|
| + ASSERT_EQ(1u, site_list_observer_.sites().size());
|
| + EXPECT_EQ(base::ASCIIToUTF16("Moose"), site_list_observer_.sites()[0].name);
|
|
|
| + url_filter_observer_.Wait();
|
| EXPECT_EQ(SupervisedUserURLFilter::WARN,
|
| url_filter->GetFilteringBehaviorForURL(example_url));
|
| EXPECT_EQ(SupervisedUserURLFilter::ALLOW,
|
|
|