1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
// Copyright 2014 The Chromium Authors
// 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_watcher.h"
#include "chrome/browser/sync/test/integration/migration_waiter.h"
#include "chrome/browser/sync/test/integration/sync_service_impl_harness.h"
#include "components/sync/service/sync_service_impl.h"
MigrationWatcher::MigrationWatcher(SyncServiceImplHarness* harness)
: harness_(harness) {
syncer::BackendMigrator* migrator =
harness_->service()->GetBackendMigratorForTest();
// PSS must have a migrator after sync is setup and initial data type
// configuration is complete.
migrator->AddMigrationObserver(this);
}
MigrationWatcher::~MigrationWatcher() {
DCHECK(!migration_waiter_);
}
bool MigrationWatcher::HasPendingBackendMigration() const {
syncer::BackendMigrator* migrator =
harness_->service()->GetBackendMigratorForTest();
return migrator && migrator->state() != syncer::BackendMigrator::IDLE;
}
syncer::DataTypeSet MigrationWatcher::GetMigratedTypes() const {
return migrated_types_;
}
void MigrationWatcher::OnMigrationStateChange() {
if (HasPendingBackendMigration()) {
// A new bunch of data types are in the process of being migrated. Merge
// them into |pending_types_|.
pending_types_.PutAll(harness_->service()
->GetBackendMigratorForTest()
->GetPendingMigrationTypesForTest());
DVLOG(1) << harness_->profile_debug_name()
<< ": new pending migration types "
<< syncer::DataTypeSetToDebugString(pending_types_);
} else {
// Migration just finished for a bunch of data types. Merge them into
// |migrated_types_|.
migrated_types_.PutAll(pending_types_);
pending_types_.Clear();
DVLOG(1) << harness_->profile_debug_name() << ": new migrated types "
<< syncer::DataTypeSetToDebugString(migrated_types_);
}
// Manually trigger a check of the exit condition.
if (migration_waiter_) {
migration_waiter_->OnMigrationStateChange();
}
}
void MigrationWatcher::set_migration_waiter(MigrationWaiter* waiter) {
DCHECK(!migration_waiter_);
migration_waiter_ = waiter;
}
void MigrationWatcher::clear_migration_waiter() {
DCHECK(migration_waiter_);
migration_waiter_ = nullptr;
}
|