• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
9 namespace remoting {
10 
TimeoutWaiter(base::TimeDelta timeout)11 TimeoutWaiter::TimeoutWaiter(base::TimeDelta timeout)
12     : timeout_(timeout) {
13   DCHECK(timeout > base::TimeDelta::FromSeconds(0));
14 }
15 
~TimeoutWaiter()16 TimeoutWaiter::~TimeoutWaiter() {}
17 
Wait()18 bool 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 
CancelWait()32 void TimeoutWaiter::CancelWait() {
33   message_loop_runner_->Quit();
34 }
35 
CancelWaitCallback()36 void TimeoutWaiter::CancelWaitCallback() {
37   CancelWait();
38 }
39 
ConditionalTimeoutWaiter(base::TimeDelta timeout,base::TimeDelta interval,const Predicate & callback)40 ConditionalTimeoutWaiter::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 
~ConditionalTimeoutWaiter()50 ConditionalTimeoutWaiter::~ConditionalTimeoutWaiter() {}
51 
Wait()52 bool 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 
CancelWait()67 void ConditionalTimeoutWaiter::CancelWait() {
68   condition_timer_.Stop();
69 
70   // Also call the base class CancelWait() to stop the timeout timer.
71   TimeoutWaiter::CancelWait();
72 }
73 
CancelWaitCallback()74 void ConditionalTimeoutWaiter::CancelWaitCallback() {
75   if (callback_.Run()) {
76     success_ = true;
77     CancelWait();
78   }
79 }
80 
81 }  // namespace remoting
82