| 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.h" | 6 #include "base/message_loop.h" |
| 7 #include "base/timer.h" | 7 #include "base/timer.h" |
| 8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
| 9 | 9 |
| 10 using base::TimeDelta; | 10 using base::TimeDelta; |
| 11 | 11 |
| 12 namespace { | 12 namespace { |
| 13 | 13 |
| 14 // The message loops on which each timer should be tested. | 14 // The message loops on which each timer should be tested. |
| 15 const MessageLoop::Type testing_message_loops[] = { | 15 const base::MessageLoop::Type testing_message_loops[] = { |
| 16 MessageLoop::TYPE_DEFAULT, | 16 base::MessageLoop::TYPE_DEFAULT, |
| 17 MessageLoop::TYPE_IO, | 17 base::MessageLoop::TYPE_IO, |
| 18 #if !defined(OS_IOS) // iOS does not allow direct running of the UI loop. | 18 #if !defined(OS_IOS) // iOS does not allow direct running of the UI loop. |
| 19 MessageLoop::TYPE_UI, | 19 base::MessageLoop::TYPE_UI, |
| 20 #endif | 20 #endif |
| 21 }; | 21 }; |
| 22 | 22 |
| 23 const int kNumTestingMessageLoops = arraysize(testing_message_loops); | 23 const int kNumTestingMessageLoops = arraysize(testing_message_loops); |
| 24 | 24 |
| 25 class OneShotTimerTester { | 25 class OneShotTimerTester { |
| 26 public: | 26 public: |
| 27 explicit OneShotTimerTester(bool* did_run, unsigned milliseconds = 10) | 27 explicit OneShotTimerTester(bool* did_run, unsigned milliseconds = 10) |
| 28 : did_run_(did_run), | 28 : did_run_(did_run), |
| 29 delay_ms_(milliseconds) { | 29 delay_ms_(milliseconds) { |
| 30 } | 30 } |
| 31 void Start() { | 31 void Start() { |
| 32 timer_.Start(FROM_HERE, TimeDelta::FromMilliseconds(delay_ms_), this, | 32 timer_.Start(FROM_HERE, TimeDelta::FromMilliseconds(delay_ms_), this, |
| 33 &OneShotTimerTester::Run); | 33 &OneShotTimerTester::Run); |
| 34 } | 34 } |
| 35 private: | 35 private: |
| 36 void Run() { | 36 void Run() { |
| 37 *did_run_ = true; | 37 *did_run_ = true; |
| 38 MessageLoop::current()->QuitWhenIdle(); | 38 base::MessageLoop::current()->QuitWhenIdle(); |
| 39 } | 39 } |
| 40 bool* did_run_; | 40 bool* did_run_; |
| 41 base::OneShotTimer<OneShotTimerTester> timer_; | 41 base::OneShotTimer<OneShotTimerTester> timer_; |
| 42 const unsigned delay_ms_; | 42 const unsigned delay_ms_; |
| 43 }; | 43 }; |
| 44 | 44 |
| 45 class OneShotSelfDeletingTimerTester { | 45 class OneShotSelfDeletingTimerTester { |
| 46 public: | 46 public: |
| 47 explicit OneShotSelfDeletingTimerTester(bool* did_run) : | 47 explicit OneShotSelfDeletingTimerTester(bool* did_run) : |
| 48 did_run_(did_run), | 48 did_run_(did_run), |
| 49 timer_(new base::OneShotTimer<OneShotSelfDeletingTimerTester>()) { | 49 timer_(new base::OneShotTimer<OneShotSelfDeletingTimerTester>()) { |
| 50 } | 50 } |
| 51 void Start() { | 51 void Start() { |
| 52 timer_->Start(FROM_HERE, TimeDelta::FromMilliseconds(10), this, | 52 timer_->Start(FROM_HERE, TimeDelta::FromMilliseconds(10), this, |
| 53 &OneShotSelfDeletingTimerTester::Run); | 53 &OneShotSelfDeletingTimerTester::Run); |
| 54 } | 54 } |
| 55 private: | 55 private: |
| 56 void Run() { | 56 void Run() { |
| 57 *did_run_ = true; | 57 *did_run_ = true; |
| 58 timer_.reset(); | 58 timer_.reset(); |
| 59 MessageLoop::current()->QuitWhenIdle(); | 59 base::MessageLoop::current()->QuitWhenIdle(); |
| 60 } | 60 } |
| 61 bool* did_run_; | 61 bool* did_run_; |
| 62 scoped_ptr<base::OneShotTimer<OneShotSelfDeletingTimerTester> > timer_; | 62 scoped_ptr<base::OneShotTimer<OneShotSelfDeletingTimerTester> > timer_; |
| 63 }; | 63 }; |
| 64 | 64 |
| 65 class RepeatingTimerTester { | 65 class RepeatingTimerTester { |
| 66 public: | 66 public: |
| 67 explicit RepeatingTimerTester(bool* did_run) | 67 explicit RepeatingTimerTester(bool* did_run) |
| 68 : did_run_(did_run), counter_(10) { | 68 : did_run_(did_run), counter_(10) { |
| 69 } | 69 } |
| 70 | 70 |
| 71 void Start() { | 71 void Start() { |
| 72 timer_.Start(FROM_HERE, TimeDelta::FromMilliseconds(10), this, | 72 timer_.Start(FROM_HERE, TimeDelta::FromMilliseconds(10), this, |
| 73 &RepeatingTimerTester::Run); | 73 &RepeatingTimerTester::Run); |
| 74 } | 74 } |
| 75 private: | 75 private: |
| 76 void Run() { | 76 void Run() { |
| 77 if (--counter_ == 0) { | 77 if (--counter_ == 0) { |
| 78 *did_run_ = true; | 78 *did_run_ = true; |
| 79 MessageLoop::current()->QuitWhenIdle(); | 79 base::MessageLoop::current()->QuitWhenIdle(); |
| 80 } | 80 } |
| 81 } | 81 } |
| 82 bool* did_run_; | 82 bool* did_run_; |
| 83 int counter_; | 83 int counter_; |
| 84 base::RepeatingTimer<RepeatingTimerTester> timer_; | 84 base::RepeatingTimer<RepeatingTimerTester> timer_; |
| 85 }; | 85 }; |
| 86 | 86 |
| 87 void RunTest_OneShotTimer(MessageLoop::Type message_loop_type) { | 87 void RunTest_OneShotTimer(base::MessageLoop::Type message_loop_type) { |
| 88 MessageLoop loop(message_loop_type); | 88 base::MessageLoop loop(message_loop_type); |
| 89 | 89 |
| 90 bool did_run = false; | 90 bool did_run = false; |
| 91 OneShotTimerTester f(&did_run); | 91 OneShotTimerTester f(&did_run); |
| 92 f.Start(); | 92 f.Start(); |
| 93 | 93 |
| 94 MessageLoop::current()->Run(); | 94 base::MessageLoop::current()->Run(); |
| 95 | 95 |
| 96 EXPECT_TRUE(did_run); | 96 EXPECT_TRUE(did_run); |
| 97 } | 97 } |
| 98 | 98 |
| 99 void RunTest_OneShotTimer_Cancel(MessageLoop::Type message_loop_type) { | 99 void RunTest_OneShotTimer_Cancel(base::MessageLoop::Type message_loop_type) { |
| 100 MessageLoop loop(message_loop_type); | 100 base::MessageLoop loop(message_loop_type); |
| 101 | 101 |
| 102 bool did_run_a = false; | 102 bool did_run_a = false; |
| 103 OneShotTimerTester* a = new OneShotTimerTester(&did_run_a); | 103 OneShotTimerTester* a = new OneShotTimerTester(&did_run_a); |
| 104 | 104 |
| 105 // This should run before the timer expires. | 105 // This should run before the timer expires. |
| 106 MessageLoop::current()->DeleteSoon(FROM_HERE, a); | 106 base::MessageLoop::current()->DeleteSoon(FROM_HERE, a); |
| 107 | 107 |
| 108 // Now start the timer. | 108 // Now start the timer. |
| 109 a->Start(); | 109 a->Start(); |
| 110 | 110 |
| 111 bool did_run_b = false; | 111 bool did_run_b = false; |
| 112 OneShotTimerTester b(&did_run_b); | 112 OneShotTimerTester b(&did_run_b); |
| 113 b.Start(); | 113 b.Start(); |
| 114 | 114 |
| 115 MessageLoop::current()->Run(); | 115 base::MessageLoop::current()->Run(); |
| 116 | 116 |
| 117 EXPECT_FALSE(did_run_a); | 117 EXPECT_FALSE(did_run_a); |
| 118 EXPECT_TRUE(did_run_b); | 118 EXPECT_TRUE(did_run_b); |
| 119 } | 119 } |
| 120 | 120 |
| 121 void RunTest_OneShotSelfDeletingTimer(MessageLoop::Type message_loop_type) { | 121 void RunTest_OneShotSelfDeletingTimer( |
| 122 MessageLoop loop(message_loop_type); | 122 base::MessageLoop::Type message_loop_type) { |
| 123 base::MessageLoop loop(message_loop_type); |
| 123 | 124 |
| 124 bool did_run = false; | 125 bool did_run = false; |
| 125 OneShotSelfDeletingTimerTester f(&did_run); | 126 OneShotSelfDeletingTimerTester f(&did_run); |
| 126 f.Start(); | 127 f.Start(); |
| 127 | 128 |
| 128 MessageLoop::current()->Run(); | 129 base::MessageLoop::current()->Run(); |
| 129 | 130 |
| 130 EXPECT_TRUE(did_run); | 131 EXPECT_TRUE(did_run); |
| 131 } | 132 } |
| 132 | 133 |
| 133 void RunTest_RepeatingTimer(MessageLoop::Type message_loop_type) { | 134 void RunTest_RepeatingTimer(base::MessageLoop::Type message_loop_type) { |
| 134 MessageLoop loop(message_loop_type); | 135 base::MessageLoop loop(message_loop_type); |
| 135 | 136 |
| 136 bool did_run = false; | 137 bool did_run = false; |
| 137 RepeatingTimerTester f(&did_run); | 138 RepeatingTimerTester f(&did_run); |
| 138 f.Start(); | 139 f.Start(); |
| 139 | 140 |
| 140 MessageLoop::current()->Run(); | 141 base::MessageLoop::current()->Run(); |
| 141 | 142 |
| 142 EXPECT_TRUE(did_run); | 143 EXPECT_TRUE(did_run); |
| 143 } | 144 } |
| 144 | 145 |
| 145 void RunTest_RepeatingTimer_Cancel(MessageLoop::Type message_loop_type) { | 146 void RunTest_RepeatingTimer_Cancel(base::MessageLoop::Type message_loop_type) { |
| 146 MessageLoop loop(message_loop_type); | 147 base::MessageLoop loop(message_loop_type); |
| 147 | 148 |
| 148 bool did_run_a = false; | 149 bool did_run_a = false; |
| 149 RepeatingTimerTester* a = new RepeatingTimerTester(&did_run_a); | 150 RepeatingTimerTester* a = new RepeatingTimerTester(&did_run_a); |
| 150 | 151 |
| 151 // This should run before the timer expires. | 152 // This should run before the timer expires. |
| 152 MessageLoop::current()->DeleteSoon(FROM_HERE, a); | 153 base::MessageLoop::current()->DeleteSoon(FROM_HERE, a); |
| 153 | 154 |
| 154 // Now start the timer. | 155 // Now start the timer. |
| 155 a->Start(); | 156 a->Start(); |
| 156 | 157 |
| 157 bool did_run_b = false; | 158 bool did_run_b = false; |
| 158 RepeatingTimerTester b(&did_run_b); | 159 RepeatingTimerTester b(&did_run_b); |
| 159 b.Start(); | 160 b.Start(); |
| 160 | 161 |
| 161 MessageLoop::current()->Run(); | 162 base::MessageLoop::current()->Run(); |
| 162 | 163 |
| 163 EXPECT_FALSE(did_run_a); | 164 EXPECT_FALSE(did_run_a); |
| 164 EXPECT_TRUE(did_run_b); | 165 EXPECT_TRUE(did_run_b); |
| 165 } | 166 } |
| 166 | 167 |
| 167 class DelayTimerTarget { | 168 class DelayTimerTarget { |
| 168 public: | 169 public: |
| 169 DelayTimerTarget() | 170 DelayTimerTarget() |
| 170 : signaled_(false) { | 171 : signaled_(false) { |
| 171 } | 172 } |
| 172 | 173 |
| 173 bool signaled() const { return signaled_; } | 174 bool signaled() const { return signaled_; } |
| 174 | 175 |
| 175 void Signal() { | 176 void Signal() { |
| 176 ASSERT_FALSE(signaled_); | 177 ASSERT_FALSE(signaled_); |
| 177 signaled_ = true; | 178 signaled_ = true; |
| 178 } | 179 } |
| 179 | 180 |
| 180 private: | 181 private: |
| 181 bool signaled_; | 182 bool signaled_; |
| 182 }; | 183 }; |
| 183 | 184 |
| 184 void RunTest_DelayTimer_NoCall(MessageLoop::Type message_loop_type) { | 185 void RunTest_DelayTimer_NoCall(base::MessageLoop::Type message_loop_type) { |
| 185 MessageLoop loop(message_loop_type); | 186 base::MessageLoop loop(message_loop_type); |
| 186 | 187 |
| 187 // If Delay is never called, the timer shouldn't go off. | 188 // If Delay is never called, the timer shouldn't go off. |
| 188 DelayTimerTarget target; | 189 DelayTimerTarget target; |
| 189 base::DelayTimer<DelayTimerTarget> timer(FROM_HERE, | 190 base::DelayTimer<DelayTimerTarget> timer(FROM_HERE, |
| 190 TimeDelta::FromMilliseconds(1), &target, &DelayTimerTarget::Signal); | 191 TimeDelta::FromMilliseconds(1), &target, &DelayTimerTarget::Signal); |
| 191 | 192 |
| 192 bool did_run = false; | 193 bool did_run = false; |
| 193 OneShotTimerTester tester(&did_run); | 194 OneShotTimerTester tester(&did_run); |
| 194 tester.Start(); | 195 tester.Start(); |
| 195 MessageLoop::current()->Run(); | 196 base::MessageLoop::current()->Run(); |
| 196 | 197 |
| 197 ASSERT_FALSE(target.signaled()); | 198 ASSERT_FALSE(target.signaled()); |
| 198 } | 199 } |
| 199 | 200 |
| 200 void RunTest_DelayTimer_OneCall(MessageLoop::Type message_loop_type) { | 201 void RunTest_DelayTimer_OneCall(base::MessageLoop::Type message_loop_type) { |
| 201 MessageLoop loop(message_loop_type); | 202 base::MessageLoop loop(message_loop_type); |
| 202 | 203 |
| 203 DelayTimerTarget target; | 204 DelayTimerTarget target; |
| 204 base::DelayTimer<DelayTimerTarget> timer(FROM_HERE, | 205 base::DelayTimer<DelayTimerTarget> timer(FROM_HERE, |
| 205 TimeDelta::FromMilliseconds(1), &target, &DelayTimerTarget::Signal); | 206 TimeDelta::FromMilliseconds(1), &target, &DelayTimerTarget::Signal); |
| 206 timer.Reset(); | 207 timer.Reset(); |
| 207 | 208 |
| 208 bool did_run = false; | 209 bool did_run = false; |
| 209 OneShotTimerTester tester(&did_run, 100 /* milliseconds */); | 210 OneShotTimerTester tester(&did_run, 100 /* milliseconds */); |
| 210 tester.Start(); | 211 tester.Start(); |
| 211 MessageLoop::current()->Run(); | 212 base::MessageLoop::current()->Run(); |
| 212 | 213 |
| 213 ASSERT_TRUE(target.signaled()); | 214 ASSERT_TRUE(target.signaled()); |
| 214 } | 215 } |
| 215 | 216 |
| 216 struct ResetHelper { | 217 struct ResetHelper { |
| 217 ResetHelper(base::DelayTimer<DelayTimerTarget>* timer, | 218 ResetHelper(base::DelayTimer<DelayTimerTarget>* timer, |
| 218 DelayTimerTarget* target) | 219 DelayTimerTarget* target) |
| 219 : timer_(timer), | 220 : timer_(timer), |
| 220 target_(target) { | 221 target_(target) { |
| 221 } | 222 } |
| 222 | 223 |
| 223 void Reset() { | 224 void Reset() { |
| 224 ASSERT_FALSE(target_->signaled()); | 225 ASSERT_FALSE(target_->signaled()); |
| 225 timer_->Reset(); | 226 timer_->Reset(); |
| 226 } | 227 } |
| 227 | 228 |
| 228 private: | 229 private: |
| 229 base::DelayTimer<DelayTimerTarget> *const timer_; | 230 base::DelayTimer<DelayTimerTarget> *const timer_; |
| 230 DelayTimerTarget *const target_; | 231 DelayTimerTarget *const target_; |
| 231 }; | 232 }; |
| 232 | 233 |
| 233 void RunTest_DelayTimer_Reset(MessageLoop::Type message_loop_type) { | 234 void RunTest_DelayTimer_Reset(base::MessageLoop::Type message_loop_type) { |
| 234 MessageLoop loop(message_loop_type); | 235 base::MessageLoop loop(message_loop_type); |
| 235 | 236 |
| 236 // If Delay is never called, the timer shouldn't go off. | 237 // If Delay is never called, the timer shouldn't go off. |
| 237 DelayTimerTarget target; | 238 DelayTimerTarget target; |
| 238 base::DelayTimer<DelayTimerTarget> timer(FROM_HERE, | 239 base::DelayTimer<DelayTimerTarget> timer(FROM_HERE, |
| 239 TimeDelta::FromMilliseconds(50), &target, &DelayTimerTarget::Signal); | 240 TimeDelta::FromMilliseconds(50), &target, &DelayTimerTarget::Signal); |
| 240 timer.Reset(); | 241 timer.Reset(); |
| 241 | 242 |
| 242 ResetHelper reset_helper(&timer, &target); | 243 ResetHelper reset_helper(&timer, &target); |
| 243 | 244 |
| 244 base::OneShotTimer<ResetHelper> timers[20]; | 245 base::OneShotTimer<ResetHelper> timers[20]; |
| 245 for (size_t i = 0; i < arraysize(timers); ++i) { | 246 for (size_t i = 0; i < arraysize(timers); ++i) { |
| 246 timers[i].Start(FROM_HERE, TimeDelta::FromMilliseconds(i * 10), | 247 timers[i].Start(FROM_HERE, TimeDelta::FromMilliseconds(i * 10), |
| 247 &reset_helper, &ResetHelper::Reset); | 248 &reset_helper, &ResetHelper::Reset); |
| 248 } | 249 } |
| 249 | 250 |
| 250 bool did_run = false; | 251 bool did_run = false; |
| 251 OneShotTimerTester tester(&did_run, 300); | 252 OneShotTimerTester tester(&did_run, 300); |
| 252 tester.Start(); | 253 tester.Start(); |
| 253 MessageLoop::current()->Run(); | 254 base::MessageLoop::current()->Run(); |
| 254 | 255 |
| 255 ASSERT_TRUE(target.signaled()); | 256 ASSERT_TRUE(target.signaled()); |
| 256 } | 257 } |
| 257 | 258 |
| 258 class DelayTimerFatalTarget { | 259 class DelayTimerFatalTarget { |
| 259 public: | 260 public: |
| 260 void Signal() { | 261 void Signal() { |
| 261 ASSERT_TRUE(false); | 262 ASSERT_TRUE(false); |
| 262 } | 263 } |
| 263 }; | 264 }; |
| 264 | 265 |
| 265 | 266 |
| 266 void RunTest_DelayTimer_Deleted(MessageLoop::Type message_loop_type) { | 267 void RunTest_DelayTimer_Deleted(base::MessageLoop::Type message_loop_type) { |
| 267 MessageLoop loop(message_loop_type); | 268 base::MessageLoop loop(message_loop_type); |
| 268 | 269 |
| 269 DelayTimerFatalTarget target; | 270 DelayTimerFatalTarget target; |
| 270 | 271 |
| 271 { | 272 { |
| 272 base::DelayTimer<DelayTimerFatalTarget> timer( | 273 base::DelayTimer<DelayTimerFatalTarget> timer( |
| 273 FROM_HERE, TimeDelta::FromMilliseconds(50), &target, | 274 FROM_HERE, TimeDelta::FromMilliseconds(50), &target, |
| 274 &DelayTimerFatalTarget::Signal); | 275 &DelayTimerFatalTarget::Signal); |
| 275 timer.Reset(); | 276 timer.Reset(); |
| 276 } | 277 } |
| 277 | 278 |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 348 // message loop does not cause crashes if there were pending | 349 // message loop does not cause crashes if there were pending |
| 349 // timers not yet fired. It may only trigger exceptions | 350 // timers not yet fired. It may only trigger exceptions |
| 350 // if debug heap checking is enabled. | 351 // if debug heap checking is enabled. |
| 351 bool did_run = false; | 352 bool did_run = false; |
| 352 { | 353 { |
| 353 OneShotTimerTester a(&did_run); | 354 OneShotTimerTester a(&did_run); |
| 354 OneShotTimerTester b(&did_run); | 355 OneShotTimerTester b(&did_run); |
| 355 OneShotTimerTester c(&did_run); | 356 OneShotTimerTester c(&did_run); |
| 356 OneShotTimerTester d(&did_run); | 357 OneShotTimerTester d(&did_run); |
| 357 { | 358 { |
| 358 MessageLoop loop(MessageLoop::TYPE_DEFAULT); | 359 base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT); |
| 359 a.Start(); | 360 a.Start(); |
| 360 b.Start(); | 361 b.Start(); |
| 361 } // MessageLoop destructs by falling out of scope. | 362 } // MessageLoop destructs by falling out of scope. |
| 362 } // OneShotTimers destruct. SHOULD NOT CRASH, of course. | 363 } // OneShotTimers destruct. SHOULD NOT CRASH, of course. |
| 363 | 364 |
| 364 EXPECT_FALSE(did_run); | 365 EXPECT_FALSE(did_run); |
| 365 } | 366 } |
| 366 | 367 |
| 367 void TimerTestCallback() { | 368 void TimerTestCallback() { |
| 368 } | 369 } |
| 369 | 370 |
| 370 TEST(TimerTest, NonRepeatIsRunning) { | 371 TEST(TimerTest, NonRepeatIsRunning) { |
| 371 { | 372 { |
| 372 MessageLoop loop(MessageLoop::TYPE_DEFAULT); | 373 base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT); |
| 373 base::Timer timer(false, false); | 374 base::Timer timer(false, false); |
| 374 EXPECT_FALSE(timer.IsRunning()); | 375 EXPECT_FALSE(timer.IsRunning()); |
| 375 timer.Start(FROM_HERE, TimeDelta::FromDays(1), | 376 timer.Start(FROM_HERE, TimeDelta::FromDays(1), |
| 376 base::Bind(&TimerTestCallback)); | 377 base::Bind(&TimerTestCallback)); |
| 377 EXPECT_TRUE(timer.IsRunning()); | 378 EXPECT_TRUE(timer.IsRunning()); |
| 378 timer.Stop(); | 379 timer.Stop(); |
| 379 EXPECT_FALSE(timer.IsRunning()); | 380 EXPECT_FALSE(timer.IsRunning()); |
| 380 EXPECT_TRUE(timer.user_task().is_null()); | 381 EXPECT_TRUE(timer.user_task().is_null()); |
| 381 } | 382 } |
| 382 | 383 |
| 383 { | 384 { |
| 384 base::Timer timer(true, false); | 385 base::Timer timer(true, false); |
| 385 MessageLoop loop(MessageLoop::TYPE_DEFAULT); | 386 base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT); |
| 386 EXPECT_FALSE(timer.IsRunning()); | 387 EXPECT_FALSE(timer.IsRunning()); |
| 387 timer.Start(FROM_HERE, TimeDelta::FromDays(1), | 388 timer.Start(FROM_HERE, TimeDelta::FromDays(1), |
| 388 base::Bind(&TimerTestCallback)); | 389 base::Bind(&TimerTestCallback)); |
| 389 EXPECT_TRUE(timer.IsRunning()); | 390 EXPECT_TRUE(timer.IsRunning()); |
| 390 timer.Stop(); | 391 timer.Stop(); |
| 391 EXPECT_FALSE(timer.IsRunning()); | 392 EXPECT_FALSE(timer.IsRunning()); |
| 392 ASSERT_FALSE(timer.user_task().is_null()); | 393 ASSERT_FALSE(timer.user_task().is_null()); |
| 393 timer.Reset(); | 394 timer.Reset(); |
| 394 EXPECT_TRUE(timer.IsRunning()); | 395 EXPECT_TRUE(timer.IsRunning()); |
| 395 } | 396 } |
| 396 } | 397 } |
| 397 | 398 |
| 398 TEST(TimerTest, NonRepeatMessageLoopDeath) { | 399 TEST(TimerTest, NonRepeatMessageLoopDeath) { |
| 399 base::Timer timer(false, false); | 400 base::Timer timer(false, false); |
| 400 { | 401 { |
| 401 MessageLoop loop(MessageLoop::TYPE_DEFAULT); | 402 base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT); |
| 402 EXPECT_FALSE(timer.IsRunning()); | 403 EXPECT_FALSE(timer.IsRunning()); |
| 403 timer.Start(FROM_HERE, TimeDelta::FromDays(1), | 404 timer.Start(FROM_HERE, TimeDelta::FromDays(1), |
| 404 base::Bind(&TimerTestCallback)); | 405 base::Bind(&TimerTestCallback)); |
| 405 EXPECT_TRUE(timer.IsRunning()); | 406 EXPECT_TRUE(timer.IsRunning()); |
| 406 } | 407 } |
| 407 EXPECT_FALSE(timer.IsRunning()); | 408 EXPECT_FALSE(timer.IsRunning()); |
| 408 EXPECT_TRUE(timer.user_task().is_null()); | 409 EXPECT_TRUE(timer.user_task().is_null()); |
| 409 } | 410 } |
| 410 | 411 |
| 411 TEST(TimerTest, RetainRepeatIsRunning) { | 412 TEST(TimerTest, RetainRepeatIsRunning) { |
| 412 MessageLoop loop(MessageLoop::TYPE_DEFAULT); | 413 base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT); |
| 413 base::Timer timer(FROM_HERE, TimeDelta::FromDays(1), | 414 base::Timer timer(FROM_HERE, TimeDelta::FromDays(1), |
| 414 base::Bind(&TimerTestCallback), true); | 415 base::Bind(&TimerTestCallback), true); |
| 415 EXPECT_FALSE(timer.IsRunning()); | 416 EXPECT_FALSE(timer.IsRunning()); |
| 416 timer.Reset(); | 417 timer.Reset(); |
| 417 EXPECT_TRUE(timer.IsRunning()); | 418 EXPECT_TRUE(timer.IsRunning()); |
| 418 timer.Stop(); | 419 timer.Stop(); |
| 419 EXPECT_FALSE(timer.IsRunning()); | 420 EXPECT_FALSE(timer.IsRunning()); |
| 420 timer.Reset(); | 421 timer.Reset(); |
| 421 EXPECT_TRUE(timer.IsRunning()); | 422 EXPECT_TRUE(timer.IsRunning()); |
| 422 } | 423 } |
| 423 | 424 |
| 424 TEST(TimerTest, RetainNonRepeatIsRunning) { | 425 TEST(TimerTest, RetainNonRepeatIsRunning) { |
| 425 MessageLoop loop(MessageLoop::TYPE_DEFAULT); | 426 base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT); |
| 426 base::Timer timer(FROM_HERE, TimeDelta::FromDays(1), | 427 base::Timer timer(FROM_HERE, TimeDelta::FromDays(1), |
| 427 base::Bind(&TimerTestCallback), false); | 428 base::Bind(&TimerTestCallback), false); |
| 428 EXPECT_FALSE(timer.IsRunning()); | 429 EXPECT_FALSE(timer.IsRunning()); |
| 429 timer.Reset(); | 430 timer.Reset(); |
| 430 EXPECT_TRUE(timer.IsRunning()); | 431 EXPECT_TRUE(timer.IsRunning()); |
| 431 timer.Stop(); | 432 timer.Stop(); |
| 432 EXPECT_FALSE(timer.IsRunning()); | 433 EXPECT_FALSE(timer.IsRunning()); |
| 433 timer.Reset(); | 434 timer.Reset(); |
| 434 EXPECT_TRUE(timer.IsRunning()); | 435 EXPECT_TRUE(timer.IsRunning()); |
| 435 } | 436 } |
| 436 | 437 |
| 437 namespace { | 438 namespace { |
| 438 | 439 |
| 439 bool g_callback_happened1 = false; | 440 bool g_callback_happened1 = false; |
| 440 bool g_callback_happened2 = false; | 441 bool g_callback_happened2 = false; |
| 441 | 442 |
| 442 void ClearAllCallbackHappened() { | 443 void ClearAllCallbackHappened() { |
| 443 g_callback_happened1 = false; | 444 g_callback_happened1 = false; |
| 444 g_callback_happened2 = false; | 445 g_callback_happened2 = false; |
| 445 } | 446 } |
| 446 | 447 |
| 447 void SetCallbackHappened1() { | 448 void SetCallbackHappened1() { |
| 448 g_callback_happened1 = true; | 449 g_callback_happened1 = true; |
| 449 MessageLoop::current()->QuitWhenIdle(); | 450 base::MessageLoop::current()->QuitWhenIdle(); |
| 450 } | 451 } |
| 451 | 452 |
| 452 void SetCallbackHappened2() { | 453 void SetCallbackHappened2() { |
| 453 g_callback_happened2 = true; | 454 g_callback_happened2 = true; |
| 454 MessageLoop::current()->QuitWhenIdle(); | 455 base::MessageLoop::current()->QuitWhenIdle(); |
| 455 } | 456 } |
| 456 | 457 |
| 457 TEST(TimerTest, ContinuationStopStart) { | 458 TEST(TimerTest, ContinuationStopStart) { |
| 458 { | 459 { |
| 459 ClearAllCallbackHappened(); | 460 ClearAllCallbackHappened(); |
| 460 MessageLoop loop(MessageLoop::TYPE_DEFAULT); | 461 base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT); |
| 461 base::Timer timer(false, false); | 462 base::Timer timer(false, false); |
| 462 timer.Start(FROM_HERE, TimeDelta::FromMilliseconds(10), | 463 timer.Start(FROM_HERE, TimeDelta::FromMilliseconds(10), |
| 463 base::Bind(&SetCallbackHappened1)); | 464 base::Bind(&SetCallbackHappened1)); |
| 464 timer.Stop(); | 465 timer.Stop(); |
| 465 timer.Start(FROM_HERE, TimeDelta::FromMilliseconds(40), | 466 timer.Start(FROM_HERE, TimeDelta::FromMilliseconds(40), |
| 466 base::Bind(&SetCallbackHappened2)); | 467 base::Bind(&SetCallbackHappened2)); |
| 467 MessageLoop::current()->Run(); | 468 base::MessageLoop::current()->Run(); |
| 468 EXPECT_FALSE(g_callback_happened1); | 469 EXPECT_FALSE(g_callback_happened1); |
| 469 EXPECT_TRUE(g_callback_happened2); | 470 EXPECT_TRUE(g_callback_happened2); |
| 470 } | 471 } |
| 471 } | 472 } |
| 472 | 473 |
| 473 TEST(TimerTest, ContinuationReset) { | 474 TEST(TimerTest, ContinuationReset) { |
| 474 { | 475 { |
| 475 ClearAllCallbackHappened(); | 476 ClearAllCallbackHappened(); |
| 476 MessageLoop loop(MessageLoop::TYPE_DEFAULT); | 477 base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT); |
| 477 base::Timer timer(false, false); | 478 base::Timer timer(false, false); |
| 478 timer.Start(FROM_HERE, TimeDelta::FromMilliseconds(10), | 479 timer.Start(FROM_HERE, TimeDelta::FromMilliseconds(10), |
| 479 base::Bind(&SetCallbackHappened1)); | 480 base::Bind(&SetCallbackHappened1)); |
| 480 timer.Reset(); | 481 timer.Reset(); |
| 481 // Since Reset happened before task ran, the user_task must not be cleared: | 482 // Since Reset happened before task ran, the user_task must not be cleared: |
| 482 ASSERT_FALSE(timer.user_task().is_null()); | 483 ASSERT_FALSE(timer.user_task().is_null()); |
| 483 MessageLoop::current()->Run(); | 484 base::MessageLoop::current()->Run(); |
| 484 EXPECT_TRUE(g_callback_happened1); | 485 EXPECT_TRUE(g_callback_happened1); |
| 485 } | 486 } |
| 486 } | 487 } |
| 487 | 488 |
| 488 } // namespace | 489 } // namespace |
| OLD | NEW |