multi_client_status_change_checker.cc revision e5d81f57cb97b3b6b7fccc9c5610d21eb81db09d
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#include "chrome/browser/sync/test/integration/multi_client_status_change_checker.h"
6
7#include "base/logging.h"
8#include "base/scoped_observer.h"
9#include "chrome/browser/sync/profile_sync_service.h"
10
11MultiClientStatusChangeChecker::MultiClientStatusChangeChecker(
12    std::vector<ProfileSyncService*> services)
13  : services_(services), timed_out_(false) {}
14
15MultiClientStatusChangeChecker::~MultiClientStatusChangeChecker() {}
16
17base::TimeDelta MultiClientStatusChangeChecker::GetTimeoutDuration() {
18  return base::TimeDelta::FromSeconds(45);
19}
20void MultiClientStatusChangeChecker::OnTimeout() {
21  DVLOG(1) << "Await -> Timed out: " << GetDebugMessage();
22  timed_out_ = true;
23  base::MessageLoop::current()->QuitWhenIdle();
24}
25
26void MultiClientStatusChangeChecker::Wait() {
27  DVLOG(1) << "Await: " << GetDebugMessage();
28
29  if (IsExitConditionSatisfied()) {
30    DVLOG(1) << "Await -> Exit before waiting: " << GetDebugMessage();
31    return;
32  }
33
34  ScopedObserver<ProfileSyncService, MultiClientStatusChangeChecker> obs(this);
35  for (std::vector<ProfileSyncService*>::iterator it = services_.begin();
36       it != services_.end(); ++it) {
37    obs.Add(*it);
38  }
39
40  base::OneShotTimer<MultiClientStatusChangeChecker> timer;
41  timer.Start(FROM_HERE,
42              GetTimeoutDuration(),
43              base::Bind(&MultiClientStatusChangeChecker::OnTimeout,
44                         base::Unretained(this)));
45
46  {
47    base::MessageLoop* loop = base::MessageLoop::current();
48    base::MessageLoop::ScopedNestableTaskAllower allow(loop);
49    loop->Run();
50  }
51}
52
53void MultiClientStatusChangeChecker::OnStateChanged() {
54  DVLOG(1) << "Await -> Checking Condition: " << GetDebugMessage();
55  if (IsExitConditionSatisfied()) {
56    DVLOG(1) << "Await -> Condition met: " << GetDebugMessage();
57    base::MessageLoop::current()->QuitWhenIdle();
58  }
59}
60
61bool MultiClientStatusChangeChecker::TimedOut() {
62  return timed_out_;
63}
64