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)#ifndef CHROME_TEST_REMOTING_WAITER_H_
64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define CHROME_TEST_REMOTING_WAITER_H_
7d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
8d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/timer/timer.h"
9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace content {
11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class MessageLoopRunner;
12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace remoting {
15d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Block the execution of the test code for the specified number of
17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// milliseconds while keeping the message loop running. The browser instance
18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// will be responsive during the wait and test actions initiated before
19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// the wait will keep running.
20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class TimeoutWaiter {
21d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) public:
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  explicit TimeoutWaiter(base::TimeDelta timeout);
23d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual ~TimeoutWaiter();
24d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Returns true in case of success.
26d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // For TimeoutWaiter it should always be true.
27d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual bool Wait();
28d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
29d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) protected:
30d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual void CancelWait();
31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
32d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) private:
33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Callback used to cancel the TimeoutWaiter::Wait.
34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  void CancelWaitCallback();
35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
36d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::OneShotTimer<TimeoutWaiter> timeout_timer_;
37d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::TimeDelta timeout_;
38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TimeoutWaiter);
41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)};
42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// With a message loop running, keep calling callback in the specified
44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// interval until true is returned.
45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class ConditionalTimeoutWaiter : public TimeoutWaiter {
46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) public:
47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  typedef base::Callback<bool(void)> Predicate;
48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
49d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ConditionalTimeoutWaiter(base::TimeDelta timeout,
50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                           base::TimeDelta interval,
51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                           const Predicate& callback);
52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual ~ConditionalTimeoutWaiter();
53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Returns true if |callback_| returned true and false in case of timeout.
55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual bool Wait() OVERRIDE;
56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) protected:
58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual void CancelWait() OVERRIDE;
59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) private:
61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Callback used to cancel the ConditionalTimeoutWaiter::Wait.
62d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  void CancelWaitCallback();
63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::TimeDelta interval_;
65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  Predicate callback_;
66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RepeatingTimer<ConditionalTimeoutWaiter> condition_timer_;
67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool success_;
68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
69d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ConditionalTimeoutWaiter);
70d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)};
71d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
72d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}  // namespace remoting
73d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif  // CHROME_TEST_REMOTING_WAITER_H_
75