11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/sync/test/integration/migration_waiter.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/logging.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/sync/test/integration/migration_watcher.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciMigrationWaiter::MigrationWaiter(syncer::ModelTypeSet expected_types,
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 MigrationWatcher* watcher)
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : watcher_(watcher), expected_types_(expected_types) {
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(!expected_types_.Empty());
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  watcher_->set_migration_waiter(this);
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciMigrationWaiter::~MigrationWaiter() {
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  watcher_->clear_migration_waiter();
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Returns true when sync reports that there is no pending migration, and
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// migration is complete for all data types in |expected_types_|.
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool MigrationWaiter::IsExitConditionSatisfied() {
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return watcher_->GetMigratedTypes().HasAll(expected_types_) &&
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         !watcher_->HasPendingBackendMigration();
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistd::string MigrationWaiter::GetDebugMessage() const {
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return "Waiting to migrate (" + ModelTypeSetToString(expected_types_) +
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         "); " + "Currently migrated: (" +
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         ModelTypeSetToString(watcher_->GetMigratedTypes()) + ")";
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid MigrationWaiter::Wait() {
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (IsExitConditionSatisfied()) {
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DVLOG(1) << "Skipping wait: " << GetDebugMessage();
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StartBlockingWait();
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid MigrationWaiter::OnMigrationStateChange() {
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckExitCondition();
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
46