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

Unified Diff: chrome/browser/sync/profile_sync_service_unittest.cc

Issue 69583002: Refactor some ProfileSyncServiceTests (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add another suppress tests Created 7 years, 1 month 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 | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/sync/profile_sync_service_unittest.cc
diff --git a/chrome/browser/sync/profile_sync_service_unittest.cc b/chrome/browser/sync/profile_sync_service_unittest.cc
index 636435e0966658a27dbee3d49d704ec068d9762e..9a81dcdd9eda0fc4e6930b84fc15297849dde192 100644
--- a/chrome/browser/sync/profile_sync_service_unittest.cc
+++ b/chrome/browser/sync/profile_sync_service_unittest.cc
@@ -16,6 +16,7 @@
#include "chrome/browser/sync/fake_oauth2_token_service.h"
#include "chrome/browser/sync/glue/bookmark_data_type_controller.h"
#include "chrome/browser/sync/glue/data_type_controller.h"
+#include "chrome/browser/sync/glue/sync_backend_host_mock.h"
#include "chrome/browser/sync/profile_sync_components_factory_mock.h"
#include "chrome/browser/sync/test_profile_sync_service.h"
#include "chrome/common/chrome_version_info.h"
@@ -59,7 +60,9 @@ class ProfileSyncServiceTest : public testing::Test {
content::TestBrowserThreadBundle::REAL_IO_THREAD) {
}
- virtual void SetUp() OVERRIDE {
+ virtual ~ProfileSyncServiceTest() {}
+
+ virtual void SetUp() OVERRIDE {
TestingProfile::Builder builder;
builder.AddTestingFactory(ProfileOAuth2TokenServiceFactory::GetInstance(),
FakeOAuth2TokenService::BuildTokenService);
@@ -172,158 +175,287 @@ class TestProfileSyncServiceObserver : public ProfileSyncServiceObserver {
bool first_setup_in_progress_;
};
-TEST_F(ProfileSyncServiceTest, InitialState) {
- SigninManagerBase* signin =
- SigninManagerFactory::GetForProfile(profile_.get());
- ProfileOAuth2TokenService* oauth2_token_service =
- ProfileOAuth2TokenServiceFactory::GetForProfile(profile_.get());
- service_.reset(new TestProfileSyncService(
- new ProfileSyncComponentsFactoryMock(),
- profile_.get(),
- signin,
- oauth2_token_service,
- ProfileSyncService::MANUAL_START,
- true));
- service_->Initialize();
- EXPECT_TRUE(
- service_->sync_service_url().spec() ==
- ProfileSyncService::kSyncServerUrl ||
- service_->sync_service_url().spec() ==
- ProfileSyncService::kDevServerUrl);
+// A variant of the SyncBackendHostMock that won't automatically
+// call back when asked to initialized. Allows us to test things
+// that could happen while backend init is in progress.
+class SyncBackendHostNoReturn : public SyncBackendHostMock {
+ virtual void Initialize(
+ SyncFrontend* frontend,
+ scoped_ptr<base::Thread> sync_thread,
+ const syncer::WeakHandle<syncer::JsEventHandler>& event_handler,
+ const GURL& service_url,
+ const syncer::SyncCredentials& credentials,
+ bool delete_sync_data_folder,
+ scoped_ptr<syncer::SyncManagerFactory> sync_manager_factory,
+ scoped_ptr<syncer::UnrecoverableErrorHandler> unrecoverable_error_handler,
+ syncer::ReportUnrecoverableErrorFunction
+ report_unrecoverable_error_function) OVERRIDE {}
+};
+
+ACTION(ReturnNewSyncBackendHostMock) {
+ return new browser_sync::SyncBackendHostMock();
+}
+
+ACTION(ReturnNewSyncBackendHostNoReturn) {
+ return new browser_sync::SyncBackendHostNoReturn();
+}
+
+// A test harness that uses a real ProfileSyncService and in most cases a
+// MockSyncBackendHost.
+//
+// This is useful if we want to test the ProfileSyncService and don't care about
+// testing the SyncBackendHost. It's easier to use than the other tests, since
+// it doesn't involve any threads.
+class ProfileSyncServiceSimpleTest : public ::testing::Test {
+ protected:
+ ProfileSyncServiceSimpleTest()
+ : thread_bundle_(content::TestBrowserThreadBundle::REAL_DB_THREAD |
Nicolas Zea 2013/11/13 23:49:00 if these test don't involve threads, is the thread
rlarocque 2013/11/14 00:41:38 Apparently yes. There seems to be something in th
+ content::TestBrowserThreadBundle::REAL_FILE_THREAD |
+ content::TestBrowserThreadBundle::REAL_IO_THREAD) {}
+ virtual ~ProfileSyncServiceSimpleTest() {}
+
+ virtual void SetUp() OVERRIDE {
+ TestingProfile::Builder builder;
+
+ builder.AddTestingFactory(ProfileOAuth2TokenServiceFactory::GetInstance(),
+ FakeOAuth2TokenService::BuildTokenService);
+ invalidation::InvalidationServiceFactory::GetInstance()->
+ SetBuildOnlyFakeInvalidatorsForTest(true);
+
+ profile_ = builder.Build().Pass();
+ }
+
+ virtual void TearDown() OVERRIDE {
+ // Kill the service before the profile.
+ if (service_)
+ service_->Shutdown();
+
+ service_.reset();
+ profile_.reset();
+
+ // Pump messages posted by the sync thread (which may end up
+ // posting on the IO thread).
+ base::RunLoop().RunUntilIdle();
+ content::RunAllPendingInMessageLoop(content::BrowserThread::IO);
Nicolas Zea 2013/11/13 23:49:00 Similar question about this?
rlarocque 2013/11/14 00:41:38 I'm mostly sure this is unnecessary. The ThreadBu
+ base::RunLoop().RunUntilIdle();
+ }
+
+ void IssueTestTokens() {
+ ProfileOAuth2TokenServiceFactory::GetForProfile(profile_.get())
+ ->UpdateCredentials("test", "oauth2_login_token");
+ }
+
+ void CreateService(ProfileSyncService::StartBehavior behavior) {
+ SigninManagerBase* signin =
+ SigninManagerFactory::GetForProfile(profile_.get());
+ signin->SetAuthenticatedUsername("test");
+ ProfileOAuth2TokenService* oauth2_token_service =
+ ProfileOAuth2TokenServiceFactory::GetForProfile(profile_.get());
+ components_factory_ = new StrictMock<ProfileSyncComponentsFactoryMock>();
+ service_.reset(new ProfileSyncService(
+ components_factory_,
+ profile_.get(),
+ signin,
+ oauth2_token_service,
+ behavior));
+ }
+
+ void ShutdownAndDeleteService() {
+ if (service_)
+ service_->Shutdown();
+ service_.reset();
+ }
+
+ void Initialize() {
+ service_->Initialize();
+ }
+
+ void ExpectDataTypeManagerCreation() {
+ EXPECT_CALL(*components_factory_, CreateDataTypeManager(_, _, _, _, _, _)).
+ WillOnce(ReturnNewDataTypeManager());
+ }
+
+ void ExpectSyncBackendHostCreation() {
+ EXPECT_CALL(*components_factory_, CreateSyncBackendHost(_, _, _)).
+ WillOnce(ReturnNewSyncBackendHostMock());
+ }
+
+ void PrepareDelayedInitSyncBackendHost() {
+ EXPECT_CALL(*components_factory_, CreateSyncBackendHost(_, _, _)).
+ WillOnce(ReturnNewSyncBackendHostNoReturn());
+ }
+
+ TestingProfile* profile() {
+ return profile_.get();
+ }
+
+ ProfileSyncService* service() {
+ return service_.get();
+ }
+
+ ProfileSyncComponentsFactoryMock* components_factory() {
+ return components_factory_;
+ }
+
+ private:
+ scoped_ptr<TestingProfile> profile_;
+ scoped_ptr<ProfileSyncService> service_;
+
+ // Pointer to the components factory. Not owned. May be null.
+ ProfileSyncComponentsFactoryMock* components_factory_;
+
+ content::TestBrowserThreadBundle thread_bundle_;
+};
+
+// Verify that the server URLs are sane.
+TEST_F(ProfileSyncServiceSimpleTest, InitialState) {
+ CreateService(ProfileSyncService::AUTO_START);
+ Initialize();
+ const std::string& url = service()->sync_service_url().spec();
+ EXPECT_TRUE(url == ProfileSyncService::kSyncServerUrl ||
+ url == ProfileSyncService::kDevServerUrl);
+}
+
+// Verify a successful initialization.
+TEST_F(ProfileSyncServiceSimpleTest, SuccessfulInitialization) {
+ profile()->GetTestingPrefService()->SetManagedPref(
+ prefs::kSyncManaged,
+ Value::CreateBooleanValue(false));
+ IssueTestTokens();
+ CreateService(ProfileSyncService::AUTO_START);
+ ExpectDataTypeManagerCreation();
+ ExpectSyncBackendHostCreation();
+ Initialize();
+ EXPECT_FALSE(service()->IsManaged());
+ EXPECT_TRUE(service()->sync_initialized());
}
-// Tests that the sync service doesn't forget to notify observers about
-// setup state.
-TEST(ProfileSyncServiceTestBasic, SetupInProgress) {
- ProfileSyncService service(
- NULL, NULL, NULL, NULL, ProfileSyncService::MANUAL_START);
- TestProfileSyncServiceObserver observer(&service);
- service.AddObserver(&observer);
- service.SetSetupInProgress(true);
+
+// Verify that the SetSetupInProgress function call updates state
+// and notifies observers.
+TEST_F(ProfileSyncServiceSimpleTest, SetupInProgress) {
+ CreateService(ProfileSyncService::MANUAL_START);
+ Initialize();
+
+ TestProfileSyncServiceObserver observer(service());
+ service()->AddObserver(&observer);
+
+ service()->SetSetupInProgress(true);
EXPECT_TRUE(observer.first_setup_in_progress());
- service.SetSetupInProgress(false);
+ service()->SetSetupInProgress(false);
EXPECT_FALSE(observer.first_setup_in_progress());
- service.RemoveObserver(&observer);
+
+ service()->RemoveObserver(&observer);
}
-TEST_F(ProfileSyncServiceTest, DisabledByPolicy) {
- profile_->GetTestingPrefService()->SetManagedPref(
+// Verify that disable by enterprise policy works.
+TEST_F(ProfileSyncServiceSimpleTest, DisabledByPolicyBeforeInit) {
+ profile()->GetTestingPrefService()->SetManagedPref(
prefs::kSyncManaged,
Value::CreateBooleanValue(true));
- SigninManagerBase* signin =
- SigninManagerFactory::GetForProfile(profile_.get());
- ProfileOAuth2TokenService* oauth2_token_service =
- ProfileOAuth2TokenServiceFactory::GetForProfile(profile_.get());
- service_.reset(new TestProfileSyncService(
- new ProfileSyncComponentsFactoryMock(),
- profile_.get(),
- signin,
- oauth2_token_service,
- ProfileSyncService::MANUAL_START,
- true));
- service_->Initialize();
- EXPECT_TRUE(service_->IsManaged());
+ IssueTestTokens();
+ CreateService(ProfileSyncService::AUTO_START);
+ Initialize();
+ EXPECT_TRUE(service()->IsManaged());
+ EXPECT_FALSE(service()->sync_initialized());
}
-TEST_F(ProfileSyncServiceTest, AbortedByShutdown) {
- SigninManagerBase* signin =
- SigninManagerFactory::GetForProfile(profile_.get());
- signin->SetAuthenticatedUsername("test");
- ProfileOAuth2TokenService* oauth2_token_service =
- ProfileOAuth2TokenServiceFactory::GetForProfile(profile_.get());
- ProfileSyncComponentsFactoryMock* factory =
- new ProfileSyncComponentsFactoryMock();
- service_.reset(new TestProfileSyncService(
- factory,
- profile_.get(),
- signin,
- oauth2_token_service,
- ProfileSyncService::AUTO_START,
- true));
- EXPECT_CALL(*factory, CreateDataTypeManager(_, _, _, _, _, _)).Times(0);
- EXPECT_CALL(*factory, CreateBookmarkSyncComponents(_, _)).
- Times(0);
- service_->RegisterDataTypeController(
- new BookmarkDataTypeController(service_->factory(),
- profile_.get(),
- service_.get()));
-
- service_->Initialize();
- service_->Shutdown();
- service_.reset();
+// Verify that disable by enterprise policy works even after the backend has
+// been initialized.
+TEST_F(ProfileSyncServiceSimpleTest, DisabledByPolicyAfterInit) {
+ IssueTestTokens();
+ CreateService(ProfileSyncService::AUTO_START);
+ ExpectDataTypeManagerCreation();
+ ExpectSyncBackendHostCreation();
+ Initialize();
+
+ EXPECT_FALSE(service()->IsManaged());
+ EXPECT_TRUE(service()->sync_initialized());
+
+ profile()->GetTestingPrefService()->SetManagedPref(
+ prefs::kSyncManaged,
+ Value::CreateBooleanValue(true));
+
+ EXPECT_TRUE(service()->IsManaged());
+ EXPECT_FALSE(service()->sync_initialized());
}
-TEST_F(ProfileSyncServiceTest, DisableAndEnableSyncTemporarily) {
- SigninManagerBase* signin =
- SigninManagerFactory::GetForProfile(profile_.get());
- signin->SetAuthenticatedUsername("test");
- ProfileOAuth2TokenService* oauth2_token_service =
- ProfileOAuth2TokenServiceFactory::GetForProfile(profile_.get());
- ProfileSyncComponentsFactoryMock* factory =
- new ProfileSyncComponentsFactoryMock();
- service_.reset(new TestProfileSyncService(
- factory,
- profile_.get(),
- signin,
- oauth2_token_service,
- ProfileSyncService::AUTO_START,
- true));
- // Register the bookmark data type.
- EXPECT_CALL(*factory, CreateDataTypeManager(_, _, _, _, _, _)).
- WillRepeatedly(ReturnNewDataTypeManager());
+// Exercies the ProfileSyncService's code paths related to getting shut down
+// before the backend initialize call returns.
+TEST_F(ProfileSyncServiceSimpleTest, AbortedByShutdown) {
+ CreateService(ProfileSyncService::AUTO_START);
+ PrepareDelayedInitSyncBackendHost();
IssueTestTokens();
+ Initialize();
+ EXPECT_FALSE(service()->sync_initialized());
- service_->Initialize();
- EXPECT_TRUE(service_->sync_initialized());
- EXPECT_TRUE(service_->GetBackendForTest() != NULL);
+ ShutdownAndDeleteService();
+}
+
+// Test StopAndSuppress() before we've initialized the backend.
+TEST_F(ProfileSyncServiceSimpleTest, EarlyStopAndSuppress) {
+ CreateService(ProfileSyncService::AUTO_START);
+ IssueTestTokens();
+
+ service()->StopAndSuppress();
+ EXPECT_TRUE(profile()->GetPrefs()->GetBoolean(prefs::kSyncSuppressStart));
+
+ // Because of supression, this should fail.
+ Initialize();
+ EXPECT_FALSE(service()->sync_initialized());
+
+ // Remove suppression. This should be enough to allow init to happen.
+ ExpectDataTypeManagerCreation();
+ ExpectSyncBackendHostCreation();
+ service()->UnsuppressAndStart();
+ EXPECT_TRUE(service()->sync_initialized());
EXPECT_FALSE(
- profile_->GetPrefs()->GetBoolean(prefs::kSyncSuppressStart));
+ profile()->GetPrefs()->GetBoolean(prefs::kSyncSuppressStart));
+}
- service_->StopAndSuppress();
- EXPECT_FALSE(service_->sync_initialized());
- EXPECT_TRUE(
- profile_->GetPrefs()->GetBoolean(prefs::kSyncSuppressStart));
+// Test StopAndSuppress() after we've initialized the backend.
+TEST_F(ProfileSyncServiceSimpleTest, DisableAndEnableSyncTemporarily) {
+ CreateService(ProfileSyncService::AUTO_START);
+ IssueTestTokens();
+ ExpectDataTypeManagerCreation();
+ ExpectSyncBackendHostCreation();
+ Initialize();
- service_->UnsuppressAndStart();
- EXPECT_TRUE(service_->sync_initialized());
+ EXPECT_TRUE(service()->sync_initialized());
+ EXPECT_FALSE(profile()->GetPrefs()->GetBoolean(prefs::kSyncSuppressStart));
+
+ testing::Mock::VerifyAndClearExpectations(components_factory());
+
+ service()->StopAndSuppress();
+ EXPECT_FALSE(service()->sync_initialized());
+ EXPECT_TRUE(profile()->GetPrefs()->GetBoolean(prefs::kSyncSuppressStart));
+
+ ExpectDataTypeManagerCreation();
+ ExpectSyncBackendHostCreation();
+
+ service()->UnsuppressAndStart();
+ EXPECT_TRUE(service()->sync_initialized());
EXPECT_FALSE(
- profile_->GetPrefs()->GetBoolean(prefs::kSyncSuppressStart));
+ profile()->GetPrefs()->GetBoolean(prefs::kSyncSuppressStart));
}
// Certain ProfileSyncService tests don't apply to Chrome OS, for example
// things that deal with concepts like "signing out" and policy.
#if !defined (OS_CHROMEOS)
-TEST_F(ProfileSyncServiceTest, EnableSyncAndSignOut) {
- SigninManager* signin =
- SigninManagerFactory::GetForProfile(profile_.get());
- signin->SetAuthenticatedUsername("test");
- ProfileOAuth2TokenService* oauth2_token_service =
- ProfileOAuth2TokenServiceFactory::GetForProfile(profile_.get());
- ProfileSyncComponentsFactoryMock* factory =
- new ProfileSyncComponentsFactoryMock();
- service_.reset(new TestProfileSyncService(
- factory,
- profile_.get(),
- signin,
- oauth2_token_service,
- ProfileSyncService::AUTO_START,
- true));
- // Register the bookmark data type.
- EXPECT_CALL(*factory, CreateDataTypeManager(_, _, _, _, _, _)).
- WillRepeatedly(ReturnNewDataTypeManager());
-
+TEST_F(ProfileSyncServiceSimpleTest, EnableSyncAndSignOut) {
+ CreateService(ProfileSyncService::AUTO_START);
+ ExpectDataTypeManagerCreation();
+ ExpectSyncBackendHostCreation();
IssueTestTokens();
+ Initialize();
- service_->Initialize();
- EXPECT_TRUE(service_->sync_initialized());
- EXPECT_TRUE(service_->GetBackendForTest() != NULL);
- EXPECT_FALSE(
- profile_->GetPrefs()->GetBoolean(prefs::kSyncSuppressStart));
+ EXPECT_TRUE(service()->sync_initialized());
+ EXPECT_FALSE(profile()->GetPrefs()->GetBoolean(prefs::kSyncSuppressStart));
- signin->SignOut();
- EXPECT_FALSE(service_->sync_initialized());
+ SigninManagerFactory::GetForProfile(profile())->SignOut();
+ EXPECT_FALSE(service()->sync_initialized());
}
#endif // !defined(OS_CHROMEOS)
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698