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/test/remoting/waiter.h"
6
7#include "content/public/test/test_utils.h"
8
9namespace remoting {
10
11TimeoutWaiter::TimeoutWaiter(base::TimeDelta timeout)
12    : timeout_(timeout) {
13  DCHECK(timeout > base::TimeDelta::FromSeconds(0));
14}
15
16TimeoutWaiter::~TimeoutWaiter() {}
17
18bool TimeoutWaiter::Wait() {
19  DCHECK(!timeout_timer_.IsRunning());
20
21  timeout_timer_.Start(
22      FROM_HERE,
23      timeout_,
24      base::Bind(&TimeoutWaiter::CancelWaitCallback, base::Unretained(this)));
25
26  message_loop_runner_ = new content::MessageLoopRunner;
27  message_loop_runner_->Run();
28
29  return true;
30}
31
32void TimeoutWaiter::CancelWait() {
33  message_loop_runner_->Quit();
34}
35
36void TimeoutWaiter::CancelWaitCallback() {
37  CancelWait();
38}
39
40ConditionalTimeoutWaiter::ConditionalTimeoutWaiter(base::TimeDelta timeout,
41                                                   base::TimeDelta interval,
42                                                   const Predicate& callback)
43    : TimeoutWaiter(timeout),
44      interval_(interval),
45      callback_(callback),
46      success_(false) {
47  DCHECK(timeout > interval);
48}
49
50ConditionalTimeoutWaiter::~ConditionalTimeoutWaiter() {}
51
52bool ConditionalTimeoutWaiter::Wait() {
53  DCHECK(!condition_timer_.IsRunning());
54
55  condition_timer_.Start(
56      FROM_HERE,
57      interval_,
58      base::Bind(&ConditionalTimeoutWaiter::CancelWaitCallback,
59                 base::Unretained(this)));
60
61  // Also call the base class Wait() to start the timeout timer.
62  TimeoutWaiter::Wait();
63
64  return success_;
65}
66
67void ConditionalTimeoutWaiter::CancelWait() {
68  condition_timer_.Stop();
69
70  // Also call the base class CancelWait() to stop the timeout timer.
71  TimeoutWaiter::CancelWait();
72}
73
74void ConditionalTimeoutWaiter::CancelWaitCallback() {
75  if (callback_.Run()) {
76    success_ = true;
77    CancelWait();
78  }
79}
80
81}  // namespace remoting
82