blob: b8c4270c7e97a17ae5e05e5a99a13d14c8fd5891 [file] [log] [blame]
// Copyright 2013 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.
#ifndef CHROME_BROWSER_SYNC_TEST_INTEGRATION_PROFILE_SYNC_SERVICE_HARNESS_H_
#define CHROME_BROWSER_SYNC_TEST_INTEGRATION_PROFILE_SYNC_SERVICE_HARNESS_H_
#include <memory>
#include <string>
#include <vector>
#include "base/compiler_specific.h"
#include "base/macros.h"
#include "base/optional.h"
#include "components/sync/base/user_selectable_type.h"
#include "components/sync/driver/profile_sync_service.h"
#include "components/sync/engine/cycle/sync_cycle_snapshot.h"
class Profile;
namespace syncer {
class SyncSetupInProgressHandle;
} // namespace syncer
// An instance of this class is basically our notion of a "sync client" for
// automation purposes. It harnesses the ProfileSyncService member of the
// profile passed to it on construction and automates certain things like setup
// and authentication. It provides ways to "wait" adequate periods of time for
// several clients to get to the same state.
class ProfileSyncServiceHarness {
public:
// The type of profile signin method to authenticate a profile.
enum class SigninType {
// Fakes user signin process.
FAKE_SIGNIN,
// Uses UI signin flow and connects to GAIA servers for authentication.
UI_SIGNIN
};
static std::unique_ptr<ProfileSyncServiceHarness> Create(
Profile* profile,
const std::string& username,
const std::string& password,
SigninType signin_type);
~ProfileSyncServiceHarness();
// Signs in to a primary account without actually enabling sync the feature.
bool SignInPrimaryAccount();
#if !defined(OS_CHROMEOS)
// Signs out of the primary account. ChromeOS doesn't have the concept of
// sign-out, so this only exists on other platforms.
void SignOutPrimaryAccount();
#endif // !OS_CHROMEOS
// Enters/exits the "Sync paused" state, which in real life happens if a
// syncing user signs out of the content area.
void EnterSyncPausedStateForPrimaryAccount();
void ExitSyncPausedStateForPrimaryAccount();
// Enables and configures sync for all available datatypes. Returns true only
// after sync has been fully initialized and authenticated, and we are ready
// to process changes.
bool SetupSync();
// Enables and configures sync only for the given |selected_types|.
// Does not wait for sync to be ready to process changes -- callers need to
// ensure this by calling AwaitSyncSetupCompletion() or
// AwaitSyncTransportActive().
// Returns true on success.
bool SetupSyncNoWaitForCompletion(
syncer::UserSelectableTypeSet selected_types);
// Same as SetupSyncNoWaitForCompletion(), but also sets the given encryption
// passphrase during setup.
bool SetupSyncWithEncryptionPassphraseNoWaitForCompletion(
syncer::UserSelectableTypeSet selected_types,
const std::string& passphrase);
// Same as SetupSyncNoWaitForCompletion(), but also sets the given decryption
// passphrase during setup.
bool SetupSyncWithDecryptionPassphraseNoWaitForCompletion(
syncer::UserSelectableTypeSet selected_types,
const std::string& passphrase);
// Signals that sync setup is complete, and that PSS may begin syncing.
// Typically SetupSync does this automatically, but if that returned false,
// then setup may have been left incomplete.
void FinishSyncSetup();
// Methods to stop and restart the sync service.
//
// For example, this can be used to simulate a sign-in/sign-out or can be
// useful to recover from a lost birthday.
// To start from a clear slate, clear server data first, then call
// StopSyncServiceAndClearData() followed by StartSyncService().
// To simulate the user being offline for a while, call
// StopSyncServiceWithoutClearingData() followed by StartSyncService().
// Stops the sync service and clears all local sync data.
void StopSyncServiceAndClearData();
// Stops the sync service but keeps all local sync data around.
void StopSyncServiceWithoutClearingData();
// Starts the sync service after a previous stop.
bool StartSyncService();
// Calling this acts as a barrier and blocks the caller until |this| and
// |partner| have both completed a sync cycle. When calling this method,
// the |partner| should be the passive responder who responds to the actions
// of |this|. This method relies upon the synchronization of callbacks
// from the message queue. Returns true if two sync cycles have completed.
// Note: Use this method when exactly one client makes local change(s), and
// exactly one client is waiting to receive those changes.
bool AwaitMutualSyncCycleCompletion(ProfileSyncServiceHarness* partner);
// Blocks the caller until every client in |clients| completes its ongoing
// sync cycle and all the clients' progress markers match. Note: Use this
// method when more than one client makes local change(s), and more than one
// client is waiting to receive those changes.
static bool AwaitQuiescence(
const std::vector<ProfileSyncServiceHarness*>& clients);
// Blocks the caller until the sync engine is initialized or some end state
// (e.g., auth error) is reached. Returns true only if the engine initialized
// successfully. See ProfileSyncService's IsEngineInitialized() method for the
// definition of engine initialization.
bool AwaitEngineInitialization();
// Blocks the caller until sync setup is complete, and sync-the-feature is
// active. Returns true if and only if sync setup completed successfully. Make
// sure to call SetupSync() or one of its variants before.
bool AwaitSyncSetupCompletion();
// Blocks the caller until the sync transport layer is active. Returns true if
// successful.
bool AwaitSyncTransportActive();
// Returns the ProfileSyncService member of the sync client.
syncer::ProfileSyncService* service() const { return service_; }
// Returns the debug name for this profile. Used for logging.
const std::string& profile_debug_name() const { return profile_debug_name_; }
// Enables sync for a particular selectable sync type (will enable sync for
// all corresponding datatypes). Returns true on success.
bool EnableSyncForType(syncer::UserSelectableType type);
// Disables sync for a particular selectable sync type (will enable sync for
// all corresponding datatypes). Returns true on success.
bool DisableSyncForType(syncer::UserSelectableType type);
// Enables sync for all registered sync datatypes. Returns true on success.
bool EnableSyncForRegisteredDatatypes();
// Disables sync for all sync datatypes. Returns true on success.
bool DisableSyncForAllDatatypes();
// Returns a snapshot of the current sync session.
syncer::SyncCycleSnapshot GetLastCycleSnapshot() const;
private:
enum class EncryptionSetupMode {
kNoEncryption, // Setup sync without encryption support.
kDecryption, // Setup sync with only decryption support. This only
// supports cases where there's already encrypted data on
// the server. Turning on custom passphrase encryption on
// this client is not supported.
kEncryption // Setup sync with full encryption support. This includes
// turning on custom passphrase encryption on the client.
};
ProfileSyncServiceHarness(Profile* profile,
const std::string& username,
const std::string& password,
SigninType signin_type);
// Sets up sync with custom passphrase support as specified by
// |encryption_mode|.
// If |encryption_mode| is kDecryption or kEncryption, |encryption_passphrase|
// has to have a value which will be used to properly setup sync.
bool SetupSyncImpl(syncer::UserSelectableTypeSet selected_types,
EncryptionSetupMode encryption_mode,
const base::Optional<std::string>& encryption_passphrase);
// Gets detailed status from |service_| in pretty-printable form.
std::string GetServiceStatus();
// Returns a string with relevant info about client's sync state (if
// available), annotated with |message|. Useful for logging.
std::string GetClientInfoString(const std::string& message) const;
// Returns true if the user has enabled and configured sync for this client.
// Note that this does not imply sync is actually running.
bool IsSyncEnabledByUser() const;
// Profile associated with this sync client.
Profile* const profile_;
// ProfileSyncService object associated with |profile_|.
syncer::ProfileSyncService* const service_;
// Prevents Sync from running until configuration is complete.
std::unique_ptr<syncer::SyncSetupInProgressHandle> sync_blocker_;
// Credentials used for GAIA authentication.
const std::string username_;
const std::string password_;
// Used to decide what method of profile signin to use.
const SigninType signin_type_;
// Used for logging.
const std::string profile_debug_name_;
DISALLOW_COPY_AND_ASSIGN(ProfileSyncServiceHarness);
};
#endif // CHROME_BROWSER_SYNC_TEST_INTEGRATION_PROFILE_SYNC_SERVICE_HARNESS_H_