| OLD | NEW | 
|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "base/timer/timer.h" | 5 #include "base/timer/timer.h" | 
| 6 | 6 | 
| 7 #include <stddef.h> | 7 #include <stddef.h> | 
| 8 | 8 | 
| 9 #include <memory> | 9 #include <memory> | 
| 10 | 10 | 
| 11 #include "base/bind.h" | 11 #include "base/bind.h" | 
| 12 #include "base/bind_helpers.h" | 12 #include "base/bind_helpers.h" | 
|  | 13 #include "base/callback.h" | 
| 13 #include "base/macros.h" | 14 #include "base/macros.h" | 
|  | 15 #include "base/memory/ptr_util.h" | 
| 14 #include "base/message_loop/message_loop.h" | 16 #include "base/message_loop/message_loop.h" | 
| 15 #include "base/run_loop.h" | 17 #include "base/run_loop.h" | 
|  | 18 #include "base/sequenced_task_runner.h" | 
|  | 19 #include "base/single_thread_task_runner.h" | 
|  | 20 #include "base/synchronization/waitable_event.h" | 
|  | 21 #include "base/test/sequenced_worker_pool_owner.h" | 
| 16 #include "base/test/test_mock_time_task_runner.h" | 22 #include "base/test/test_mock_time_task_runner.h" | 
| 17 #include "base/test/test_simple_task_runner.h" | 23 #include "base/threading/platform_thread.h" | 
|  | 24 #include "base/threading/sequenced_task_runner_handle.h" | 
|  | 25 #include "base/threading/thread.h" | 
| 18 #include "base/threading/thread_task_runner_handle.h" | 26 #include "base/threading/thread_task_runner_handle.h" | 
| 19 #include "base/time/tick_clock.h" | 27 #include "base/time/tick_clock.h" | 
|  | 28 #include "base/time/time.h" | 
| 20 #include "build/build_config.h" | 29 #include "build/build_config.h" | 
| 21 #include "testing/gtest/include/gtest/gtest.h" | 30 #include "testing/gtest/include/gtest/gtest.h" | 
| 22 | 31 | 
| 23 using base::TimeDelta; | 32 namespace base { | 
| 24 using base::SingleThreadTaskRunner; |  | 
| 25 | 33 | 
| 26 namespace { | 34 namespace { | 
| 27 | 35 | 
| 28 // The message loops on which each timer should be tested. | 36 // The message loops on which each timer should be tested. | 
| 29 const base::MessageLoop::Type testing_message_loops[] = { | 37 const MessageLoop::Type testing_message_loops[] = { | 
| 30   base::MessageLoop::TYPE_DEFAULT, | 38     MessageLoop::TYPE_DEFAULT, MessageLoop::TYPE_IO, | 
| 31   base::MessageLoop::TYPE_IO, |  | 
| 32 #if !defined(OS_IOS)  // iOS does not allow direct running of the UI loop. | 39 #if !defined(OS_IOS)  // iOS does not allow direct running of the UI loop. | 
| 33   base::MessageLoop::TYPE_UI, | 40     MessageLoop::TYPE_UI, | 
| 34 #endif | 41 #endif | 
| 35 }; | 42 }; | 
| 36 | 43 | 
| 37 const int kNumTestingMessageLoops = arraysize(testing_message_loops); | 44 const int kNumTestingMessageLoops = arraysize(testing_message_loops); | 
| 38 | 45 | 
| 39 class Receiver { | 46 class Receiver { | 
| 40  public: | 47  public: | 
| 41   Receiver() : count_(0) {} | 48   Receiver() : count_(0) {} | 
| 42   void OnCalled() { count_++; } | 49   void OnCalled() { count_++; } | 
| 43   bool WasCalled() { return count_ > 0; } | 50   bool WasCalled() { return count_ > 0; } | 
| 44   int TimesCalled() { return count_; } | 51   int TimesCalled() { return count_; } | 
| 45 | 52 | 
| 46  private: | 53  private: | 
| 47   int count_; | 54   int count_; | 
| 48 }; | 55 }; | 
| 49 | 56 | 
| 50 class OneShotTimerTester { | 57 class OneShotTimerTester { | 
| 51  public: | 58  public: | 
| 52   explicit OneShotTimerTester(bool* did_run, unsigned milliseconds = 10) | 59   // |did_run|, if provided, will be signaled when Run() fires. | 
| 53       : did_run_(did_run), | 60   explicit OneShotTimerTester( | 
| 54         delay_ms_(milliseconds), | 61       WaitableEvent* did_run = nullptr, | 
| 55         quit_message_loop_(true) { | 62       const TimeDelta& delay = TimeDelta::FromMilliseconds(10)) | 
|  | 63       : quit_closure_(run_loop_.QuitClosure()), | 
|  | 64         did_run_(did_run), | 
|  | 65         delay_(delay) {} | 
|  | 66 | 
|  | 67   virtual ~OneShotTimerTester() = default; | 
|  | 68 | 
|  | 69   void SetTaskRunner(scoped_refptr<SingleThreadTaskRunner> task_runner) { | 
|  | 70     timer_->SetTaskRunner(std::move(task_runner)); | 
|  | 71 | 
|  | 72     // Run() will be invoked on |task_runner| but |run_loop_|'s QuitClosure | 
|  | 73     // needs to run on this thread (where the MessageLoop lives). | 
|  | 74     quit_closure_ = | 
|  | 75         Bind(IgnoreResult(&SingleThreadTaskRunner::PostTask), | 
|  | 76              ThreadTaskRunnerHandle::Get(), FROM_HERE, run_loop_.QuitClosure()); | 
| 56   } | 77   } | 
| 57 | 78 | 
| 58   void Start() { | 79   void Start() { | 
| 59     timer_.Start(FROM_HERE, TimeDelta::FromMilliseconds(delay_ms_), this, | 80     started_time_ = TimeTicks::Now(); | 
| 60                  &OneShotTimerTester::Run); | 81     timer_->Start(FROM_HERE, delay_, this, &OneShotTimerTester::Run); | 
| 61   } | 82   } | 
| 62 | 83 | 
| 63   void SetTaskRunner(scoped_refptr<SingleThreadTaskRunner> task_runner) { | 84   // Blocks until Run() executes and confirms that Run() didn't fire before | 
| 64     quit_message_loop_ = false; | 85   // |delay_| expired. | 
| 65     timer_.SetTaskRunner(task_runner); | 86   void WaitAndConfirmTimerFiredAfterDelay() { | 
| 66   } | 87     run_loop_.Run(); | 
|  | 88 | 
|  | 89     EXPECT_NE(TimeTicks(), started_time_); | 
|  | 90     EXPECT_GE(TimeTicks::Now() - started_time_, delay_); | 
|  | 91   } | 
|  | 92 | 
|  | 93   bool IsRunning() { return timer_->IsRunning(); } | 
|  | 94 | 
|  | 95  protected: | 
|  | 96   // Overridable method to do things on Run() before signaling events/closures | 
|  | 97   // managed by this helper. | 
|  | 98   virtual void OnRun() {} | 
|  | 99 | 
|  | 100   std::unique_ptr<OneShotTimer> timer_ = MakeUnique<OneShotTimer>(); | 
| 67 | 101 | 
| 68  private: | 102  private: | 
| 69   void Run() { | 103   void Run() { | 
| 70     *did_run_ = true; | 104     OnRun(); | 
| 71     if (quit_message_loop_) { | 105     if (did_run_) { | 
| 72       base::MessageLoop::current()->QuitWhenIdle(); | 106       EXPECT_FALSE(did_run_->IsSignaled()); | 
|  | 107       did_run_->Signal(); | 
| 73     } | 108     } | 
| 74   } | 109     quit_closure_.Run(); | 
| 75 | 110   } | 
| 76   bool* did_run_; | 111 | 
| 77   base::OneShotTimer timer_; | 112   RunLoop run_loop_; | 
| 78   const unsigned delay_ms_; | 113   Closure quit_closure_; | 
| 79   bool quit_message_loop_; | 114   WaitableEvent* const did_run_; | 
|  | 115 | 
|  | 116   const TimeDelta delay_; | 
|  | 117   TimeTicks started_time_; | 
|  | 118 | 
|  | 119   DISALLOW_COPY_AND_ASSIGN(OneShotTimerTester); | 
| 80 }; | 120 }; | 
| 81 | 121 | 
| 82 class OneShotSelfDeletingTimerTester { | 122 class OneShotSelfDeletingTimerTester : public OneShotTimerTester { | 
| 83  public: | 123  protected: | 
| 84   explicit OneShotSelfDeletingTimerTester(bool* did_run) | 124   void OnRun() override { timer_.reset(); } | 
| 85       : did_run_(did_run), timer_(new base::OneShotTimer()) {} |  | 
| 86 |  | 
| 87   void Start() { |  | 
| 88     timer_->Start(FROM_HERE, TimeDelta::FromMilliseconds(10), this, |  | 
| 89                   &OneShotSelfDeletingTimerTester::Run); |  | 
| 90   } |  | 
| 91 |  | 
| 92  private: |  | 
| 93   void Run() { |  | 
| 94     *did_run_ = true; |  | 
| 95     timer_.reset(); |  | 
| 96     base::MessageLoop::current()->QuitWhenIdle(); |  | 
| 97   } |  | 
| 98 |  | 
| 99   bool* did_run_; |  | 
| 100   std::unique_ptr<base::OneShotTimer> timer_; |  | 
| 101 }; | 125 }; | 
| 102 | 126 | 
|  | 127 constexpr int kNumRepeats = 10; | 
|  | 128 | 
| 103 class RepeatingTimerTester { | 129 class RepeatingTimerTester { | 
| 104  public: | 130  public: | 
| 105   explicit RepeatingTimerTester(bool* did_run, const TimeDelta& delay) | 131   explicit RepeatingTimerTester(WaitableEvent* did_run, const TimeDelta& delay) | 
| 106       : did_run_(did_run), counter_(10), delay_(delay) { | 132       : counter_(kNumRepeats), | 
| 107   } | 133         quit_closure_(run_loop_.QuitClosure()), | 
|  | 134         did_run_(did_run), | 
|  | 135         delay_(delay) {} | 
| 108 | 136 | 
| 109   void Start() { | 137   void Start() { | 
|  | 138     started_time_ = TimeTicks::Now(); | 
| 110     timer_.Start(FROM_HERE, delay_, this, &RepeatingTimerTester::Run); | 139     timer_.Start(FROM_HERE, delay_, this, &RepeatingTimerTester::Run); | 
| 111   } | 140   } | 
| 112 | 141 | 
|  | 142   void WaitAndConfirmTimerFiredRepeatedlyAfterDelay() { | 
|  | 143     run_loop_.Run(); | 
|  | 144 | 
|  | 145     EXPECT_NE(TimeTicks(), started_time_); | 
|  | 146     EXPECT_GE(TimeTicks::Now() - started_time_, kNumRepeats * delay_); | 
|  | 147   } | 
|  | 148 | 
| 113  private: | 149  private: | 
| 114   void Run() { | 150   void Run() { | 
| 115     if (--counter_ == 0) { | 151     if (--counter_ == 0) { | 
| 116       *did_run_ = true; | 152       if (did_run_) { | 
|  | 153         EXPECT_FALSE(did_run_->IsSignaled()); | 
|  | 154         did_run_->Signal(); | 
|  | 155       } | 
| 117       timer_.Stop(); | 156       timer_.Stop(); | 
| 118       base::MessageLoop::current()->QuitWhenIdle(); | 157       quit_closure_.Run(); | 
| 119     } | 158     } | 
| 120   } | 159   } | 
| 121 | 160 | 
| 122   bool* did_run_; | 161   RepeatingTimer timer_; | 
| 123   int counter_; | 162   int counter_; | 
| 124   TimeDelta delay_; | 163 | 
| 125   base::RepeatingTimer timer_; | 164   RunLoop run_loop_; | 
|  | 165   Closure quit_closure_; | 
|  | 166   WaitableEvent* const did_run_; | 
|  | 167 | 
|  | 168   const TimeDelta delay_; | 
|  | 169   TimeTicks started_time_; | 
|  | 170 | 
|  | 171   DISALLOW_COPY_AND_ASSIGN(RepeatingTimerTester); | 
| 126 }; | 172 }; | 
| 127 | 173 | 
| 128 void RunTest_OneShotTimer(base::MessageLoop::Type message_loop_type) { | 174 // Basic test with same setup as RunTest_OneShotTimers_Cancel below to confirm | 
| 129   base::MessageLoop loop(message_loop_type); | 175 // that |did_run_a| would be signaled in that test if it wasn't for the | 
| 130 | 176 // deletion. | 
| 131   bool did_run = false; | 177 void RunTest_OneShotTimers(MessageLoop::Type message_loop_type) { | 
| 132   OneShotTimerTester f(&did_run); | 178   MessageLoop loop(message_loop_type); | 
| 133   f.Start(); | 179 | 
| 134 | 180   WaitableEvent did_run_a(WaitableEvent::ResetPolicy::MANUAL, | 
| 135   base::RunLoop().Run(); | 181                           WaitableEvent::InitialState::NOT_SIGNALED); | 
| 136 | 182   OneShotTimerTester a(&did_run_a); | 
| 137   EXPECT_TRUE(did_run); | 183   a.Start(); | 
| 138 } | 184 | 
| 139 | 185   OneShotTimerTester b; | 
| 140 void RunTest_OneShotTimer_Cancel(base::MessageLoop::Type message_loop_type) { | 186   b.Start(); | 
| 141   base::MessageLoop loop(message_loop_type); | 187 | 
| 142 | 188   b.WaitAndConfirmTimerFiredAfterDelay(); | 
| 143   bool did_run_a = false; | 189 | 
|  | 190   EXPECT_TRUE(did_run_a.IsSignaled()); | 
|  | 191 } | 
|  | 192 | 
|  | 193 void RunTest_OneShotTimers_Cancel(MessageLoop::Type message_loop_type) { | 
|  | 194   MessageLoop loop(message_loop_type); | 
|  | 195 | 
|  | 196   WaitableEvent did_run_a(WaitableEvent::ResetPolicy::MANUAL, | 
|  | 197                           WaitableEvent::InitialState::NOT_SIGNALED); | 
| 144   OneShotTimerTester* a = new OneShotTimerTester(&did_run_a); | 198   OneShotTimerTester* a = new OneShotTimerTester(&did_run_a); | 
| 145 | 199 | 
| 146   // This should run before the timer expires. | 200   // This should run before the timer expires. | 
| 147   base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, a); | 201   SequencedTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, a); | 
| 148 | 202 | 
| 149   // Now start the timer. | 203   // Now start the timer. | 
| 150   a->Start(); | 204   a->Start(); | 
| 151 | 205 | 
| 152   bool did_run_b = false; | 206   OneShotTimerTester b; | 
| 153   OneShotTimerTester b(&did_run_b); |  | 
| 154   b.Start(); | 207   b.Start(); | 
| 155 | 208 | 
| 156   base::RunLoop().Run(); | 209   b.WaitAndConfirmTimerFiredAfterDelay(); | 
| 157 | 210 | 
| 158   EXPECT_FALSE(did_run_a); | 211   EXPECT_FALSE(did_run_a.IsSignaled()); | 
| 159   EXPECT_TRUE(did_run_b); | 212 } | 
| 160 } | 213 | 
| 161 | 214 void RunTest_OneShotSelfDeletingTimer(MessageLoop::Type message_loop_type) { | 
| 162 void RunTest_OneShotSelfDeletingTimer( | 215   MessageLoop loop(message_loop_type); | 
| 163     base::MessageLoop::Type message_loop_type) { | 216 | 
| 164   base::MessageLoop loop(message_loop_type); | 217   OneShotSelfDeletingTimerTester f; | 
| 165 |  | 
| 166   bool did_run = false; |  | 
| 167   OneShotSelfDeletingTimerTester f(&did_run); |  | 
| 168   f.Start(); | 218   f.Start(); | 
| 169 | 219   f.WaitAndConfirmTimerFiredAfterDelay(); | 
| 170   base::RunLoop().Run(); | 220 } | 
| 171 | 221 | 
| 172   EXPECT_TRUE(did_run); | 222 void RunTest_RepeatingTimer(MessageLoop::Type message_loop_type, | 
| 173 } |  | 
| 174 |  | 
| 175 void RunTest_RepeatingTimer(base::MessageLoop::Type message_loop_type, |  | 
| 176                             const TimeDelta& delay) { | 223                             const TimeDelta& delay) { | 
| 177   base::MessageLoop loop(message_loop_type); | 224   MessageLoop loop(message_loop_type); | 
| 178 | 225 | 
| 179   bool did_run = false; | 226   RepeatingTimerTester f(nullptr, delay); | 
| 180   RepeatingTimerTester f(&did_run, delay); |  | 
| 181   f.Start(); | 227   f.Start(); | 
| 182 | 228   f.WaitAndConfirmTimerFiredRepeatedlyAfterDelay(); | 
| 183   base::RunLoop().Run(); | 229 } | 
| 184 | 230 | 
| 185   EXPECT_TRUE(did_run); | 231 void RunTest_RepeatingTimer_Cancel(MessageLoop::Type message_loop_type, | 
| 186 } |  | 
| 187 |  | 
| 188 void RunTest_RepeatingTimer_Cancel(base::MessageLoop::Type message_loop_type, |  | 
| 189                                    const TimeDelta& delay) { | 232                                    const TimeDelta& delay) { | 
| 190   base::MessageLoop loop(message_loop_type); | 233   MessageLoop loop(message_loop_type); | 
| 191 | 234 | 
| 192   bool did_run_a = false; | 235   WaitableEvent did_run_a(WaitableEvent::ResetPolicy::MANUAL, | 
|  | 236                           WaitableEvent::InitialState::NOT_SIGNALED); | 
| 193   RepeatingTimerTester* a = new RepeatingTimerTester(&did_run_a, delay); | 237   RepeatingTimerTester* a = new RepeatingTimerTester(&did_run_a, delay); | 
| 194 | 238 | 
| 195   // This should run before the timer expires. | 239   // This should run before the timer expires. | 
| 196   base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, a); | 240   SequencedTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, a); | 
| 197 | 241 | 
| 198   // Now start the timer. | 242   // Now start the timer. | 
| 199   a->Start(); | 243   a->Start(); | 
| 200 | 244 | 
| 201   bool did_run_b = false; | 245   RepeatingTimerTester b(nullptr, delay); | 
| 202   RepeatingTimerTester b(&did_run_b, delay); |  | 
| 203   b.Start(); | 246   b.Start(); | 
| 204 | 247 | 
| 205   base::RunLoop().Run(); | 248   b.WaitAndConfirmTimerFiredRepeatedlyAfterDelay(); | 
| 206 | 249 | 
| 207   EXPECT_FALSE(did_run_a); | 250   // |a| should not have fired despite |b| starting after it on the same | 
| 208   EXPECT_TRUE(did_run_b); | 251   // sequence and being complete by now. | 
|  | 252   EXPECT_FALSE(did_run_a.IsSignaled()); | 
| 209 } | 253 } | 
| 210 | 254 | 
| 211 class DelayTimerTarget { | 255 class DelayTimerTarget { | 
| 212  public: | 256  public: | 
| 213   bool signaled() const { return signaled_; } | 257   bool signaled() const { return signaled_; } | 
| 214 | 258 | 
| 215   void Signal() { | 259   void Signal() { | 
| 216     ASSERT_FALSE(signaled_); | 260     ASSERT_FALSE(signaled_); | 
| 217     signaled_ = true; | 261     signaled_ = true; | 
| 218   } | 262   } | 
| 219 | 263 | 
| 220  private: | 264  private: | 
| 221   bool signaled_ = false; | 265   bool signaled_ = false; | 
| 222 }; | 266 }; | 
| 223 | 267 | 
| 224 void RunTest_DelayTimer_NoCall(base::MessageLoop::Type message_loop_type) { | 268 void RunTest_DelayTimer_NoCall(MessageLoop::Type message_loop_type) { | 
| 225   base::MessageLoop loop(message_loop_type); | 269   MessageLoop loop(message_loop_type); | 
| 226 | 270 | 
| 227   // If Delay is never called, the timer shouldn't go off. | 271   // If Delay is never called, the timer shouldn't go off. | 
| 228   DelayTimerTarget target; | 272   DelayTimerTarget target; | 
| 229   base::DelayTimer timer(FROM_HERE, TimeDelta::FromMilliseconds(1), &target, | 273   DelayTimer timer(FROM_HERE, TimeDelta::FromMilliseconds(1), &target, | 
| 230                          &DelayTimerTarget::Signal); | 274                    &DelayTimerTarget::Signal); | 
| 231 | 275 | 
| 232   bool did_run = false; | 276   OneShotTimerTester tester; | 
| 233   OneShotTimerTester tester(&did_run); |  | 
| 234   tester.Start(); | 277   tester.Start(); | 
| 235   base::RunLoop().Run(); | 278   tester.WaitAndConfirmTimerFiredAfterDelay(); | 
| 236 | 279 | 
| 237   ASSERT_FALSE(target.signaled()); | 280   ASSERT_FALSE(target.signaled()); | 
| 238 } | 281 } | 
| 239 | 282 | 
| 240 void RunTest_DelayTimer_OneCall(base::MessageLoop::Type message_loop_type) { | 283 void RunTest_DelayTimer_OneCall(MessageLoop::Type message_loop_type) { | 
| 241   base::MessageLoop loop(message_loop_type); | 284   MessageLoop loop(message_loop_type); | 
| 242 | 285 | 
| 243   DelayTimerTarget target; | 286   DelayTimerTarget target; | 
| 244   base::DelayTimer timer(FROM_HERE, TimeDelta::FromMilliseconds(1), &target, | 287   DelayTimer timer(FROM_HERE, TimeDelta::FromMilliseconds(1), &target, | 
| 245                          &DelayTimerTarget::Signal); | 288                    &DelayTimerTarget::Signal); | 
| 246   timer.Reset(); | 289   timer.Reset(); | 
| 247 | 290 | 
| 248   bool did_run = false; | 291   OneShotTimerTester tester(nullptr, TimeDelta::FromMilliseconds(100)); | 
| 249   OneShotTimerTester tester(&did_run, 100 /* milliseconds */); |  | 
| 250   tester.Start(); | 292   tester.Start(); | 
| 251   base::RunLoop().Run(); | 293   tester.WaitAndConfirmTimerFiredAfterDelay(); | 
| 252 | 294 | 
| 253   ASSERT_TRUE(target.signaled()); | 295   ASSERT_TRUE(target.signaled()); | 
| 254 } | 296 } | 
| 255 | 297 | 
| 256 struct ResetHelper { | 298 struct ResetHelper { | 
| 257   ResetHelper(base::DelayTimer* timer, DelayTimerTarget* target) | 299   ResetHelper(DelayTimer* timer, DelayTimerTarget* target) | 
| 258       : timer_(timer), target_(target) {} | 300       : timer_(timer), target_(target) {} | 
| 259 | 301 | 
| 260   void Reset() { | 302   void Reset() { | 
| 261     ASSERT_FALSE(target_->signaled()); | 303     ASSERT_FALSE(target_->signaled()); | 
| 262     timer_->Reset(); | 304     timer_->Reset(); | 
| 263   } | 305   } | 
| 264 | 306 | 
| 265  private: | 307  private: | 
| 266   base::DelayTimer* const timer_; | 308   DelayTimer* const timer_; | 
| 267   DelayTimerTarget* const target_; | 309   DelayTimerTarget* const target_; | 
| 268 }; | 310 }; | 
| 269 | 311 | 
| 270 void RunTest_DelayTimer_Reset(base::MessageLoop::Type message_loop_type) { | 312 void RunTest_DelayTimer_Reset(MessageLoop::Type message_loop_type) { | 
| 271   base::MessageLoop loop(message_loop_type); | 313   MessageLoop loop(message_loop_type); | 
| 272 | 314 | 
| 273   // If Delay is never called, the timer shouldn't go off. | 315   // If Delay is never called, the timer shouldn't go off. | 
| 274   DelayTimerTarget target; | 316   DelayTimerTarget target; | 
| 275   base::DelayTimer timer(FROM_HERE, TimeDelta::FromMilliseconds(50), &target, | 317   DelayTimer timer(FROM_HERE, TimeDelta::FromMilliseconds(50), &target, | 
| 276                          &DelayTimerTarget::Signal); | 318                    &DelayTimerTarget::Signal); | 
| 277   timer.Reset(); | 319   timer.Reset(); | 
| 278 | 320 | 
| 279   ResetHelper reset_helper(&timer, &target); | 321   ResetHelper reset_helper(&timer, &target); | 
| 280 | 322 | 
| 281   base::OneShotTimer timers[20]; | 323   OneShotTimer timers[20]; | 
| 282   for (size_t i = 0; i < arraysize(timers); ++i) { | 324   for (size_t i = 0; i < arraysize(timers); ++i) { | 
| 283     timers[i].Start(FROM_HERE, TimeDelta::FromMilliseconds(i * 10), | 325     timers[i].Start(FROM_HERE, TimeDelta::FromMilliseconds(i * 10), | 
| 284                     &reset_helper, &ResetHelper::Reset); | 326                     &reset_helper, &ResetHelper::Reset); | 
| 285   } | 327   } | 
| 286 | 328 | 
| 287   bool did_run = false; | 329   OneShotTimerTester tester(nullptr, TimeDelta::FromMilliseconds(300)); | 
| 288   OneShotTimerTester tester(&did_run, 300); |  | 
| 289   tester.Start(); | 330   tester.Start(); | 
| 290   base::RunLoop().Run(); | 331   tester.WaitAndConfirmTimerFiredAfterDelay(); | 
| 291 | 332 | 
| 292   ASSERT_TRUE(target.signaled()); | 333   ASSERT_TRUE(target.signaled()); | 
| 293 } | 334 } | 
| 294 | 335 | 
| 295 class DelayTimerFatalTarget { | 336 class DelayTimerFatalTarget { | 
| 296  public: | 337  public: | 
| 297   void Signal() { | 338   void Signal() { | 
| 298     ASSERT_TRUE(false); | 339     ASSERT_TRUE(false); | 
| 299   } | 340   } | 
| 300 }; | 341 }; | 
| 301 | 342 | 
| 302 | 343 void RunTest_DelayTimer_Deleted(MessageLoop::Type message_loop_type) { | 
| 303 void RunTest_DelayTimer_Deleted(base::MessageLoop::Type message_loop_type) { | 344   MessageLoop loop(message_loop_type); | 
| 304   base::MessageLoop loop(message_loop_type); |  | 
| 305 | 345 | 
| 306   DelayTimerFatalTarget target; | 346   DelayTimerFatalTarget target; | 
| 307 | 347 | 
| 308   { | 348   { | 
| 309     base::DelayTimer timer(FROM_HERE, TimeDelta::FromMilliseconds(50), &target, | 349     DelayTimer timer(FROM_HERE, TimeDelta::FromMilliseconds(50), &target, | 
| 310                            &DelayTimerFatalTarget::Signal); | 350                      &DelayTimerFatalTarget::Signal); | 
| 311     timer.Reset(); | 351     timer.Reset(); | 
| 312   } | 352   } | 
| 313 | 353 | 
| 314   // When the timer is deleted, the DelayTimerFatalTarget should never be | 354   // When the timer is deleted, the DelayTimerFatalTarget should never be | 
| 315   // called. | 355   // called. | 
| 316   base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(100)); | 356   PlatformThread::Sleep(TimeDelta::FromMilliseconds(100)); | 
| 317 } | 357 } | 
| 318 | 358 | 
| 319 }  // namespace | 359 }  // namespace | 
| 320 | 360 | 
| 321 //----------------------------------------------------------------------------- | 361 //----------------------------------------------------------------------------- | 
| 322 // Each test is run against each type of MessageLoop.  That way we are sure | 362 // Each test is run against each type of MessageLoop.  That way we are sure | 
| 323 // that timers work properly in all configurations. | 363 // that timers work properly in all configurations. | 
| 324 | 364 | 
| 325 TEST(TimerTest, OneShotTimer) { | 365 TEST(TimerTest, OneShotTimers) { | 
| 326   for (int i = 0; i < kNumTestingMessageLoops; i++) { | 366   for (int i = 0; i < kNumTestingMessageLoops; i++) { | 
| 327     RunTest_OneShotTimer(testing_message_loops[i]); | 367     RunTest_OneShotTimers(testing_message_loops[i]); | 
| 328   } | 368   } | 
| 329 } | 369 } | 
| 330 | 370 | 
| 331 TEST(TimerTest, OneShotTimer_Cancel) { | 371 TEST(TimerTest, OneShotTimers_Cancel) { | 
| 332   for (int i = 0; i < kNumTestingMessageLoops; i++) { | 372   for (int i = 0; i < kNumTestingMessageLoops; i++) { | 
| 333     RunTest_OneShotTimer_Cancel(testing_message_loops[i]); | 373     RunTest_OneShotTimers_Cancel(testing_message_loops[i]); | 
| 334   } | 374   } | 
| 335 } | 375 } | 
| 336 | 376 | 
| 337 // If underline timer does not handle properly, we will crash or fail | 377 // If underline timer does not handle properly, we will crash or fail | 
| 338 // in full page heap environment. | 378 // in full page heap environment. | 
| 339 TEST(TimerTest, OneShotSelfDeletingTimer) { | 379 TEST(TimerTest, OneShotSelfDeletingTimer) { | 
| 340   for (int i = 0; i < kNumTestingMessageLoops; i++) { | 380   for (int i = 0; i < kNumTestingMessageLoops; i++) { | 
| 341     RunTest_OneShotSelfDeletingTimer(testing_message_loops[i]); | 381     RunTest_OneShotSelfDeletingTimer(testing_message_loops[i]); | 
| 342   } | 382   } | 
| 343 } | 383 } | 
| 344 | 384 | 
| 345 TEST(TimerTest, OneShotTimer_CustomTaskRunner) { | 385 TEST(TimerTest, OneShotTimer_CustomTaskRunner) { | 
| 346   scoped_refptr<base::TestSimpleTaskRunner> task_runner = | 386   // A MessageLoop is required for the timer events on the other thread to | 
| 347       new base::TestSimpleTaskRunner(); | 387   // communicate back to the Timer under test. | 
|  | 388   MessageLoop loop; | 
| 348 | 389 | 
| 349   bool did_run = false; | 390   Thread other_thread("OneShotTimer_CustomTaskRunner"); | 
|  | 391   other_thread.Start(); | 
|  | 392 | 
|  | 393   WaitableEvent did_run(WaitableEvent::ResetPolicy::MANUAL, | 
|  | 394                         WaitableEvent::InitialState::NOT_SIGNALED); | 
| 350   OneShotTimerTester f(&did_run); | 395   OneShotTimerTester f(&did_run); | 
| 351   f.SetTaskRunner(task_runner); | 396   f.SetTaskRunner(other_thread.task_runner()); | 
| 352   f.Start(); | 397   f.Start(); | 
|  | 398   EXPECT_TRUE(f.IsRunning()); | 
| 353 | 399 | 
| 354   EXPECT_FALSE(did_run); | 400   f.WaitAndConfirmTimerFiredAfterDelay(); | 
| 355   task_runner->RunUntilIdle(); | 401   EXPECT_TRUE(did_run.IsSignaled()); | 
| 356   EXPECT_TRUE(did_run); | 402 | 
|  | 403   // |f| should already have communicated back to this |loop| before invoking | 
|  | 404   // Run() and as such this thread should already be aware that |f| is no longer | 
|  | 405   // running. | 
|  | 406   EXPECT_TRUE(loop.IsIdleForTesting()); | 
|  | 407   EXPECT_FALSE(f.IsRunning()); | 
| 357 } | 408 } | 
| 358 | 409 | 
| 359 TEST(TimerTest, OneShotTimerWithTickClock) { | 410 TEST(TimerTest, OneShotTimerWithTickClock) { | 
| 360   scoped_refptr<base::TestMockTimeTaskRunner> task_runner( | 411   scoped_refptr<TestMockTimeTaskRunner> task_runner( | 
| 361       new base::TestMockTimeTaskRunner(base::Time::Now(), | 412       new TestMockTimeTaskRunner(Time::Now(), TimeTicks::Now())); | 
| 362                                        base::TimeTicks::Now())); | 413   std::unique_ptr<TickClock> tick_clock(task_runner->GetMockTickClock()); | 
| 363   std::unique_ptr<base::TickClock> tick_clock(task_runner->GetMockTickClock()); | 414   MessageLoop message_loop; | 
| 364   base::MessageLoop message_loop; |  | 
| 365   message_loop.SetTaskRunner(task_runner); | 415   message_loop.SetTaskRunner(task_runner); | 
| 366   Receiver receiver; | 416   Receiver receiver; | 
| 367   base::OneShotTimer timer(tick_clock.get()); | 417   OneShotTimer timer(tick_clock.get()); | 
| 368   timer.Start(FROM_HERE, base::TimeDelta::FromSeconds(1), | 418   timer.Start(FROM_HERE, TimeDelta::FromSeconds(1), | 
| 369               base::Bind(&Receiver::OnCalled, base::Unretained(&receiver))); | 419               Bind(&Receiver::OnCalled, Unretained(&receiver))); | 
| 370   task_runner->FastForwardBy(base::TimeDelta::FromSeconds(1)); | 420   task_runner->FastForwardBy(TimeDelta::FromSeconds(1)); | 
| 371   EXPECT_TRUE(receiver.WasCalled()); | 421   EXPECT_TRUE(receiver.WasCalled()); | 
| 372 } | 422 } | 
| 373 | 423 | 
| 374 TEST(TimerTest, RepeatingTimer) { | 424 TEST(TimerTest, RepeatingTimer) { | 
| 375   for (int i = 0; i < kNumTestingMessageLoops; i++) { | 425   for (int i = 0; i < kNumTestingMessageLoops; i++) { | 
| 376     RunTest_RepeatingTimer(testing_message_loops[i], | 426     RunTest_RepeatingTimer(testing_message_loops[i], | 
| 377                            TimeDelta::FromMilliseconds(10)); | 427                            TimeDelta::FromMilliseconds(10)); | 
| 378   } | 428   } | 
| 379 } | 429 } | 
| 380 | 430 | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
| 393 } | 443 } | 
| 394 | 444 | 
| 395 TEST(TimerTest, RepeatingTimerZeroDelay_Cancel) { | 445 TEST(TimerTest, RepeatingTimerZeroDelay_Cancel) { | 
| 396   for (int i = 0; i < kNumTestingMessageLoops; i++) { | 446   for (int i = 0; i < kNumTestingMessageLoops; i++) { | 
| 397     RunTest_RepeatingTimer_Cancel(testing_message_loops[i], | 447     RunTest_RepeatingTimer_Cancel(testing_message_loops[i], | 
| 398                                   TimeDelta::FromMilliseconds(0)); | 448                                   TimeDelta::FromMilliseconds(0)); | 
| 399   } | 449   } | 
| 400 } | 450 } | 
| 401 | 451 | 
| 402 TEST(TimerTest, RepeatingTimerWithTickClock) { | 452 TEST(TimerTest, RepeatingTimerWithTickClock) { | 
| 403   scoped_refptr<base::TestMockTimeTaskRunner> task_runner( | 453   scoped_refptr<TestMockTimeTaskRunner> task_runner( | 
| 404       new base::TestMockTimeTaskRunner(base::Time::Now(), | 454       new TestMockTimeTaskRunner(Time::Now(), TimeTicks::Now())); | 
| 405                                        base::TimeTicks::Now())); | 455   std::unique_ptr<TickClock> tick_clock(task_runner->GetMockTickClock()); | 
| 406   std::unique_ptr<base::TickClock> tick_clock(task_runner->GetMockTickClock()); | 456   MessageLoop message_loop; | 
| 407   base::MessageLoop message_loop; |  | 
| 408   message_loop.SetTaskRunner(task_runner); | 457   message_loop.SetTaskRunner(task_runner); | 
| 409   Receiver receiver; | 458   Receiver receiver; | 
| 410   const int expected_times_called = 10; | 459   const int expected_times_called = 10; | 
| 411   base::RepeatingTimer timer(tick_clock.get()); | 460   RepeatingTimer timer(tick_clock.get()); | 
| 412   timer.Start(FROM_HERE, base::TimeDelta::FromSeconds(1), | 461   timer.Start(FROM_HERE, TimeDelta::FromSeconds(1), | 
| 413               base::Bind(&Receiver::OnCalled, base::Unretained(&receiver))); | 462               Bind(&Receiver::OnCalled, Unretained(&receiver))); | 
| 414   task_runner->FastForwardBy( | 463   task_runner->FastForwardBy(TimeDelta::FromSeconds(expected_times_called)); | 
| 415       base::TimeDelta::FromSeconds(expected_times_called)); |  | 
| 416   timer.Stop(); | 464   timer.Stop(); | 
| 417   EXPECT_EQ(expected_times_called, receiver.TimesCalled()); | 465   EXPECT_EQ(expected_times_called, receiver.TimesCalled()); | 
| 418 } | 466 } | 
| 419 | 467 | 
| 420 TEST(TimerTest, DelayTimer_NoCall) { | 468 TEST(TimerTest, DelayTimer_NoCall) { | 
| 421   for (int i = 0; i < kNumTestingMessageLoops; i++) { | 469   for (int i = 0; i < kNumTestingMessageLoops; i++) { | 
| 422     RunTest_DelayTimer_NoCall(testing_message_loops[i]); | 470     RunTest_DelayTimer_NoCall(testing_message_loops[i]); | 
| 423   } | 471   } | 
| 424 } | 472 } | 
| 425 | 473 | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 436   } | 484   } | 
| 437 } | 485 } | 
| 438 | 486 | 
| 439 TEST(TimerTest, DelayTimer_Deleted) { | 487 TEST(TimerTest, DelayTimer_Deleted) { | 
| 440   for (int i = 0; i < kNumTestingMessageLoops; i++) { | 488   for (int i = 0; i < kNumTestingMessageLoops; i++) { | 
| 441     RunTest_DelayTimer_Deleted(testing_message_loops[i]); | 489     RunTest_DelayTimer_Deleted(testing_message_loops[i]); | 
| 442   } | 490   } | 
| 443 } | 491 } | 
| 444 | 492 | 
| 445 TEST(TimerTest, DelayTimerWithTickClock) { | 493 TEST(TimerTest, DelayTimerWithTickClock) { | 
| 446   scoped_refptr<base::TestMockTimeTaskRunner> task_runner( | 494   scoped_refptr<TestMockTimeTaskRunner> task_runner( | 
| 447       new base::TestMockTimeTaskRunner(base::Time::Now(), | 495       new TestMockTimeTaskRunner(Time::Now(), TimeTicks::Now())); | 
| 448                                        base::TimeTicks::Now())); | 496   std::unique_ptr<TickClock> tick_clock(task_runner->GetMockTickClock()); | 
| 449   std::unique_ptr<base::TickClock> tick_clock(task_runner->GetMockTickClock()); | 497   MessageLoop message_loop; | 
| 450   base::MessageLoop message_loop; |  | 
| 451   message_loop.SetTaskRunner(task_runner); | 498   message_loop.SetTaskRunner(task_runner); | 
| 452   Receiver receiver; | 499   Receiver receiver; | 
| 453   base::DelayTimer timer(FROM_HERE, base::TimeDelta::FromSeconds(1), &receiver, | 500   DelayTimer timer(FROM_HERE, TimeDelta::FromSeconds(1), &receiver, | 
| 454                          &Receiver::OnCalled, tick_clock.get()); | 501                    &Receiver::OnCalled, tick_clock.get()); | 
| 455   task_runner->FastForwardBy(base::TimeDelta::FromMilliseconds(999)); | 502   task_runner->FastForwardBy(TimeDelta::FromMilliseconds(999)); | 
| 456   EXPECT_FALSE(receiver.WasCalled()); | 503   EXPECT_FALSE(receiver.WasCalled()); | 
| 457   timer.Reset(); | 504   timer.Reset(); | 
| 458   task_runner->FastForwardBy(base::TimeDelta::FromMilliseconds(999)); | 505   task_runner->FastForwardBy(TimeDelta::FromMilliseconds(999)); | 
| 459   EXPECT_FALSE(receiver.WasCalled()); | 506   EXPECT_FALSE(receiver.WasCalled()); | 
| 460   timer.Reset(); | 507   timer.Reset(); | 
| 461   task_runner->FastForwardBy(base::TimeDelta::FromSeconds(1)); | 508   task_runner->FastForwardBy(TimeDelta::FromSeconds(1)); | 
| 462   EXPECT_TRUE(receiver.WasCalled()); | 509   EXPECT_TRUE(receiver.WasCalled()); | 
| 463 } | 510 } | 
| 464 | 511 | 
| 465 TEST(TimerTest, MessageLoopShutdown) { | 512 TEST(TimerTest, MessageLoopShutdown) { | 
| 466   // This test is designed to verify that shutdown of the | 513   // This test is designed to verify that shutdown of the | 
| 467   // message loop does not cause crashes if there were pending | 514   // message loop does not cause crashes if there were pending | 
| 468   // timers not yet fired.  It may only trigger exceptions | 515   // timers not yet fired.  It may only trigger exceptions | 
| 469   // if debug heap checking is enabled. | 516   // if debug heap checking is enabled. | 
| 470   bool did_run = false; | 517   WaitableEvent did_run(WaitableEvent::ResetPolicy::MANUAL, | 
|  | 518                         WaitableEvent::InitialState::NOT_SIGNALED); | 
| 471   { | 519   { | 
| 472     OneShotTimerTester a(&did_run); | 520     OneShotTimerTester a(&did_run); | 
| 473     OneShotTimerTester b(&did_run); | 521     OneShotTimerTester b(&did_run); | 
| 474     OneShotTimerTester c(&did_run); | 522     OneShotTimerTester c(&did_run); | 
| 475     OneShotTimerTester d(&did_run); | 523     OneShotTimerTester d(&did_run); | 
| 476     { | 524     { | 
| 477       base::MessageLoop loop; | 525       MessageLoop loop; | 
| 478       a.Start(); | 526       a.Start(); | 
| 479       b.Start(); | 527       b.Start(); | 
| 480     }  // MessageLoop destructs by falling out of scope. | 528     }  // MessageLoop destructs by falling out of scope. | 
| 481   }  // OneShotTimers destruct.  SHOULD NOT CRASH, of course. | 529   }  // OneShotTimers destruct.  SHOULD NOT CRASH, of course. | 
| 482 | 530 | 
| 483   EXPECT_FALSE(did_run); | 531   EXPECT_FALSE(did_run.IsSignaled()); | 
| 484 } | 532 } | 
| 485 | 533 | 
| 486 void TimerTestCallback() { | 534 void TimerTestCallback() { | 
| 487 } | 535 } | 
| 488 | 536 | 
| 489 TEST(TimerTest, NonRepeatIsRunning) { | 537 TEST(TimerTest, NonRepeatIsRunning) { | 
| 490   { | 538   { | 
| 491     base::MessageLoop loop; | 539     MessageLoop loop; | 
| 492     base::Timer timer(false, false); | 540     Timer timer(false, false); | 
| 493     EXPECT_FALSE(timer.IsRunning()); | 541     EXPECT_FALSE(timer.IsRunning()); | 
| 494     timer.Start(FROM_HERE, TimeDelta::FromDays(1), | 542     timer.Start(FROM_HERE, TimeDelta::FromDays(1), Bind(&TimerTestCallback)); | 
| 495                 base::Bind(&TimerTestCallback)); |  | 
| 496     EXPECT_TRUE(timer.IsRunning()); | 543     EXPECT_TRUE(timer.IsRunning()); | 
| 497     timer.Stop(); | 544     timer.Stop(); | 
| 498     EXPECT_FALSE(timer.IsRunning()); | 545     EXPECT_FALSE(timer.IsRunning()); | 
| 499     EXPECT_TRUE(timer.user_task().is_null()); | 546     EXPECT_TRUE(timer.user_task().is_null()); | 
| 500   } | 547   } | 
| 501 | 548 | 
| 502   { | 549   { | 
| 503     base::Timer timer(true, false); | 550     Timer timer(true, false); | 
| 504     base::MessageLoop loop; | 551     MessageLoop loop; | 
| 505     EXPECT_FALSE(timer.IsRunning()); | 552     EXPECT_FALSE(timer.IsRunning()); | 
| 506     timer.Start(FROM_HERE, TimeDelta::FromDays(1), | 553     timer.Start(FROM_HERE, TimeDelta::FromDays(1), Bind(&TimerTestCallback)); | 
| 507                 base::Bind(&TimerTestCallback)); |  | 
| 508     EXPECT_TRUE(timer.IsRunning()); | 554     EXPECT_TRUE(timer.IsRunning()); | 
| 509     timer.Stop(); | 555     timer.Stop(); | 
| 510     EXPECT_FALSE(timer.IsRunning()); | 556     EXPECT_FALSE(timer.IsRunning()); | 
| 511     ASSERT_FALSE(timer.user_task().is_null()); | 557     ASSERT_FALSE(timer.user_task().is_null()); | 
| 512     timer.Reset(); | 558     timer.Reset(); | 
| 513     EXPECT_TRUE(timer.IsRunning()); | 559     EXPECT_TRUE(timer.IsRunning()); | 
| 514   } | 560   } | 
| 515 } | 561 } | 
| 516 | 562 | 
| 517 TEST(TimerTest, NonRepeatMessageLoopDeath) { | 563 TEST(TimerTest, NonRepeatMessageLoopDeath) { | 
| 518   base::Timer timer(false, false); | 564   Timer timer(false, false); | 
| 519   { | 565   { | 
| 520     base::MessageLoop loop; | 566     MessageLoop loop; | 
| 521     EXPECT_FALSE(timer.IsRunning()); | 567     EXPECT_FALSE(timer.IsRunning()); | 
| 522     timer.Start(FROM_HERE, TimeDelta::FromDays(1), | 568     timer.Start(FROM_HERE, TimeDelta::FromDays(1), Bind(&TimerTestCallback)); | 
| 523                 base::Bind(&TimerTestCallback)); |  | 
| 524     EXPECT_TRUE(timer.IsRunning()); | 569     EXPECT_TRUE(timer.IsRunning()); | 
| 525   } | 570   } | 
| 526   EXPECT_FALSE(timer.IsRunning()); | 571   EXPECT_FALSE(timer.IsRunning()); | 
| 527   EXPECT_TRUE(timer.user_task().is_null()); | 572   EXPECT_TRUE(timer.user_task().is_null()); | 
| 528 } | 573 } | 
| 529 | 574 | 
| 530 TEST(TimerTest, RetainRepeatIsRunning) { | 575 TEST(TimerTest, RetainRepeatIsRunning) { | 
| 531   base::MessageLoop loop; | 576   MessageLoop loop; | 
| 532   base::Timer timer(FROM_HERE, TimeDelta::FromDays(1), | 577   Timer timer(FROM_HERE, TimeDelta::FromDays(1), Bind(&TimerTestCallback), | 
| 533                     base::Bind(&TimerTestCallback), true); | 578               true); | 
| 534   EXPECT_FALSE(timer.IsRunning()); | 579   EXPECT_FALSE(timer.IsRunning()); | 
| 535   timer.Reset(); | 580   timer.Reset(); | 
| 536   EXPECT_TRUE(timer.IsRunning()); | 581   EXPECT_TRUE(timer.IsRunning()); | 
| 537   timer.Stop(); | 582   timer.Stop(); | 
| 538   EXPECT_FALSE(timer.IsRunning()); | 583   EXPECT_FALSE(timer.IsRunning()); | 
| 539   timer.Reset(); | 584   timer.Reset(); | 
| 540   EXPECT_TRUE(timer.IsRunning()); | 585   EXPECT_TRUE(timer.IsRunning()); | 
| 541 } | 586 } | 
| 542 | 587 | 
| 543 TEST(TimerTest, RetainNonRepeatIsRunning) { | 588 TEST(TimerTest, RetainNonRepeatIsRunning) { | 
| 544   base::MessageLoop loop; | 589   MessageLoop loop; | 
| 545   base::Timer timer(FROM_HERE, TimeDelta::FromDays(1), | 590   Timer timer(FROM_HERE, TimeDelta::FromDays(1), Bind(&TimerTestCallback), | 
| 546                     base::Bind(&TimerTestCallback), false); | 591               false); | 
| 547   EXPECT_FALSE(timer.IsRunning()); | 592   EXPECT_FALSE(timer.IsRunning()); | 
| 548   timer.Reset(); | 593   timer.Reset(); | 
| 549   EXPECT_TRUE(timer.IsRunning()); | 594   EXPECT_TRUE(timer.IsRunning()); | 
| 550   timer.Stop(); | 595   timer.Stop(); | 
| 551   EXPECT_FALSE(timer.IsRunning()); | 596   EXPECT_FALSE(timer.IsRunning()); | 
| 552   timer.Reset(); | 597   timer.Reset(); | 
| 553   EXPECT_TRUE(timer.IsRunning()); | 598   EXPECT_TRUE(timer.IsRunning()); | 
| 554 } | 599 } | 
| 555 | 600 | 
| 556 namespace { | 601 namespace { | 
| 557 | 602 | 
| 558 bool g_callback_happened1 = false; | 603 bool g_callback_happened1 = false; | 
| 559 bool g_callback_happened2 = false; | 604 bool g_callback_happened2 = false; | 
| 560 | 605 | 
| 561 void ClearAllCallbackHappened() { | 606 void ClearAllCallbackHappened() { | 
| 562   g_callback_happened1 = false; | 607   g_callback_happened1 = false; | 
| 563   g_callback_happened2 = false; | 608   g_callback_happened2 = false; | 
| 564 } | 609 } | 
| 565 | 610 | 
| 566 void SetCallbackHappened1() { | 611 void SetCallbackHappened1() { | 
| 567   g_callback_happened1 = true; | 612   g_callback_happened1 = true; | 
| 568   base::MessageLoop::current()->QuitWhenIdle(); | 613   MessageLoop::current()->QuitWhenIdle(); | 
| 569 } | 614 } | 
| 570 | 615 | 
| 571 void SetCallbackHappened2() { | 616 void SetCallbackHappened2() { | 
| 572   g_callback_happened2 = true; | 617   g_callback_happened2 = true; | 
| 573   base::MessageLoop::current()->QuitWhenIdle(); | 618   MessageLoop::current()->QuitWhenIdle(); | 
| 574 } | 619 } | 
| 575 | 620 | 
|  | 621 }  // namespace | 
|  | 622 | 
| 576 TEST(TimerTest, ContinuationStopStart) { | 623 TEST(TimerTest, ContinuationStopStart) { | 
| 577   { | 624   { | 
| 578     ClearAllCallbackHappened(); | 625     ClearAllCallbackHappened(); | 
| 579     base::MessageLoop loop; | 626     MessageLoop loop; | 
| 580     base::Timer timer(false, false); | 627     Timer timer(false, false); | 
| 581     timer.Start(FROM_HERE, TimeDelta::FromMilliseconds(10), | 628     timer.Start(FROM_HERE, TimeDelta::FromMilliseconds(10), | 
| 582                 base::Bind(&SetCallbackHappened1)); | 629                 Bind(&SetCallbackHappened1)); | 
| 583     timer.Stop(); | 630     timer.Stop(); | 
| 584     timer.Start(FROM_HERE, TimeDelta::FromMilliseconds(40), | 631     timer.Start(FROM_HERE, TimeDelta::FromMilliseconds(40), | 
| 585                 base::Bind(&SetCallbackHappened2)); | 632                 Bind(&SetCallbackHappened2)); | 
| 586     base::RunLoop().Run(); | 633     RunLoop().Run(); | 
| 587     EXPECT_FALSE(g_callback_happened1); | 634     EXPECT_FALSE(g_callback_happened1); | 
| 588     EXPECT_TRUE(g_callback_happened2); | 635     EXPECT_TRUE(g_callback_happened2); | 
| 589   } | 636   } | 
| 590 } | 637 } | 
| 591 | 638 | 
| 592 TEST(TimerTest, ContinuationReset) { | 639 TEST(TimerTest, ContinuationReset) { | 
| 593   { | 640   { | 
| 594     ClearAllCallbackHappened(); | 641     ClearAllCallbackHappened(); | 
| 595     base::MessageLoop loop; | 642     MessageLoop loop; | 
| 596     base::Timer timer(false, false); | 643     Timer timer(false, false); | 
| 597     timer.Start(FROM_HERE, TimeDelta::FromMilliseconds(10), | 644     timer.Start(FROM_HERE, TimeDelta::FromMilliseconds(10), | 
| 598                 base::Bind(&SetCallbackHappened1)); | 645                 Bind(&SetCallbackHappened1)); | 
| 599     timer.Reset(); | 646     timer.Reset(); | 
| 600     // Since Reset happened before task ran, the user_task must not be cleared: | 647     // Since Reset happened before task ran, the user_task must not be cleared: | 
| 601     ASSERT_FALSE(timer.user_task().is_null()); | 648     ASSERT_FALSE(timer.user_task().is_null()); | 
| 602     base::RunLoop().Run(); | 649     RunLoop().Run(); | 
| 603     EXPECT_TRUE(g_callback_happened1); | 650     EXPECT_TRUE(g_callback_happened1); | 
| 604   } | 651   } | 
| 605 } | 652 } | 
| 606 | 653 | 
| 607 }  // namespace | 654 }  // namespace base | 
| OLD | NEW | 
|---|