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