Index: chrome/browser/sync/test/integration/quiesce_status_change_checker.h |
diff --git a/chrome/browser/sync/test/integration/quiesce_status_change_checker.h b/chrome/browser/sync/test/integration/quiesce_status_change_checker.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..37ec7e9b5431f2539b8859a1ba06aa3e7c7ad56a |
--- /dev/null |
+++ b/chrome/browser/sync/test/integration/quiesce_status_change_checker.h |
@@ -0,0 +1,52 @@ |
+// 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 "chrome/browser/sync/test/integration/status_change_checker.h" |
+ |
+class ProfileSyncService; |
+class ProgressMarkerWatcher; |
+class ProfileSyncServiceHarness; |
+ |
+// 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(); |
+ |
+ virtual bool IsExitConditionSatisfied() OVERRIDE; |
+ virtual std::string GetDebugMessage() const OVERRIDE; |
+ virtual void InitObserver(ProfileSyncServiceHarness* harness) OVERRIDE; |
+ virtual void UninitObserver(ProfileSyncServiceHarness* harness) OVERRIDE; |
+ |
+ void OnServiceStateChanged(ProfileSyncService* service); |
+ |
+ private: |
+ std::vector<ProfileSyncService*> services_; |
+ ScopedVector<ProgressMarkerWatcher> observers_; |
+ ProfileSyncServiceHarness* harness_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(QuiesceStatusChangeChecker); |
+}; |
+ |
+#endif // CHROME_BROWSER_SYNC_TEST_INTEGRATION_QUIESCE_STATUS_CHANGE_CHECKER_H_ |