Chromium Code Reviews| Index: chrome/browser/sync/test/integration/single_client_backup_rollback_test.cc |
| diff --git a/chrome/browser/sync/test/integration/single_client_backup_rollback_test.cc b/chrome/browser/sync/test/integration/single_client_backup_rollback_test.cc |
| index 59ef9c852b13776d43c62ef9d62818a40996ee88..c70068885938bbb5f429bdd370a8287294693269 100644 |
| --- a/chrome/browser/sync/test/integration/single_client_backup_rollback_test.cc |
| +++ b/chrome/browser/sync/test/integration/single_client_backup_rollback_test.cc |
| @@ -7,6 +7,8 @@ |
| #include "base/message_loop/message_loop.h" |
| #include "base/prefs/pref_service.h" |
| #include "base/run_loop.h" |
| +#include "base/test/test_timeouts.h" |
| +#include "chrome/browser/browsing_data/browsing_data_remover.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/sync/profile_sync_service.h" |
| #include "chrome/browser/sync/test/integration/bookmarks_helper.h" |
| @@ -72,41 +74,86 @@ class SingleClientBackupRollbackTest : public SyncTest { |
| DISALLOW_COPY_AND_ASSIGN(SingleClientBackupRollbackTest); |
| }; |
| -class SyncBackendStoppedChecker { |
| +// Waits until the ProfileSyncService's backend is in IDLE mode. |
| +class SyncBackendStoppedChecker : public ProfileSyncServiceBase::Observer { |
| public: |
| - explicit SyncBackendStoppedChecker(ProfileSyncService* service, |
| - base::TimeDelta timeout) |
| + explicit SyncBackendStoppedChecker(ProfileSyncService* service) |
| : pss_(service), |
| - timeout_(timeout) {} |
| + timeout_(TestTimeouts::action_max_timeout()), |
| + done_(false) {} |
| + |
| + virtual void OnStateChanged() OVERRIDE { |
| + if (ProfileSyncService::IDLE == pss_->backend_mode()) { |
| + done_ = true; |
| + run_loop_.Quit(); |
| + } |
| + } |
| bool Wait() { |
| - expiration_ = base::TimeTicks::Now() + timeout_; |
| + pss_->AddObserver(this); |
| + if (ProfileSyncService::IDLE == pss_->backend_mode()) |
| + return true; |
| base::MessageLoop::current()->PostDelayedTask( |
| FROM_HERE, |
| - base::Bind(&SyncBackendStoppedChecker::PeriodicCheck, |
| - base::Unretained(this)), |
| - base::TimeDelta::FromSeconds(1)); |
| - base::MessageLoop::current()->Run(); |
| - return ProfileSyncService::IDLE == pss_->backend_mode(); |
| + run_loop_.QuitClosure(), |
| + timeout_); |
| + run_loop_.Run(); |
| + pss_->RemoveObserver(this); |
| + return done_; |
| } |
| private: |
| - void PeriodicCheck() { |
| - if (ProfileSyncService::IDLE == pss_->backend_mode() || |
| - base::TimeTicks::Now() > expiration_) { |
| - base::MessageLoop::current()->Quit(); |
| - } else { |
| - base::MessageLoop::current()->PostDelayedTask( |
| - FROM_HERE, |
| - base::Bind(&SyncBackendStoppedChecker::PeriodicCheck, |
| - base::Unretained(this)), |
| - base::TimeDelta::FromSeconds(1)); |
| + |
| + ProfileSyncService* const pss_; |
| + const base::TimeDelta timeout_; |
| + base::RunLoop run_loop_; |
| + bool done_; |
| +}; |
| + |
| +// Waits until a rollback finishes. |
| +class SyncRollbackChecker : public ProfileSyncServiceBase::Observer, |
| + public BrowsingDataRemover::Observer { |
| + public: |
| + explicit SyncRollbackChecker(ProfileSyncService* service) |
| + : pss_(service), |
| + timeout_(TestTimeouts::action_max_timeout()), |
| + rollback_started_(false), |
| + clear_done_(false) {} |
| + |
| + // ProfileSyncServiceBase::Observer implementation. |
| + virtual void OnStateChanged() OVERRIDE { |
| + if (ProfileSyncService::ROLLBACK == pss_->backend_mode()) { |
| + rollback_started_ = true; |
| + if (clear_done_) |
| + run_loop_.Quit(); |
| } |
| } |
| - ProfileSyncService* pss_; |
| - base::TimeDelta timeout_; |
| - base::TimeTicks expiration_; |
| + // BrowsingDataRemoverObserver::Observer implementation. |
| + virtual void OnBrowsingDataRemoverDone() OVERRIDE { |
| + clear_done_ = true; |
| + if (rollback_started_) { |
| + run_loop_.Quit(); |
| + } |
| + } |
| + |
| + bool Wait() { |
| + pss_->AddObserver(this); |
| + pss_->SetBrowsingDataRemoverObserverForTesting(this); |
| + base::MessageLoop::current()->PostDelayedTask( |
| + FROM_HERE, |
| + run_loop_.QuitClosure(), |
| + timeout_); |
| + run_loop_.Run(); |
| + pss_->RemoveObserver(this); |
| + return rollback_started_ && clear_done_; |
| + } |
| + |
| + ProfileSyncService* const pss_; |
| + const base::TimeDelta timeout_; |
| + base::RunLoop run_loop_; |
| + bool rollback_started_; |
| + bool clear_done_; |
| }; |
| #if defined(ENABLE_PRE_SYNC_BACKUP) |
| @@ -192,9 +239,10 @@ IN_PROC_BROWSER_TEST_F(SingleClientBackupRollbackTest, |
| Remove(0, tier1_b, 0); |
| // Wait for rollback to finish and sync backend is completely shut down. |
| - SyncBackendStoppedChecker checker(GetSyncService(0), |
| - base::TimeDelta::FromSeconds(5)); |
| - ASSERT_TRUE(checker.Wait()); |
| + SyncRollbackChecker rollback_checker(GetSyncService(0)); |
| + ASSERT_TRUE(rollback_checker.Wait()); |
| + SyncBackendStoppedChecker shutdown_checker(GetSyncService(0)); |
| + ASSERT_TRUE(shutdown_checker.Wait()); |
| // Verify bookmarks are restored. |
| ASSERT_EQ(1, tier1_a->child_count()); |
| @@ -204,10 +252,6 @@ IN_PROC_BROWSER_TEST_F(SingleClientBackupRollbackTest, |
| ASSERT_EQ(1, tier1_b->child_count()); |
| const BookmarkNode* url2 = tier1_b->GetChild(0); |
| ASSERT_EQ(GURL("http://www.nhl.com"), url2->url()); |
| - |
| - // Backup DB should be deleted after rollback is done. |
| - ASSERT_FALSE(base::PathExists( |
| - GetProfile(0)->GetPath().Append(FILE_PATH_LITERAL("Sync Data Backup")))); |
| } |
| #if defined(ENABLE_PRE_SYNC_BACKUP) |
| @@ -248,20 +292,15 @@ IN_PROC_BROWSER_TEST_F(SingleClientBackupRollbackTest, |
| // Make another change to trigger downloading of rollback command. |
| Remove(0, GetOtherNode(0), 0); |
| - // Wait for rollback to finish and sync backend is completely shut down. |
| - SyncBackendStoppedChecker checker(GetSyncService(0), |
| - base::TimeDelta::FromSeconds(5)); |
| - ASSERT_TRUE(checker.Wait()); |
| + // Wait for sync backend is completely shut down. |
| + SyncBackendStoppedChecker shutdown_checker(GetSyncService(0)); |
| + ASSERT_TRUE(shutdown_checker.Wait()); |
| // With rollback disabled, bookmarks in backup DB should not be restored. |
| // Only bookmark added during sync is present. |
| ASSERT_EQ(1, GetOtherNode(0)->child_count()); |
| ASSERT_EQ(GURL("http://www.yahoo.com"), |
| GetOtherNode(0)->GetChild(0)->url()); |
| - |
| - // Backup DB should be deleted after. |
| - ASSERT_FALSE(base::PathExists( |
| - GetProfile(0)->GetPath().Append(FILE_PATH_LITERAL("Sync Data Backup")))); |
| } |
| #if defined(ENABLE_PRE_SYNC_BACKUP) |
| @@ -300,19 +339,14 @@ IN_PROC_BROWSER_TEST_F(SingleClientBackupRollbackTest, |
| // Make another change to trigger downloading of rollback command. |
| Remove(0, GetOtherNode(0), 0); |
| - // Wait for rollback to finish and sync backend is completely shut down. |
| - SyncBackendStoppedChecker checker(GetSyncService(0), |
| - base::TimeDelta::FromSeconds(5)); |
| - ASSERT_TRUE(checker.Wait()); |
| + // Wait sync backend is completely shut down. |
| + SyncBackendStoppedChecker shutdown_checker(GetSyncService(0)); |
| + ASSERT_TRUE(shutdown_checker.Wait()); |
| // Shouldn't restore bookmarks with sign-out only. |
| ASSERT_EQ(1, GetOtherNode(0)->child_count()); |
| ASSERT_EQ(GURL("http://www.yahoo.com"), |
| GetOtherNode(0)->GetChild(0)->url()); |
| - |
| - // Backup DB should be deleted after. |
| - ASSERT_FALSE(base::PathExists( |
| - GetProfile(0)->GetPath().Append(FILE_PATH_LITERAL("Sync Data Backup")))); |
| } |
| #if defined(ENABLE_PRE_SYNC_BACKUP) |
| @@ -350,9 +384,10 @@ IN_PROC_BROWSER_TEST_F(SingleClientBackupRollbackTest, |
| // Make another change to trigger downloading of rollback command. |
| Remove(0, GetOtherNode(0), 0); |
| - // Wait for backend to completely shut down. |
| - SyncBackendStoppedChecker checker(GetSyncService(0), |
| - base::TimeDelta::FromSeconds(15)); |
| + // Wait for rollback to finish and sync backend is completely shut down. |
| + SyncRollbackChecker rollback_checker(GetSyncService(0)); |
| + ASSERT_TRUE(rollback_checker.Wait()); |
| + SyncBackendStoppedChecker checker(GetSyncService(0)); |
| ASSERT_TRUE(checker.Wait()); |
| // Without backup DB, bookmarks remain at the state when sync stops. |
| @@ -393,9 +428,10 @@ IN_PROC_BROWSER_TEST_F(SingleClientBackupRollbackTest, |
| Remove(0, sub_folder, 0); |
| // Wait for rollback to finish and sync backend is completely shut down. |
| - SyncBackendStoppedChecker checker(GetSyncService(0), |
| - base::TimeDelta::FromSeconds(5)); |
| - ASSERT_TRUE(checker.Wait()); |
| + SyncRollbackChecker rollback_checker(GetSyncService(0)); |
|
haitaol1
2014/08/21 20:50:32
You always check rollback and backend shutdown bac
Nicolas Zea
2014/08/21 20:52:32
Some of these tests don't require rollback (i.e. t
|
| + ASSERT_TRUE(rollback_checker.Wait()); |
| + SyncBackendStoppedChecker shutdown_checker(GetSyncService(0)); |
| + ASSERT_TRUE(shutdown_checker.Wait()); |
| // Verify bookmarks are unchanged. |
| ASSERT_EQ(3, sub_folder->child_count()); |