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