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

Unified Diff: chrome/browser/supervised_user/supervised_user_service_unittest.cc

Issue 875423002: Don't notify existing observers in SupervisedUserWhitelistService::AddSiteListsChangedCallback(). (Closed) Base URL: https://chromium.googlesource.com/chromium/src@master
Patch Set: typo Created 5 years, 11 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 | « no previous file | chrome/browser/supervised_user/supervised_user_url_filter.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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,
« no previous file with comments | « no previous file | chrome/browser/supervised_user/supervised_user_url_filter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698