// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/test/remoting/waiter.h" #include "content/public/test/test_utils.h" namespace remoting { TimeoutWaiter::TimeoutWaiter(base::TimeDelta timeout) : timeout_(timeout) { DCHECK(timeout > base::TimeDelta::FromSeconds(0)); } TimeoutWaiter::~TimeoutWaiter() {} bool TimeoutWaiter::Wait() { DCHECK(!timeout_timer_.IsRunning()); timeout_timer_.Start( FROM_HERE, timeout_, base::Bind(&TimeoutWaiter::CancelWaitCallback, base::Unretained(this))); message_loop_runner_ = new content::MessageLoopRunner; message_loop_runner_->Run(); return true; } void TimeoutWaiter::CancelWait() { message_loop_runner_->Quit(); } void TimeoutWaiter::CancelWaitCallback() { CancelWait(); } ConditionalTimeoutWaiter::ConditionalTimeoutWaiter(base::TimeDelta timeout, base::TimeDelta interval, const Predicate& callback) : TimeoutWaiter(timeout), interval_(interval), callback_(callback), success_(false) { DCHECK(timeout > interval); } ConditionalTimeoutWaiter::~ConditionalTimeoutWaiter() {} bool ConditionalTimeoutWaiter::Wait() { DCHECK(!condition_timer_.IsRunning()); condition_timer_.Start( FROM_HERE, interval_, base::Bind(&ConditionalTimeoutWaiter::CancelWaitCallback, base::Unretained(this))); // Also call the base class Wait() to start the timeout timer. TimeoutWaiter::Wait(); return success_; } void ConditionalTimeoutWaiter::CancelWait() { condition_timer_.Stop(); // Also call the base class CancelWait() to stop the timeout timer. TimeoutWaiter::CancelWait(); } void ConditionalTimeoutWaiter::CancelWaitCallback() { if (callback_.Run()) { success_ = true; CancelWait(); } } } // namespace remoting