Home | History | Annotate | Download | only in integration
      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