// Copyright (c) 2013 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/profile_resetter/profile_resetter.h" #include "base/bind.h" #include "base/prefs/pref_service.h" #include "chrome/browser/prefs/session_startup_pref.h" #include "chrome/browser/search_engines/template_url_service_test_util.h" #include "chrome/common/pref_names.h" #include "chrome/test/base/testing_profile.h" #include "content/public/test/test_utils.h" #include "testing/gmock/include/gmock/gmock.h" namespace { class MockObject { public: void RunLoop() { EXPECT_CALL(*this, Callback()); runner_ = new content::MessageLoopRunner; runner_->Run(); } void StopLoop() { DCHECK(runner_); Callback(); runner_->Quit(); } private: MOCK_METHOD0(Callback, void(void)); scoped_refptr runner_; }; class ProfileResetterTest : public testing::Test { protected: ProfileResetterTest(); ~ProfileResetterTest(); // testing::Test: virtual void SetUp() OVERRIDE; virtual void TearDown() OVERRIDE; testing::StrictMock mock_object_; TemplateURLServiceTestUtil test_util_; scoped_ptr resetter_; DISALLOW_COPY_AND_ASSIGN(ProfileResetterTest); }; ProfileResetterTest::ProfileResetterTest() {} ProfileResetterTest::~ProfileResetterTest() {} void ProfileResetterTest::SetUp() { test_util_.SetUp(); resetter_.reset(new ProfileResetter(test_util_.profile())); } void ProfileResetterTest::TearDown() { test_util_.TearDown(); } TEST_F(ProfileResetterTest, ResetDefaultSearchEngine) { resetter_->Reset( ProfileResetter::DEFAULT_SEARCH_ENGINE, ProfileResetter::DISABLE_EXTENSIONS, base::Bind(&MockObject::StopLoop, base::Unretained(&mock_object_))); mock_object_.RunLoop(); } TEST_F(ProfileResetterTest, ResetHomepage) { PrefService* prefs = test_util_.profile()->GetPrefs(); DCHECK(prefs); prefs->SetBoolean(prefs::kHomePageIsNewTabPage, false); prefs->SetString(prefs::kHomePage, "http://google.com"); prefs->SetBoolean(prefs::kShowHomeButton, true); resetter_->Reset( ProfileResetter::HOMEPAGE, ProfileResetter::DISABLE_EXTENSIONS, base::Bind(&MockObject::StopLoop, base::Unretained(&mock_object_))); mock_object_.RunLoop(); EXPECT_TRUE(prefs->GetBoolean(prefs::kHomePageIsNewTabPage)); EXPECT_EQ(std::string(), prefs->GetString(prefs::kHomePage)); EXPECT_FALSE(prefs->GetBoolean(prefs::kShowHomeButton)); } TEST_F(ProfileResetterTest, ResetContentSettings) { resetter_->Reset( ProfileResetter::CONTENT_SETTINGS, ProfileResetter::DISABLE_EXTENSIONS, base::Bind(&MockObject::StopLoop, base::Unretained(&mock_object_))); mock_object_.RunLoop(); } TEST_F(ProfileResetterTest, ResetCookiesAndSiteData) { resetter_->Reset( ProfileResetter::COOKIES_AND_SITE_DATA, ProfileResetter::DISABLE_EXTENSIONS, base::Bind(&MockObject::StopLoop, base::Unretained(&mock_object_))); mock_object_.RunLoop(); } TEST_F(ProfileResetterTest, ResetExtensionsByDisabling) { resetter_->Reset( ProfileResetter::EXTENSIONS, ProfileResetter::DISABLE_EXTENSIONS, base::Bind(&MockObject::StopLoop, base::Unretained(&mock_object_))); mock_object_.RunLoop(); } TEST_F(ProfileResetterTest, ResetExtensionsByUninstalling) { resetter_->Reset( ProfileResetter::EXTENSIONS, ProfileResetter::UNINSTALL_EXTENSIONS, base::Bind(&MockObject::StopLoop, base::Unretained(&mock_object_))); mock_object_.RunLoop(); } TEST_F(ProfileResetterTest, ResetStartPage) { PrefService* prefs = test_util_.profile()->GetPrefs(); DCHECK(prefs); SessionStartupPref startup_pref(SessionStartupPref::URLS); startup_pref.urls.push_back(GURL("http://foo")); startup_pref.urls.push_back(GURL("http://bar")); SessionStartupPref::SetStartupPref(prefs, startup_pref); resetter_->Reset( ProfileResetter::STARTUP_PAGE, ProfileResetter::DISABLE_EXTENSIONS, base::Bind(&MockObject::StopLoop, base::Unretained(&mock_object_))); mock_object_.RunLoop(); startup_pref = SessionStartupPref::GetStartupPref(prefs); EXPECT_EQ(SessionStartupPref::GetDefaultStartupType(), startup_pref.type); EXPECT_EQ(std::vector(), startup_pref.urls); } TEST_F(ProfileResetterTest, ResetExtensionsAll) { // mock_object_ is a StrictMock, so we verify that it is called only once. resetter_->Reset( ProfileResetter::ALL, ProfileResetter::UNINSTALL_EXTENSIONS, base::Bind(&MockObject::StopLoop, base::Unretained(&mock_object_))); mock_object_.RunLoop(); } } // namespace