// Copyright 2014 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_QUIESCE_STATUS_CHANGE_CHECKER_H_ #define CHROME_BROWSER_SYNC_TEST_INTEGRATION_QUIESCE_STATUS_CHANGE_CHECKER_H_ #include <vector> #include "base/basictypes.h" #include "base/compiler_specific.h" #include "base/memory/scoped_vector.h" #include "base/time/time.h" #include "chrome/browser/sync/test/integration/status_change_checker.h" class ProfileSyncService; class ProgressMarkerWatcher; // Waits until all provided clients have finished committing any unsynced items // and downloading each others' udpates. // // This requires that "self-notifications" be enabled. Otherwise the clients // will not fetch the latest progress markers on their own, and the latest // progress markers are needed to confirm that clients are in sync. // // There is a race condition here. If we manage to perform the check at // precisely the wrong time, we could end up seeing stale snapshot state // (crbug.com/95742), which would make us think that the client has finished // syncing when it hasn't. In practice, this race is rare enough that it // doesn't cause test failures. class QuiesceStatusChangeChecker : public StatusChangeChecker { public: explicit QuiesceStatusChangeChecker( std::vector<ProfileSyncService*> services); virtual ~QuiesceStatusChangeChecker(); // Timeout length for this operation. Default is 45s. virtual base::TimeDelta GetTimeoutDuration(); // Blocks until all clients have quiesced or we time out. void Wait(); // A callback function for some helper objects. void OnServiceStateChanged(ProfileSyncService* service); // A callback for when the time limit is exceeded. void OnTimeout(); virtual bool IsExitConditionSatisfied() OVERRIDE; virtual std::string GetDebugMessage() const OVERRIDE; bool TimedOut() const; private: std::vector<ProfileSyncService*> services_; ScopedVector<ProgressMarkerWatcher> observers_; bool timed_out_; DISALLOW_COPY_AND_ASSIGN(QuiesceStatusChangeChecker); }; #endif // CHROME_BROWSER_SYNC_TEST_INTEGRATION_QUIESCE_STATUS_CHANGE_CHECKER_H_