| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/memory/scoped_ptr.h" | 5 #include "base/memory/scoped_ptr.h" |
| 6 #include "base/message_loop.h" | 6 #include "base/message_loop.h" |
| 7 #include "base/task.h" | 7 #include "base/task.h" |
| 8 #include "base/timer.h" | 8 #include "base/timer.h" |
| 9 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
| 10 | 10 |
| 11 using base::TimeDelta; | 11 using base::TimeDelta; |
| 12 | 12 |
| 13 namespace { | 13 namespace { |
| 14 | 14 |
| 15 class OneShotTimerTester { | 15 class OneShotTimerTester { |
| 16 public: | 16 public: |
| 17 OneShotTimerTester(bool* did_run, unsigned milliseconds = 10) | 17 OneShotTimerTester(bool* did_run, unsigned milliseconds = 10) |
| 18 : did_run_(did_run), | 18 : did_run_(did_run), |
| 19 delay_ms_(milliseconds) { | 19 delay_ms_(milliseconds) { |
| 20 } | 20 } |
| 21 void Start() { | 21 void Start() { |
| 22 timer_.Start(TimeDelta::FromMilliseconds(delay_ms_), this, | 22 timer_.Start(TimeDelta::FromMilliseconds(delay_ms_), this, |
| 23 &OneShotTimerTester::Run); | 23 &OneShotTimerTester::Run, FROM_HERE); |
| 24 } | 24 } |
| 25 private: | 25 private: |
| 26 void Run() { | 26 void Run() { |
| 27 *did_run_ = true; | 27 *did_run_ = true; |
| 28 MessageLoop::current()->Quit(); | 28 MessageLoop::current()->Quit(); |
| 29 } | 29 } |
| 30 bool* did_run_; | 30 bool* did_run_; |
| 31 base::OneShotTimer<OneShotTimerTester> timer_; | 31 base::OneShotTimer<OneShotTimerTester> timer_; |
| 32 const unsigned delay_ms_; | 32 const unsigned delay_ms_; |
| 33 }; | 33 }; |
| 34 | 34 |
| 35 class OneShotSelfDeletingTimerTester { | 35 class OneShotSelfDeletingTimerTester { |
| 36 public: | 36 public: |
| 37 explicit OneShotSelfDeletingTimerTester(bool* did_run) : | 37 explicit OneShotSelfDeletingTimerTester(bool* did_run) : |
| 38 did_run_(did_run), | 38 did_run_(did_run), |
| 39 timer_(new base::OneShotTimer<OneShotSelfDeletingTimerTester>()) { | 39 timer_(new base::OneShotTimer<OneShotSelfDeletingTimerTester>()) { |
| 40 } | 40 } |
| 41 void Start() { | 41 void Start() { |
| 42 timer_->Start(TimeDelta::FromMilliseconds(10), this, | 42 timer_->Start(TimeDelta::FromMilliseconds(10), this, |
| 43 &OneShotSelfDeletingTimerTester::Run); | 43 &OneShotSelfDeletingTimerTester::Run, FROM_HERE); |
| 44 } | 44 } |
| 45 private: | 45 private: |
| 46 void Run() { | 46 void Run() { |
| 47 *did_run_ = true; | 47 *did_run_ = true; |
| 48 timer_.reset(); | 48 timer_.reset(); |
| 49 MessageLoop::current()->Quit(); | 49 MessageLoop::current()->Quit(); |
| 50 } | 50 } |
| 51 bool* did_run_; | 51 bool* did_run_; |
| 52 scoped_ptr<base::OneShotTimer<OneShotSelfDeletingTimerTester> > timer_; | 52 scoped_ptr<base::OneShotTimer<OneShotSelfDeletingTimerTester> > timer_; |
| 53 }; | 53 }; |
| 54 | 54 |
| 55 class RepeatingTimerTester { | 55 class RepeatingTimerTester { |
| 56 public: | 56 public: |
| 57 explicit RepeatingTimerTester(bool* did_run) | 57 explicit RepeatingTimerTester(bool* did_run) |
| 58 : did_run_(did_run), counter_(10) { | 58 : did_run_(did_run), counter_(10) { |
| 59 } | 59 } |
| 60 | 60 |
| 61 void Start() { | 61 void Start() { |
| 62 timer_.Start(TimeDelta::FromMilliseconds(10), this, | 62 timer_.Start(TimeDelta::FromMilliseconds(10), this, |
| 63 &RepeatingTimerTester::Run); | 63 &RepeatingTimerTester::Run, FROM_HERE); |
| 64 } | 64 } |
| 65 private: | 65 private: |
| 66 void Run() { | 66 void Run() { |
| 67 if (--counter_ == 0) { | 67 if (--counter_ == 0) { |
| 68 *did_run_ = true; | 68 *did_run_ = true; |
| 69 MessageLoop::current()->Quit(); | 69 MessageLoop::current()->Quit(); |
| 70 } | 70 } |
| 71 } | 71 } |
| 72 bool* did_run_; | 72 bool* did_run_; |
| 73 int counter_; | 73 int counter_; |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 170 private: | 170 private: |
| 171 bool signaled_; | 171 bool signaled_; |
| 172 }; | 172 }; |
| 173 | 173 |
| 174 void RunTest_DelayTimer_NoCall(MessageLoop::Type message_loop_type) { | 174 void RunTest_DelayTimer_NoCall(MessageLoop::Type message_loop_type) { |
| 175 MessageLoop loop(message_loop_type); | 175 MessageLoop loop(message_loop_type); |
| 176 | 176 |
| 177 // If Delay is never called, the timer shouldn't go off. | 177 // If Delay is never called, the timer shouldn't go off. |
| 178 DelayTimerTarget target; | 178 DelayTimerTarget target; |
| 179 base::DelayTimer<DelayTimerTarget> timer( | 179 base::DelayTimer<DelayTimerTarget> timer( |
| 180 TimeDelta::FromMilliseconds(1), &target, &DelayTimerTarget::Signal); | 180 TimeDelta::FromMilliseconds(1), &target, &DelayTimerTarget::Signal, |
| 181 FROM_HERE); |
| 181 | 182 |
| 182 bool did_run = false; | 183 bool did_run = false; |
| 183 OneShotTimerTester tester(&did_run); | 184 OneShotTimerTester tester(&did_run); |
| 184 tester.Start(); | 185 tester.Start(); |
| 185 MessageLoop::current()->Run(); | 186 MessageLoop::current()->Run(); |
| 186 | 187 |
| 187 ASSERT_FALSE(target.signaled()); | 188 ASSERT_FALSE(target.signaled()); |
| 188 } | 189 } |
| 189 | 190 |
| 190 void RunTest_DelayTimer_OneCall(MessageLoop::Type message_loop_type) { | 191 void RunTest_DelayTimer_OneCall(MessageLoop::Type message_loop_type) { |
| 191 MessageLoop loop(message_loop_type); | 192 MessageLoop loop(message_loop_type); |
| 192 | 193 |
| 193 DelayTimerTarget target; | 194 DelayTimerTarget target; |
| 194 base::DelayTimer<DelayTimerTarget> timer( | 195 base::DelayTimer<DelayTimerTarget> timer( |
| 195 TimeDelta::FromMilliseconds(1), &target, &DelayTimerTarget::Signal); | 196 TimeDelta::FromMilliseconds(1), &target, &DelayTimerTarget::Signal, |
| 197 FROM_HERE); |
| 196 timer.Reset(); | 198 timer.Reset(); |
| 197 | 199 |
| 198 bool did_run = false; | 200 bool did_run = false; |
| 199 OneShotTimerTester tester(&did_run, 100 /* milliseconds */); | 201 OneShotTimerTester tester(&did_run, 100 /* milliseconds */); |
| 200 tester.Start(); | 202 tester.Start(); |
| 201 MessageLoop::current()->Run(); | 203 MessageLoop::current()->Run(); |
| 202 | 204 |
| 203 ASSERT_TRUE(target.signaled()); | 205 ASSERT_TRUE(target.signaled()); |
| 204 } | 206 } |
| 205 | 207 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 219 base::DelayTimer<DelayTimerTarget> *const timer_; | 221 base::DelayTimer<DelayTimerTarget> *const timer_; |
| 220 DelayTimerTarget *const target_; | 222 DelayTimerTarget *const target_; |
| 221 }; | 223 }; |
| 222 | 224 |
| 223 void RunTest_DelayTimer_Reset(MessageLoop::Type message_loop_type) { | 225 void RunTest_DelayTimer_Reset(MessageLoop::Type message_loop_type) { |
| 224 MessageLoop loop(message_loop_type); | 226 MessageLoop loop(message_loop_type); |
| 225 | 227 |
| 226 // If Delay is never called, the timer shouldn't go off. | 228 // If Delay is never called, the timer shouldn't go off. |
| 227 DelayTimerTarget target; | 229 DelayTimerTarget target; |
| 228 base::DelayTimer<DelayTimerTarget> timer( | 230 base::DelayTimer<DelayTimerTarget> timer( |
| 229 TimeDelta::FromMilliseconds(50), &target, &DelayTimerTarget::Signal); | 231 TimeDelta::FromMilliseconds(50), &target, &DelayTimerTarget::Signal, |
| 232 FROM_HERE); |
| 230 timer.Reset(); | 233 timer.Reset(); |
| 231 | 234 |
| 232 ResetHelper reset_helper(&timer, &target); | 235 ResetHelper reset_helper(&timer, &target); |
| 233 | 236 |
| 234 base::OneShotTimer<ResetHelper> timers[20]; | 237 base::OneShotTimer<ResetHelper> timers[20]; |
| 235 for (size_t i = 0; i < arraysize(timers); ++i) { | 238 for (size_t i = 0; i < arraysize(timers); ++i) { |
| 236 timers[i].Start(TimeDelta::FromMilliseconds(i * 10), &reset_helper, | 239 timers[i].Start(TimeDelta::FromMilliseconds(i * 10), &reset_helper, |
| 237 &ResetHelper::Reset); | 240 &ResetHelper::Reset, FROM_HERE); |
| 238 } | 241 } |
| 239 | 242 |
| 240 bool did_run = false; | 243 bool did_run = false; |
| 241 OneShotTimerTester tester(&did_run, 300); | 244 OneShotTimerTester tester(&did_run, 300); |
| 242 tester.Start(); | 245 tester.Start(); |
| 243 MessageLoop::current()->Run(); | 246 MessageLoop::current()->Run(); |
| 244 | 247 |
| 245 ASSERT_TRUE(target.signaled()); | 248 ASSERT_TRUE(target.signaled()); |
| 246 } | 249 } |
| 247 | 250 |
| 248 class DelayTimerFatalTarget { | 251 class DelayTimerFatalTarget { |
| 249 public: | 252 public: |
| 250 void Signal() { | 253 void Signal() { |
| 251 ASSERT_TRUE(false); | 254 ASSERT_TRUE(false); |
| 252 } | 255 } |
| 253 }; | 256 }; |
| 254 | 257 |
| 255 | 258 |
| 256 void RunTest_DelayTimer_Deleted(MessageLoop::Type message_loop_type) { | 259 void RunTest_DelayTimer_Deleted(MessageLoop::Type message_loop_type) { |
| 257 MessageLoop loop(message_loop_type); | 260 MessageLoop loop(message_loop_type); |
| 258 | 261 |
| 259 DelayTimerFatalTarget target; | 262 DelayTimerFatalTarget target; |
| 260 | 263 |
| 261 { | 264 { |
| 262 base::DelayTimer<DelayTimerFatalTarget> timer( | 265 base::DelayTimer<DelayTimerFatalTarget> timer( |
| 263 TimeDelta::FromMilliseconds(50), &target, | 266 TimeDelta::FromMilliseconds(50), &target, |
| 264 &DelayTimerFatalTarget::Signal); | 267 &DelayTimerFatalTarget::Signal, FROM_HERE); |
| 265 timer.Reset(); | 268 timer.Reset(); |
| 266 } | 269 } |
| 267 | 270 |
| 268 // When the timer is deleted, the DelayTimerFatalTarget should never be | 271 // When the timer is deleted, the DelayTimerFatalTarget should never be |
| 269 // called. | 272 // called. |
| 270 base::PlatformThread::Sleep(100); | 273 base::PlatformThread::Sleep(100); |
| 271 } | 274 } |
| 272 | 275 |
| 273 } // namespace | 276 } // namespace |
| 274 | 277 |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 346 OneShotTimerTester d(&did_run); | 349 OneShotTimerTester d(&did_run); |
| 347 { | 350 { |
| 348 MessageLoop loop(MessageLoop::TYPE_DEFAULT); | 351 MessageLoop loop(MessageLoop::TYPE_DEFAULT); |
| 349 a.Start(); | 352 a.Start(); |
| 350 b.Start(); | 353 b.Start(); |
| 351 } // MessageLoop destructs by falling out of scope. | 354 } // MessageLoop destructs by falling out of scope. |
| 352 } // OneShotTimers destruct. SHOULD NOT CRASH, of course. | 355 } // OneShotTimers destruct. SHOULD NOT CRASH, of course. |
| 353 | 356 |
| 354 EXPECT_FALSE(did_run); | 357 EXPECT_FALSE(did_run); |
| 355 } | 358 } |
| OLD | NEW |