profile_sync_service_harness.h revision 21d179b334e59e9a3bfcaed4c4430bef1bc5759d
1513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// found in the LICENSE file. 4513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 5513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#ifndef CHROME_BROWSER_SYNC_PROFILE_SYNC_SERVICE_HARNESS_H_ 6513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#define CHROME_BROWSER_SYNC_PROFILE_SYNC_SERVICE_HARNESS_H_ 7513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#pragma once 8513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 9513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include <string> 10513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include <vector> 11513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 12513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "base/time.h" 13513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/sync/profile_sync_service.h" 14513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 15513209b27ff55e2841eac0e4120199c23acce758Ben Murdochusing browser_sync::sessions::SyncSessionSnapshot; 16513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 17513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass Profile; 18513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 19513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// An instance of this class is basically our notion of a "sync client" for 20513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// automation purposes. It harnesses the ProfileSyncService member of the 21513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// profile passed to it on construction and automates certain things like setup 22513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// and authentication. It provides ways to "wait" adequate periods of time for 23513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// several clients to get to the same state. 2421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass ProfileSyncServiceHarness : public ProfileSyncServiceObserver { 25513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public: 26513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ProfileSyncServiceHarness(Profile* profile, 27513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::string& username, 28513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::string& password, 29513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int id); 30513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 31513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual ~ProfileSyncServiceHarness() {} 32513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 33513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Creates a ProfileSyncServiceHarness object and attaches it to |profile|, a 34513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // profile that is assumed to have been signed into sync in the past. Caller 35513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // takes ownership. 36513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static ProfileSyncServiceHarness* CreateAndAttach(Profile* profile); 37513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 38513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Sets the GAIA credentials with which to sign in to sync. 39513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void SetCredentials(const std::string& username, const std::string& password); 40513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 41513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Returns true if sync has been enabled on |profile_|. 42513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool IsSyncAlreadySetup(); 43513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 44513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Creates a ProfileSyncService for the profile passed at construction and 45513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // enables sync for all available datatypes. Returns true only after sync has 46513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // been fully initialized and authenticated, and we are ready to process 47513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // changes. 48513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool SetupSync(); 49513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 50513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Same as the above method, but enables sync only for the datatypes contained 51513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // in |synced_datatypes|. 52513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool SetupSync(const syncable::ModelTypeSet& synced_datatypes); 53513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 54513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // ProfileSyncServiceObserver implementation. 55513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual void OnStateChanged(); 56513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 57513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Blocks the caller until this harness has completed a single sync cycle 58513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // since the previous one. Returns true if a sync cycle has completed. 59513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool AwaitSyncCycleCompletion(const std::string& reason); 60513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 61513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Blocks the caller until this harness has observed that the sync engine 62513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // has "synced" up to at least the specified local timestamp. 63513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool WaitUntilTimestampIsAtLeast(int64 timestamp, const std::string& reason); 64513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 65513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Calling this acts as a barrier and blocks the caller until |this| and 66513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // |partner| have both completed a sync cycle. When calling this method, 67513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // the |partner| should be the passive responder who responds to the actions 68513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // of |this|. This method relies upon the synchronization of callbacks 69513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // from the message queue. Returns true if two sync cycles have completed. 70513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Note: Use this method when exactly one client makes local change(s), and 71513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // exactly one client is waiting to receive those changes. 72513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool AwaitMutualSyncCycleCompletion(ProfileSyncServiceHarness* partner); 73513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 74513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Blocks the caller until |this| completes its ongoing sync cycle and every 75513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // other client in |partners| has a timestamp that is greater than or equal to 76513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // the timestamp of |this|. Note: Use this method when exactly one client 77513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // makes local change(s), and more than one client is waiting to receive those 78513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // changes. 79513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool AwaitGroupSyncCycleCompletion( 80513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::vector<ProfileSyncServiceHarness*>& partners); 81513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 82513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Blocks the caller until every client in |clients| completes its ongoing 83513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // sync cycle and all the clients' timestamps match. Note: Use this method 84513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // when more than one client makes local change(s), and more than one client 85513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // is waiting to receive those changes. 86513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static bool AwaitQuiescence( 87513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::vector<ProfileSyncServiceHarness*>& clients); 88513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 89513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // If a SetPassphrase call has been issued with a valid passphrase, this 90513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // will wait until the Cryptographer broadcasts SYNC_PASSPHRASE_ACCEPTED. 91513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool AwaitPassphraseAccepted(); 92513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 93513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Returns the ProfileSyncService member of the the sync client. 94513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ProfileSyncService* service() { return service_; } 95513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 96513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Returns the status of the ProfileSyncService member of the the sync client. 97513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ProfileSyncService::Status GetStatus(); 98513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 99513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // See ProfileSyncService::ShouldPushChanges(). 100513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool ServiceIsPushingChanges() { return service_->ShouldPushChanges(); } 101513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 102513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Enables sync for a particular sync datatype. 103513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void EnableSyncForDatatype(syncable::ModelType datatype); 104513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 105513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Disables sync for a particular sync datatype. 106513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void DisableSyncForDatatype(syncable::ModelType datatype); 107513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 108513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Enables sync for all sync datatypes. 109513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void EnableSyncForAllDatatypes(); 110513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 111513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Disables sync for all sync datatypes. 112513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void DisableSyncForAllDatatypes(); 113513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 114513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Returns a snapshot of the current sync session. 115513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const SyncSessionSnapshot* GetLastSessionSnapshot() const; 116513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 117513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch private: 118513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch friend class StateChangeTimeoutEvent; 119513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 120513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch enum WaitState { 121513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The sync client has just been initialized. 122513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch INITIAL_WAIT_STATE = 0, 123513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 124513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The sync client awaits the OnBackendInitialized() callback. 125513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch WAITING_FOR_ON_BACKEND_INITIALIZED, 126513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 127201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Waiting for a passphrase to be required. 128201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch WAITING_FOR_PASSPHRASE_REQUIRED, 129201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 130201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Waiting for a set passphrase to be accepted by the cryptographer. 131201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch WAITING_FOR_PASSPHRASE_ACCEPTED, 132201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 133513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The sync client is waiting for the first sync cycle to complete. 134513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch WAITING_FOR_INITIAL_SYNC, 135513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 136513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The sync client is waiting for an ongoing sync cycle to complete. 137513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch WAITING_FOR_SYNC_TO_FINISH, 138513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 139513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The sync client anticipates incoming updates leading to a new sync cycle. 140513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch WAITING_FOR_UPDATES, 141513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 142513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The sync client cannot reach the server. 143513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch SERVER_UNREACHABLE, 144513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 145513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The sync client is fully synced and there are no pending updates. 146513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch FULLY_SYNCED, 147513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 148513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Syncing is disabled for the client. 149513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch SYNC_DISABLED, 150513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 151513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch NUMBER_OF_STATES, 152513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch }; 153513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 154513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Called from the observer when the current wait state has been completed. 155513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void SignalStateCompleteWithNextState(WaitState next_state); 156513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 157513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Indicates that the operation being waited on is complete. 158513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void SignalStateComplete(); 159513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 160513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Finite state machine for controlling state. Returns true only if a state 161513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // change has taken place. 162513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool RunStateChangeMachine(); 163513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 164513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Returns true if a status change took place, false on timeout. 165513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool AwaitStatusChangeWithTimeout(int timeout_milliseconds, 166513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::string& reason); 167513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 168513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Returns true if the sync client has no unsynced items. 169513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool IsSynced(); 170513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 171513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Logs message with relevant info about client's sync state (if available). 172513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void LogClientInfo(std::string message); 173513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 174513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Updates |last_timestamp_| with the timestamp of the current sync session. 175513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Returns the new value of |last_timestamp_|. 176513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int64 GetUpdatedTimestamp(); 177513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 178513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch WaitState wait_state_; 179513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 180513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Profile* profile_; 181513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ProfileSyncService* service_; 182513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 183513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // This value tracks the max sync timestamp (e.g. synced-to revision) inside 184513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // the sync engine. It gets updated when a sync cycle ends and the session 185513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // snapshot implies syncing is "done". 186513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int64 last_timestamp_; 187513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 188513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The minimum value of the 'max_local_timestamp' member of a 189513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // SyncSessionSnapshot we need to wait to observe in OnStateChanged when told 190513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // to WaitUntilTimestampIsAtLeast(...). 191513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int64 min_timestamp_needed_; 192513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 193513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Credentials used for GAIA authentication. 194513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string username_; 195513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string password_; 196513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 197513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Client ID, used for logging purposes. 198513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int id_; 199513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 200513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch DISALLOW_COPY_AND_ASSIGN(ProfileSyncServiceHarness); 201513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}; 202513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 203513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#endif // CHROME_BROWSER_SYNC_PROFILE_SYNC_SERVICE_HARNESS_H_ 204