1d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// found in the LICENSE file.
4d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/test/remoting/waiter.h"
6d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
7d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/public/test/test_utils.h"
8d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace remoting {
10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TimeoutWaiter::TimeoutWaiter(base::TimeDelta timeout)
12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    : timeout_(timeout) {
13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DCHECK(timeout > base::TimeDelta::FromSeconds(0));
14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
15d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TimeoutWaiter::~TimeoutWaiter() {}
17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)bool TimeoutWaiter::Wait() {
19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DCHECK(!timeout_timer_.IsRunning());
20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
21d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  timeout_timer_.Start(
22d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      FROM_HERE,
23d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      timeout_,
24d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      base::Bind(&TimeoutWaiter::CancelWaitCallback, base::Unretained(this)));
25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
26d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  message_loop_runner_ = new content::MessageLoopRunner;
27d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  message_loop_runner_->Run();
28d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
29d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return true;
30d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
32d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void TimeoutWaiter::CancelWait() {
33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  message_loop_runner_->Quit();
34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
36d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void TimeoutWaiter::CancelWaitCallback() {
37d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  CancelWait();
38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)ConditionalTimeoutWaiter::ConditionalTimeoutWaiter(base::TimeDelta timeout,
41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                                   base::TimeDelta interval,
42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                                   const Predicate& callback)
43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    : TimeoutWaiter(timeout),
44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      interval_(interval),
45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      callback_(callback),
46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      success_(false) {
47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DCHECK(timeout > interval);
48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
49d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)ConditionalTimeoutWaiter::~ConditionalTimeoutWaiter() {}
51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)bool ConditionalTimeoutWaiter::Wait() {
53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DCHECK(!condition_timer_.IsRunning());
54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  condition_timer_.Start(
56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      FROM_HERE,
57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      interval_,
58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      base::Bind(&ConditionalTimeoutWaiter::CancelWaitCallback,
59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                 base::Unretained(this)));
60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Also call the base class Wait() to start the timeout timer.
62d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  TimeoutWaiter::Wait();
63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return success_;
65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void ConditionalTimeoutWaiter::CancelWait() {
68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  condition_timer_.Stop();
69d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
70d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Also call the base class CancelWait() to stop the timeout timer.
71d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  TimeoutWaiter::CancelWait();
72d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
73d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
74d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void ConditionalTimeoutWaiter::CancelWaitCallback() {
75d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (callback_.Run()) {
76d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    success_ = true;
774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    CancelWait();
78d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
81d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}  // namespace remoting
82