Index: chrome/browser/sync/test/integration/migration_waiter.cc |
diff --git a/chrome/browser/sync/test/integration/migration_waiter.cc b/chrome/browser/sync/test/integration/migration_waiter.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..565b3ccc89112e8062a7ae673f5cbd9ca1a29018 |
--- /dev/null |
+++ b/chrome/browser/sync/test/integration/migration_waiter.cc |
@@ -0,0 +1,45 @@ |
+// Copyright 2014 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/sync/test/integration/migration_waiter.h" |
+ |
+#include "base/logging.h" |
+#include "chrome/browser/sync/test/integration/migration_watcher.h" |
+ |
+MigrationWaiter::MigrationWaiter(syncer::ModelTypeSet expected_types, |
+ MigrationWatcher* watcher) |
+ : watcher_(watcher), expected_types_(expected_types) { |
+ DCHECK(!expected_types_.Empty()); |
+ watcher_->set_migration_waiter(this); |
+} |
+ |
+MigrationWaiter::~MigrationWaiter() { |
+ watcher_->clear_migration_waiter(); |
+} |
+ |
+// Returns true when sync reports that there is no pending migration, and |
+// migration is complete for all data types in |expected_types_|. |
+bool MigrationWaiter::IsExitConditionSatisfied() { |
+ return watcher_->GetMigratedTypes().HasAll(expected_types_) && |
+ !watcher_->HasPendingBackendMigration(); |
+} |
+ |
+std::string MigrationWaiter::GetDebugMessage() const { |
+ return "Waiting to migrate (" + ModelTypeSetToString(expected_types_) + |
+ "); " + "Currently migrated: (" + |
+ ModelTypeSetToString(watcher_->GetMigratedTypes()) + ")"; |
+} |
+ |
+void MigrationWaiter::Wait() { |
+ if (IsExitConditionSatisfied()) { |
+ DVLOG(1) << "Skipping wait: " << GetDebugMessage(); |
+ return; |
+ } |
+ |
+ StartBlockingWait(); |
+} |
+ |
+void MigrationWaiter::OnMigrationStateChange() { |
+ CheckExitCondition(); |
+} |