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 |