waiter.cc revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
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#include "chrome/test/remoting/waiter.h" 6 7#include "content/public/test/test_utils.h" 8 9namespace remoting { 10 11TimeoutWaiter::TimeoutWaiter(base::TimeDelta timeout) 12 : timeout_(timeout) { 13 DCHECK(timeout > base::TimeDelta::FromSeconds(0)); 14} 15 16TimeoutWaiter::~TimeoutWaiter() {} 17 18bool TimeoutWaiter::Wait() { 19 DCHECK(!timeout_timer_.IsRunning()); 20 21 timeout_timer_.Start( 22 FROM_HERE, 23 timeout_, 24 base::Bind(&TimeoutWaiter::CancelWaitCallback, base::Unretained(this))); 25 26 message_loop_runner_ = new content::MessageLoopRunner; 27 message_loop_runner_->Run(); 28 29 return true; 30} 31 32void TimeoutWaiter::CancelWait() { 33 message_loop_runner_->Quit(); 34} 35 36void TimeoutWaiter::CancelWaitCallback() { 37 CancelWait(); 38} 39 40ConditionalTimeoutWaiter::ConditionalTimeoutWaiter(base::TimeDelta timeout, 41 base::TimeDelta interval, 42 const Predicate& callback) 43 : TimeoutWaiter(timeout), 44 interval_(interval), 45 callback_(callback), 46 success_(false) { 47 DCHECK(timeout > interval); 48} 49 50ConditionalTimeoutWaiter::~ConditionalTimeoutWaiter() {} 51 52bool ConditionalTimeoutWaiter::Wait() { 53 DCHECK(!condition_timer_.IsRunning()); 54 55 condition_timer_.Start( 56 FROM_HERE, 57 interval_, 58 base::Bind(&ConditionalTimeoutWaiter::CancelWaitCallback, 59 base::Unretained(this))); 60 61 // Also call the base class Wait() to start the timeout timer. 62 TimeoutWaiter::Wait(); 63 64 return success_; 65} 66 67void ConditionalTimeoutWaiter::CancelWait() { 68 condition_timer_.Stop(); 69 70 // Also call the base class CancelWait() to stop the timeout timer. 71 TimeoutWaiter::CancelWait(); 72} 73 74void ConditionalTimeoutWaiter::CancelWaitCallback() { 75 if (callback_.Run()) { 76 success_ = true; 77 CancelWait(); 78 } 79} 80 81} // namespace remoting 82