1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_SYNC_TEST_INTEGRATION_QUIESCE_STATUS_CHANGE_CHECKER_H_ 6 #define CHROME_BROWSER_SYNC_TEST_INTEGRATION_QUIESCE_STATUS_CHANGE_CHECKER_H_ 7 8 #include <vector> 9 10 #include "base/basictypes.h" 11 #include "base/compiler_specific.h" 12 #include "base/memory/scoped_vector.h" 13 #include "base/time/time.h" 14 #include "chrome/browser/sync/test/integration/status_change_checker.h" 15 16 class ProfileSyncService; 17 class ProgressMarkerWatcher; 18 19 // Waits until all provided clients have finished committing any unsynced items 20 // and downloading each others' udpates. 21 // 22 // This requires that "self-notifications" be enabled. Otherwise the clients 23 // will not fetch the latest progress markers on their own, and the latest 24 // progress markers are needed to confirm that clients are in sync. 25 // 26 // There is a race condition here. If we manage to perform the check at 27 // precisely the wrong time, we could end up seeing stale snapshot state 28 // (crbug.com/95742), which would make us think that the client has finished 29 // syncing when it hasn't. In practice, this race is rare enough that it 30 // doesn't cause test failures. 31 class QuiesceStatusChangeChecker : public StatusChangeChecker { 32 public: 33 explicit QuiesceStatusChangeChecker( 34 std::vector<ProfileSyncService*> services); 35 virtual ~QuiesceStatusChangeChecker(); 36 37 // Blocks until all clients have quiesced or we time out. 38 void Wait(); 39 40 // A callback function for some helper objects. 41 void OnServiceStateChanged(ProfileSyncService* service); 42 43 // Implementation of StatusChangeChecker. 44 virtual bool IsExitConditionSatisfied() OVERRIDE; 45 virtual std::string GetDebugMessage() const OVERRIDE; 46 47 private: 48 std::vector<ProfileSyncService*> services_; 49 ScopedVector<ProgressMarkerWatcher> observers_; 50 51 DISALLOW_COPY_AND_ASSIGN(QuiesceStatusChangeChecker); 52 }; 53 54 #endif // CHROME_BROWSER_SYNC_TEST_INTEGRATION_QUIESCE_STATUS_CHANGE_CHECKER_H_ 55