// 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 <string> #include <vector> #include "base/basictypes.h" #include "base/compiler_specific.h" #include "sync/internal_api/public/base/model_type.h" #include "sync/internal_api/public/sessions/sync_session_snapshot.h" class Profile; class ProfileSyncService; // 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: static ProfileSyncServiceHarness* Create( Profile* profile, const std::string& username, const std::string& password); virtual ~ProfileSyncServiceHarness(); // Sets the GAIA credentials with which to sign in to sync. void SetCredentials(const std::string& username, const std::string& password); // Creates a ProfileSyncService for the profile passed at construction and // enables 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(); // Same as the above method, but enables sync only for the datatypes contained // in |synced_datatypes|. bool SetupSync(syncer::ModelTypeSet synced_datatypes); // 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 |this| completes its ongoing sync cycle and every // other client in |partners| have achieved identical download progresses. // Note: Use this method when exactly one client makes local change(s), // and more than one client is waiting to receive those changes. bool AwaitGroupSyncCycleCompletion( std::vector<ProfileSyncServiceHarness*>& partners); // 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( std::vector<ProfileSyncServiceHarness*>& clients); // Returns the ProfileSyncService member of the sync client. 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 sync datatype. Returns true on success. bool EnableSyncForDatatype(syncer::ModelType datatype); // Disables sync for a particular sync datatype. Returns true on success. bool DisableSyncForDatatype(syncer::ModelType datatype); // Enables sync for all sync datatypes. Returns true on success. bool EnableSyncForAllDatatypes(); // Disables sync for all sync datatypes. Returns true on success. bool DisableSyncForAllDatatypes(); // Returns a snapshot of the current sync session. syncer::sessions::SyncSessionSnapshot GetLastSessionSnapshot() const; // Check if |type| is being synced. bool IsTypePreferred(syncer::ModelType type); // Returns a string that can be used as the value of an oauth2 refresh token. // This function guarantees that a different string is returned each time // it is called. std::string GenerateFakeOAuth2RefreshTokenString(); // 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; private: ProfileSyncServiceHarness( Profile* profile, const std::string& username, const std::string& password); // Signals that sync setup is complete, and that PSS may begin syncing. void FinishSyncSetup(); // Gets detailed status from |service_| in pretty-printable form. std::string GetServiceStatus(); // Returns true if sync is disabled for this client. bool IsSyncDisabled() const; // Sync profile associated with this sync client. Profile* profile_; // ProfileSyncService object associated with |profile_|. ProfileSyncService* service_; // Credentials used for GAIA authentication. std::string username_; std::string password_; // Number used by GenerateFakeOAuth2RefreshTokenString() to make sure that // all refresh tokens used in the tests are different. int oauth2_refesh_token_number_; // 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_