1// Copyright 2013 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/status_change_checker.h"
6
7#include "base/logging.h"
8#include "base/message_loop/message_loop.h"
9#include "base/timer/timer.h"
10
11StatusChangeChecker::StatusChangeChecker() : timed_out_(false) {
12}
13
14StatusChangeChecker::~StatusChangeChecker() {}
15
16bool StatusChangeChecker::TimedOut() const {
17  return timed_out_;
18}
19
20base::TimeDelta StatusChangeChecker::GetTimeoutDuration() {
21  return base::TimeDelta::FromSeconds(45);
22}
23
24void StatusChangeChecker::StartBlockingWait() {
25  base::OneShotTimer<StatusChangeChecker> timer;
26  timer.Start(FROM_HERE,
27              GetTimeoutDuration(),
28              base::Bind(&StatusChangeChecker::OnTimeout,
29                         base::Unretained(this)));
30
31  {
32    base::MessageLoop* loop = base::MessageLoop::current();
33    base::MessageLoop::ScopedNestableTaskAllower allow(loop);
34    loop->Run();
35  }
36}
37
38void StatusChangeChecker::StopWaiting() {
39  base::MessageLoop::current()->QuitWhenIdle();
40}
41
42void StatusChangeChecker::CheckExitCondition() {
43  DVLOG(1) << "Await -> Checking Condition: " << GetDebugMessage();
44  if (IsExitConditionSatisfied()) {
45    DVLOG(1) << "Await -> Condition met: " << GetDebugMessage();
46    StopWaiting();
47  }
48}
49
50void StatusChangeChecker::OnTimeout() {
51  DVLOG(1) << "Await -> Timed out: " << GetDebugMessage();
52  timed_out_ = true;
53  StopWaiting();
54}
55