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 16class ProfileSyncService; 17class 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. 31class 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