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