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 |