| 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/memory/scoped_ptr.h" | 5 #include "base/memory/scoped_ptr.h" |
| 6 #include "base/message_loop/message_loop.h" | 6 #include "base/message_loop/message_loop.h" |
| 7 #include "base/test/test_simple_task_runner.h" | 7 #include "base/test/test_simple_task_runner.h" |
| 8 #include "base/timer/timer.h" | 8 #include "base/timer/timer.h" |
| 9 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
| 10 | 10 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 | 44 |
| 45 private: | 45 private: |
| 46 void Run() { | 46 void Run() { |
| 47 *did_run_ = true; | 47 *did_run_ = true; |
| 48 if (quit_message_loop_) { | 48 if (quit_message_loop_) { |
| 49 base::MessageLoop::current()->QuitWhenIdle(); | 49 base::MessageLoop::current()->QuitWhenIdle(); |
| 50 } | 50 } |
| 51 } | 51 } |
| 52 | 52 |
| 53 bool* did_run_; | 53 bool* did_run_; |
| 54 base::OneShotTimer<OneShotTimerTester> timer_; | 54 base::OneShotTimer timer_; |
| 55 const unsigned delay_ms_; | 55 const unsigned delay_ms_; |
| 56 bool quit_message_loop_; | 56 bool quit_message_loop_; |
| 57 }; | 57 }; |
| 58 | 58 |
| 59 class OneShotSelfDeletingTimerTester { | 59 class OneShotSelfDeletingTimerTester { |
| 60 public: | 60 public: |
| 61 explicit OneShotSelfDeletingTimerTester(bool* did_run) : | 61 explicit OneShotSelfDeletingTimerTester(bool* did_run) |
| 62 did_run_(did_run), | 62 : did_run_(did_run), timer_(new base::OneShotTimer()) {} |
| 63 timer_(new base::OneShotTimer<OneShotSelfDeletingTimerTester>()) { | |
| 64 } | |
| 65 | 63 |
| 66 void Start() { | 64 void Start() { |
| 67 timer_->Start(FROM_HERE, TimeDelta::FromMilliseconds(10), this, | 65 timer_->Start(FROM_HERE, TimeDelta::FromMilliseconds(10), this, |
| 68 &OneShotSelfDeletingTimerTester::Run); | 66 &OneShotSelfDeletingTimerTester::Run); |
| 69 } | 67 } |
| 70 | 68 |
| 71 private: | 69 private: |
| 72 void Run() { | 70 void Run() { |
| 73 *did_run_ = true; | 71 *did_run_ = true; |
| 74 timer_.reset(); | 72 timer_.reset(); |
| 75 base::MessageLoop::current()->QuitWhenIdle(); | 73 base::MessageLoop::current()->QuitWhenIdle(); |
| 76 } | 74 } |
| 77 | 75 |
| 78 bool* did_run_; | 76 bool* did_run_; |
| 79 scoped_ptr<base::OneShotTimer<OneShotSelfDeletingTimerTester> > timer_; | 77 scoped_ptr<base::OneShotTimer> timer_; |
| 80 }; | 78 }; |
| 81 | 79 |
| 82 class RepeatingTimerTester { | 80 class RepeatingTimerTester { |
| 83 public: | 81 public: |
| 84 explicit RepeatingTimerTester(bool* did_run, const TimeDelta& delay) | 82 explicit RepeatingTimerTester(bool* did_run, const TimeDelta& delay) |
| 85 : did_run_(did_run), counter_(10), delay_(delay) { | 83 : did_run_(did_run), counter_(10), delay_(delay) { |
| 86 } | 84 } |
| 87 | 85 |
| 88 void Start() { | 86 void Start() { |
| 89 timer_.Start(FROM_HERE, delay_, this, &RepeatingTimerTester::Run); | 87 timer_.Start(FROM_HERE, delay_, this, &RepeatingTimerTester::Run); |
| 90 } | 88 } |
| 91 | 89 |
| 92 private: | 90 private: |
| 93 void Run() { | 91 void Run() { |
| 94 if (--counter_ == 0) { | 92 if (--counter_ == 0) { |
| 95 *did_run_ = true; | 93 *did_run_ = true; |
| 96 timer_.Stop(); | 94 timer_.Stop(); |
| 97 base::MessageLoop::current()->QuitWhenIdle(); | 95 base::MessageLoop::current()->QuitWhenIdle(); |
| 98 } | 96 } |
| 99 } | 97 } |
| 100 | 98 |
| 101 bool* did_run_; | 99 bool* did_run_; |
| 102 int counter_; | 100 int counter_; |
| 103 TimeDelta delay_; | 101 TimeDelta delay_; |
| 104 base::RepeatingTimer<RepeatingTimerTester> timer_; | 102 base::RepeatingTimer timer_; |
| 105 }; | 103 }; |
| 106 | 104 |
| 107 void RunTest_OneShotTimer(base::MessageLoop::Type message_loop_type) { | 105 void RunTest_OneShotTimer(base::MessageLoop::Type message_loop_type) { |
| 108 base::MessageLoop loop(message_loop_type); | 106 base::MessageLoop loop(message_loop_type); |
| 109 | 107 |
| 110 bool did_run = false; | 108 bool did_run = false; |
| 111 OneShotTimerTester f(&did_run); | 109 OneShotTimerTester f(&did_run); |
| 112 f.Start(); | 110 f.Start(); |
| 113 | 111 |
| 114 base::MessageLoop::current()->Run(); | 112 base::MessageLoop::current()->Run(); |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 | 196 |
| 199 private: | 197 private: |
| 200 bool signaled_ = false; | 198 bool signaled_ = false; |
| 201 }; | 199 }; |
| 202 | 200 |
| 203 void RunTest_DelayTimer_NoCall(base::MessageLoop::Type message_loop_type) { | 201 void RunTest_DelayTimer_NoCall(base::MessageLoop::Type message_loop_type) { |
| 204 base::MessageLoop loop(message_loop_type); | 202 base::MessageLoop loop(message_loop_type); |
| 205 | 203 |
| 206 // If Delay is never called, the timer shouldn't go off. | 204 // If Delay is never called, the timer shouldn't go off. |
| 207 DelayTimerTarget target; | 205 DelayTimerTarget target; |
| 208 base::DelayTimer<DelayTimerTarget> timer(FROM_HERE, | 206 base::DelayTimer timer(FROM_HERE, TimeDelta::FromMilliseconds(1), &target, |
| 209 TimeDelta::FromMilliseconds(1), &target, &DelayTimerTarget::Signal); | 207 &DelayTimerTarget::Signal); |
| 210 | 208 |
| 211 bool did_run = false; | 209 bool did_run = false; |
| 212 OneShotTimerTester tester(&did_run); | 210 OneShotTimerTester tester(&did_run); |
| 213 tester.Start(); | 211 tester.Start(); |
| 214 base::MessageLoop::current()->Run(); | 212 base::MessageLoop::current()->Run(); |
| 215 | 213 |
| 216 ASSERT_FALSE(target.signaled()); | 214 ASSERT_FALSE(target.signaled()); |
| 217 } | 215 } |
| 218 | 216 |
| 219 void RunTest_DelayTimer_OneCall(base::MessageLoop::Type message_loop_type) { | 217 void RunTest_DelayTimer_OneCall(base::MessageLoop::Type message_loop_type) { |
| 220 base::MessageLoop loop(message_loop_type); | 218 base::MessageLoop loop(message_loop_type); |
| 221 | 219 |
| 222 DelayTimerTarget target; | 220 DelayTimerTarget target; |
| 223 base::DelayTimer<DelayTimerTarget> timer(FROM_HERE, | 221 base::DelayTimer timer(FROM_HERE, TimeDelta::FromMilliseconds(1), &target, |
| 224 TimeDelta::FromMilliseconds(1), &target, &DelayTimerTarget::Signal); | 222 &DelayTimerTarget::Signal); |
| 225 timer.Reset(); | 223 timer.Reset(); |
| 226 | 224 |
| 227 bool did_run = false; | 225 bool did_run = false; |
| 228 OneShotTimerTester tester(&did_run, 100 /* milliseconds */); | 226 OneShotTimerTester tester(&did_run, 100 /* milliseconds */); |
| 229 tester.Start(); | 227 tester.Start(); |
| 230 base::MessageLoop::current()->Run(); | 228 base::MessageLoop::current()->Run(); |
| 231 | 229 |
| 232 ASSERT_TRUE(target.signaled()); | 230 ASSERT_TRUE(target.signaled()); |
| 233 } | 231 } |
| 234 | 232 |
| 235 struct ResetHelper { | 233 struct ResetHelper { |
| 236 ResetHelper(base::DelayTimer<DelayTimerTarget>* timer, | 234 ResetHelper(base::DelayTimer* timer, DelayTimerTarget* target) |
| 237 DelayTimerTarget* target) | 235 : timer_(timer), target_(target) {} |
| 238 : timer_(timer), | |
| 239 target_(target) { | |
| 240 } | |
| 241 | 236 |
| 242 void Reset() { | 237 void Reset() { |
| 243 ASSERT_FALSE(target_->signaled()); | 238 ASSERT_FALSE(target_->signaled()); |
| 244 timer_->Reset(); | 239 timer_->Reset(); |
| 245 } | 240 } |
| 246 | 241 |
| 247 private: | 242 private: |
| 248 base::DelayTimer<DelayTimerTarget> *const timer_; | 243 base::DelayTimer* const timer_; |
| 249 DelayTimerTarget *const target_; | 244 DelayTimerTarget* const target_; |
| 250 }; | 245 }; |
| 251 | 246 |
| 252 void RunTest_DelayTimer_Reset(base::MessageLoop::Type message_loop_type) { | 247 void RunTest_DelayTimer_Reset(base::MessageLoop::Type message_loop_type) { |
| 253 base::MessageLoop loop(message_loop_type); | 248 base::MessageLoop loop(message_loop_type); |
| 254 | 249 |
| 255 // If Delay is never called, the timer shouldn't go off. | 250 // If Delay is never called, the timer shouldn't go off. |
| 256 DelayTimerTarget target; | 251 DelayTimerTarget target; |
| 257 base::DelayTimer<DelayTimerTarget> timer(FROM_HERE, | 252 base::DelayTimer timer(FROM_HERE, TimeDelta::FromMilliseconds(50), &target, |
| 258 TimeDelta::FromMilliseconds(50), &target, &DelayTimerTarget::Signal); | 253 &DelayTimerTarget::Signal); |
| 259 timer.Reset(); | 254 timer.Reset(); |
| 260 | 255 |
| 261 ResetHelper reset_helper(&timer, &target); | 256 ResetHelper reset_helper(&timer, &target); |
| 262 | 257 |
| 263 base::OneShotTimer<ResetHelper> timers[20]; | 258 base::OneShotTimer timers[20]; |
| 264 for (size_t i = 0; i < arraysize(timers); ++i) { | 259 for (size_t i = 0; i < arraysize(timers); ++i) { |
| 265 timers[i].Start(FROM_HERE, TimeDelta::FromMilliseconds(i * 10), | 260 timers[i].Start(FROM_HERE, TimeDelta::FromMilliseconds(i * 10), |
| 266 &reset_helper, &ResetHelper::Reset); | 261 &reset_helper, &ResetHelper::Reset); |
| 267 } | 262 } |
| 268 | 263 |
| 269 bool did_run = false; | 264 bool did_run = false; |
| 270 OneShotTimerTester tester(&did_run, 300); | 265 OneShotTimerTester tester(&did_run, 300); |
| 271 tester.Start(); | 266 tester.Start(); |
| 272 base::MessageLoop::current()->Run(); | 267 base::MessageLoop::current()->Run(); |
| 273 | 268 |
| 274 ASSERT_TRUE(target.signaled()); | 269 ASSERT_TRUE(target.signaled()); |
| 275 } | 270 } |
| 276 | 271 |
| 277 class DelayTimerFatalTarget { | 272 class DelayTimerFatalTarget { |
| 278 public: | 273 public: |
| 279 void Signal() { | 274 void Signal() { |
| 280 ASSERT_TRUE(false); | 275 ASSERT_TRUE(false); |
| 281 } | 276 } |
| 282 }; | 277 }; |
| 283 | 278 |
| 284 | 279 |
| 285 void RunTest_DelayTimer_Deleted(base::MessageLoop::Type message_loop_type) { | 280 void RunTest_DelayTimer_Deleted(base::MessageLoop::Type message_loop_type) { |
| 286 base::MessageLoop loop(message_loop_type); | 281 base::MessageLoop loop(message_loop_type); |
| 287 | 282 |
| 288 DelayTimerFatalTarget target; | 283 DelayTimerFatalTarget target; |
| 289 | 284 |
| 290 { | 285 { |
| 291 base::DelayTimer<DelayTimerFatalTarget> timer( | 286 base::DelayTimer timer(FROM_HERE, TimeDelta::FromMilliseconds(50), &target, |
| 292 FROM_HERE, TimeDelta::FromMilliseconds(50), &target, | 287 &DelayTimerFatalTarget::Signal); |
| 293 &DelayTimerFatalTarget::Signal); | |
| 294 timer.Reset(); | 288 timer.Reset(); |
| 295 } | 289 } |
| 296 | 290 |
| 297 // When the timer is deleted, the DelayTimerFatalTarget should never be | 291 // When the timer is deleted, the DelayTimerFatalTarget should never be |
| 298 // called. | 292 // called. |
| 299 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(100)); | 293 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(100)); |
| 300 } | 294 } |
| 301 | 295 |
| 302 } // namespace | 296 } // namespace |
| 303 | 297 |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 528 base::Bind(&SetCallbackHappened1)); | 522 base::Bind(&SetCallbackHappened1)); |
| 529 timer.Reset(); | 523 timer.Reset(); |
| 530 // Since Reset happened before task ran, the user_task must not be cleared: | 524 // Since Reset happened before task ran, the user_task must not be cleared: |
| 531 ASSERT_FALSE(timer.user_task().is_null()); | 525 ASSERT_FALSE(timer.user_task().is_null()); |
| 532 base::MessageLoop::current()->Run(); | 526 base::MessageLoop::current()->Run(); |
| 533 EXPECT_TRUE(g_callback_happened1); | 527 EXPECT_TRUE(g_callback_happened1); |
| 534 } | 528 } |
| 535 } | 529 } |
| 536 | 530 |
| 537 } // namespace | 531 } // namespace |
| OLD | NEW |