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