Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(480)

Side by Side Diff: base/timer/timer_unittest.cc

Issue 2514293004: Modernize TimerTests prior to https://codereview.chromium.org/2491613004 (Closed)
Patch Set: review:danakj Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « base/timer/timer.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/timer/timer.h" 5 #include "base/timer/timer.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <memory> 9 #include <memory>
10 10
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/bind_helpers.h" 12 #include "base/bind_helpers.h"
13 #include "base/callback.h"
13 #include "base/macros.h" 14 #include "base/macros.h"
15 #include "base/memory/ptr_util.h"
14 #include "base/message_loop/message_loop.h" 16 #include "base/message_loop/message_loop.h"
15 #include "base/run_loop.h" 17 #include "base/run_loop.h"
18 #include "base/sequenced_task_runner.h"
19 #include "base/single_thread_task_runner.h"
20 #include "base/synchronization/waitable_event.h"
21 #include "base/test/sequenced_worker_pool_owner.h"
16 #include "base/test/test_mock_time_task_runner.h" 22 #include "base/test/test_mock_time_task_runner.h"
17 #include "base/test/test_simple_task_runner.h" 23 #include "base/threading/platform_thread.h"
24 #include "base/threading/sequenced_task_runner_handle.h"
25 #include "base/threading/thread.h"
18 #include "base/threading/thread_task_runner_handle.h" 26 #include "base/threading/thread_task_runner_handle.h"
19 #include "base/time/tick_clock.h" 27 #include "base/time/tick_clock.h"
28 #include "base/time/time.h"
20 #include "build/build_config.h" 29 #include "build/build_config.h"
21 #include "testing/gtest/include/gtest/gtest.h" 30 #include "testing/gtest/include/gtest/gtest.h"
22 31
23 using base::TimeDelta; 32 namespace base {
24 using base::SingleThreadTaskRunner;
25 33
26 namespace { 34 namespace {
27 35
28 // The message loops on which each timer should be tested. 36 // The message loops on which each timer should be tested.
29 const base::MessageLoop::Type testing_message_loops[] = { 37 const MessageLoop::Type testing_message_loops[] = {
30 base::MessageLoop::TYPE_DEFAULT, 38 MessageLoop::TYPE_DEFAULT, MessageLoop::TYPE_IO,
31 base::MessageLoop::TYPE_IO,
32 #if !defined(OS_IOS) // iOS does not allow direct running of the UI loop. 39 #if !defined(OS_IOS) // iOS does not allow direct running of the UI loop.
33 base::MessageLoop::TYPE_UI, 40 MessageLoop::TYPE_UI,
34 #endif 41 #endif
35 }; 42 };
36 43
37 const int kNumTestingMessageLoops = arraysize(testing_message_loops); 44 const int kNumTestingMessageLoops = arraysize(testing_message_loops);
38 45
39 class Receiver { 46 class Receiver {
40 public: 47 public:
41 Receiver() : count_(0) {} 48 Receiver() : count_(0) {}
42 void OnCalled() { count_++; } 49 void OnCalled() { count_++; }
43 bool WasCalled() { return count_ > 0; } 50 bool WasCalled() { return count_ > 0; }
44 int TimesCalled() { return count_; } 51 int TimesCalled() { return count_; }
45 52
46 private: 53 private:
47 int count_; 54 int count_;
48 }; 55 };
49 56
50 class OneShotTimerTester { 57 class OneShotTimerTester {
51 public: 58 public:
52 explicit OneShotTimerTester(bool* did_run, unsigned milliseconds = 10) 59 // |did_run|, if provided, will be signaled when Run() fires.
53 : did_run_(did_run), 60 explicit OneShotTimerTester(
54 delay_ms_(milliseconds), 61 WaitableEvent* did_run = nullptr,
55 quit_message_loop_(true) { 62 const TimeDelta& delay = TimeDelta::FromMilliseconds(10))
63 : quit_closure_(run_loop_.QuitClosure()),
64 did_run_(did_run),
65 delay_(delay) {}
66
67 virtual ~OneShotTimerTester() = default;
68
69 void SetTaskRunner(scoped_refptr<SingleThreadTaskRunner> task_runner) {
70 timer_->SetTaskRunner(std::move(task_runner));
71
72 // Run() will be invoked on |task_runner| but |run_loop_|'s QuitClosure
73 // needs to run on this thread (where the MessageLoop lives).
74 quit_closure_ =
75 Bind(IgnoreResult(&SingleThreadTaskRunner::PostTask),
76 ThreadTaskRunnerHandle::Get(), FROM_HERE, run_loop_.QuitClosure());
56 } 77 }
57 78
58 void Start() { 79 void Start() {
59 timer_.Start(FROM_HERE, TimeDelta::FromMilliseconds(delay_ms_), this, 80 started_time_ = TimeTicks::Now();
60 &OneShotTimerTester::Run); 81 timer_->Start(FROM_HERE, delay_, this, &OneShotTimerTester::Run);
61 } 82 }
62 83
63 void SetTaskRunner(scoped_refptr<SingleThreadTaskRunner> task_runner) { 84 // Blocks until Run() executes and confirms that Run() didn't fire before
64 quit_message_loop_ = false; 85 // |delay_| expired.
65 timer_.SetTaskRunner(task_runner); 86 void WaitAndConfirmTimerFiredAfterDelay() {
66 } 87 run_loop_.Run();
88
89 EXPECT_NE(TimeTicks(), started_time_);
90 EXPECT_GE(TimeTicks::Now() - started_time_, delay_);
91 }
92
93 bool IsRunning() { return timer_->IsRunning(); }
94
95 protected:
96 // Overridable method to do things on Run() before signaling events/closures
97 // managed by this helper.
98 virtual void OnRun() {}
99
100 std::unique_ptr<OneShotTimer> timer_ = MakeUnique<OneShotTimer>();
67 101
68 private: 102 private:
69 void Run() { 103 void Run() {
70 *did_run_ = true; 104 OnRun();
71 if (quit_message_loop_) { 105 if (did_run_) {
72 base::MessageLoop::current()->QuitWhenIdle(); 106 EXPECT_FALSE(did_run_->IsSignaled());
107 did_run_->Signal();
73 } 108 }
74 } 109 quit_closure_.Run();
75 110 }
76 bool* did_run_; 111
77 base::OneShotTimer timer_; 112 RunLoop run_loop_;
78 const unsigned delay_ms_; 113 Closure quit_closure_;
79 bool quit_message_loop_; 114 WaitableEvent* const did_run_;
115
116 const TimeDelta delay_;
117 TimeTicks started_time_;
118
119 DISALLOW_COPY_AND_ASSIGN(OneShotTimerTester);
80 }; 120 };
81 121
82 class OneShotSelfDeletingTimerTester { 122 class OneShotSelfDeletingTimerTester : public OneShotTimerTester {
83 public: 123 protected:
84 explicit OneShotSelfDeletingTimerTester(bool* did_run) 124 void OnRun() override { timer_.reset(); }
85 : did_run_(did_run), timer_(new base::OneShotTimer()) {}
86
87 void Start() {
88 timer_->Start(FROM_HERE, TimeDelta::FromMilliseconds(10), this,
89 &OneShotSelfDeletingTimerTester::Run);
90 }
91
92 private:
93 void Run() {
94 *did_run_ = true;
95 timer_.reset();
96 base::MessageLoop::current()->QuitWhenIdle();
97 }
98
99 bool* did_run_;
100 std::unique_ptr<base::OneShotTimer> timer_;
101 }; 125 };
102 126
127 constexpr int kNumRepeats = 10;
128
103 class RepeatingTimerTester { 129 class RepeatingTimerTester {
104 public: 130 public:
105 explicit RepeatingTimerTester(bool* did_run, const TimeDelta& delay) 131 explicit RepeatingTimerTester(WaitableEvent* did_run, const TimeDelta& delay)
106 : did_run_(did_run), counter_(10), delay_(delay) { 132 : counter_(kNumRepeats),
107 } 133 quit_closure_(run_loop_.QuitClosure()),
134 did_run_(did_run),
135 delay_(delay) {}
108 136
109 void Start() { 137 void Start() {
138 started_time_ = TimeTicks::Now();
110 timer_.Start(FROM_HERE, delay_, this, &RepeatingTimerTester::Run); 139 timer_.Start(FROM_HERE, delay_, this, &RepeatingTimerTester::Run);
111 } 140 }
112 141
142 void WaitAndConfirmTimerFiredRepeatedlyAfterDelay() {
143 run_loop_.Run();
144
145 EXPECT_NE(TimeTicks(), started_time_);
146 EXPECT_GE(TimeTicks::Now() - started_time_, kNumRepeats * delay_);
147 }
148
113 private: 149 private:
114 void Run() { 150 void Run() {
115 if (--counter_ == 0) { 151 if (--counter_ == 0) {
116 *did_run_ = true; 152 if (did_run_) {
153 EXPECT_FALSE(did_run_->IsSignaled());
154 did_run_->Signal();
155 }
117 timer_.Stop(); 156 timer_.Stop();
118 base::MessageLoop::current()->QuitWhenIdle(); 157 quit_closure_.Run();
119 } 158 }
120 } 159 }
121 160
122 bool* did_run_; 161 RepeatingTimer timer_;
123 int counter_; 162 int counter_;
124 TimeDelta delay_; 163
125 base::RepeatingTimer timer_; 164 RunLoop run_loop_;
165 Closure quit_closure_;
166 WaitableEvent* const did_run_;
167
168 const TimeDelta delay_;
169 TimeTicks started_time_;
170
171 DISALLOW_COPY_AND_ASSIGN(RepeatingTimerTester);
126 }; 172 };
127 173
128 void RunTest_OneShotTimer(base::MessageLoop::Type message_loop_type) { 174 // Basic test with same setup as RunTest_OneShotTimers_Cancel below to confirm
129 base::MessageLoop loop(message_loop_type); 175 // that |did_run_a| would be signaled in that test if it wasn't for the
130 176 // deletion.
131 bool did_run = false; 177 void RunTest_OneShotTimers(MessageLoop::Type message_loop_type) {
132 OneShotTimerTester f(&did_run); 178 MessageLoop loop(message_loop_type);
133 f.Start(); 179
134 180 WaitableEvent did_run_a(WaitableEvent::ResetPolicy::MANUAL,
135 base::RunLoop().Run(); 181 WaitableEvent::InitialState::NOT_SIGNALED);
136 182 OneShotTimerTester a(&did_run_a);
137 EXPECT_TRUE(did_run); 183 a.Start();
138 } 184
139 185 OneShotTimerTester b;
140 void RunTest_OneShotTimer_Cancel(base::MessageLoop::Type message_loop_type) { 186 b.Start();
141 base::MessageLoop loop(message_loop_type); 187
142 188 b.WaitAndConfirmTimerFiredAfterDelay();
143 bool did_run_a = false; 189
190 EXPECT_TRUE(did_run_a.IsSignaled());
191 }
192
193 void RunTest_OneShotTimers_Cancel(MessageLoop::Type message_loop_type) {
194 MessageLoop loop(message_loop_type);
195
196 WaitableEvent did_run_a(WaitableEvent::ResetPolicy::MANUAL,
197 WaitableEvent::InitialState::NOT_SIGNALED);
144 OneShotTimerTester* a = new OneShotTimerTester(&did_run_a); 198 OneShotTimerTester* a = new OneShotTimerTester(&did_run_a);
145 199
146 // This should run before the timer expires. 200 // This should run before the timer expires.
147 base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, a); 201 SequencedTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, a);
148 202
149 // Now start the timer. 203 // Now start the timer.
150 a->Start(); 204 a->Start();
151 205
152 bool did_run_b = false; 206 OneShotTimerTester b;
153 OneShotTimerTester b(&did_run_b);
154 b.Start(); 207 b.Start();
155 208
156 base::RunLoop().Run(); 209 b.WaitAndConfirmTimerFiredAfterDelay();
157 210
158 EXPECT_FALSE(did_run_a); 211 EXPECT_FALSE(did_run_a.IsSignaled());
159 EXPECT_TRUE(did_run_b); 212 }
160 } 213
161 214 void RunTest_OneShotSelfDeletingTimer(MessageLoop::Type message_loop_type) {
162 void RunTest_OneShotSelfDeletingTimer( 215 MessageLoop loop(message_loop_type);
163 base::MessageLoop::Type message_loop_type) { 216
164 base::MessageLoop loop(message_loop_type); 217 OneShotSelfDeletingTimerTester f;
165
166 bool did_run = false;
167 OneShotSelfDeletingTimerTester f(&did_run);
168 f.Start(); 218 f.Start();
169 219 f.WaitAndConfirmTimerFiredAfterDelay();
170 base::RunLoop().Run(); 220 }
171 221
172 EXPECT_TRUE(did_run); 222 void RunTest_RepeatingTimer(MessageLoop::Type message_loop_type,
173 }
174
175 void RunTest_RepeatingTimer(base::MessageLoop::Type message_loop_type,
176 const TimeDelta& delay) { 223 const TimeDelta& delay) {
177 base::MessageLoop loop(message_loop_type); 224 MessageLoop loop(message_loop_type);
178 225
179 bool did_run = false; 226 RepeatingTimerTester f(nullptr, delay);
180 RepeatingTimerTester f(&did_run, delay);
181 f.Start(); 227 f.Start();
182 228 f.WaitAndConfirmTimerFiredRepeatedlyAfterDelay();
183 base::RunLoop().Run(); 229 }
184 230
185 EXPECT_TRUE(did_run); 231 void RunTest_RepeatingTimer_Cancel(MessageLoop::Type message_loop_type,
186 }
187
188 void RunTest_RepeatingTimer_Cancel(base::MessageLoop::Type message_loop_type,
189 const TimeDelta& delay) { 232 const TimeDelta& delay) {
190 base::MessageLoop loop(message_loop_type); 233 MessageLoop loop(message_loop_type);
191 234
192 bool did_run_a = false; 235 WaitableEvent did_run_a(WaitableEvent::ResetPolicy::MANUAL,
236 WaitableEvent::InitialState::NOT_SIGNALED);
193 RepeatingTimerTester* a = new RepeatingTimerTester(&did_run_a, delay); 237 RepeatingTimerTester* a = new RepeatingTimerTester(&did_run_a, delay);
194 238
195 // This should run before the timer expires. 239 // This should run before the timer expires.
196 base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, a); 240 SequencedTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, a);
197 241
198 // Now start the timer. 242 // Now start the timer.
199 a->Start(); 243 a->Start();
200 244
201 bool did_run_b = false; 245 RepeatingTimerTester b(nullptr, delay);
202 RepeatingTimerTester b(&did_run_b, delay);
203 b.Start(); 246 b.Start();
204 247
205 base::RunLoop().Run(); 248 b.WaitAndConfirmTimerFiredRepeatedlyAfterDelay();
206 249
207 EXPECT_FALSE(did_run_a); 250 // |a| should not have fired despite |b| starting after it on the same
208 EXPECT_TRUE(did_run_b); 251 // sequence and being complete by now.
252 EXPECT_FALSE(did_run_a.IsSignaled());
209 } 253 }
210 254
211 class DelayTimerTarget { 255 class DelayTimerTarget {
212 public: 256 public:
213 bool signaled() const { return signaled_; } 257 bool signaled() const { return signaled_; }
214 258
215 void Signal() { 259 void Signal() {
216 ASSERT_FALSE(signaled_); 260 ASSERT_FALSE(signaled_);
217 signaled_ = true; 261 signaled_ = true;
218 } 262 }
219 263
220 private: 264 private:
221 bool signaled_ = false; 265 bool signaled_ = false;
222 }; 266 };
223 267
224 void RunTest_DelayTimer_NoCall(base::MessageLoop::Type message_loop_type) { 268 void RunTest_DelayTimer_NoCall(MessageLoop::Type message_loop_type) {
225 base::MessageLoop loop(message_loop_type); 269 MessageLoop loop(message_loop_type);
226 270
227 // If Delay is never called, the timer shouldn't go off. 271 // If Delay is never called, the timer shouldn't go off.
228 DelayTimerTarget target; 272 DelayTimerTarget target;
229 base::DelayTimer timer(FROM_HERE, TimeDelta::FromMilliseconds(1), &target, 273 DelayTimer timer(FROM_HERE, TimeDelta::FromMilliseconds(1), &target,
230 &DelayTimerTarget::Signal); 274 &DelayTimerTarget::Signal);
231 275
232 bool did_run = false; 276 OneShotTimerTester tester;
233 OneShotTimerTester tester(&did_run);
234 tester.Start(); 277 tester.Start();
235 base::RunLoop().Run(); 278 tester.WaitAndConfirmTimerFiredAfterDelay();
236 279
237 ASSERT_FALSE(target.signaled()); 280 ASSERT_FALSE(target.signaled());
238 } 281 }
239 282
240 void RunTest_DelayTimer_OneCall(base::MessageLoop::Type message_loop_type) { 283 void RunTest_DelayTimer_OneCall(MessageLoop::Type message_loop_type) {
241 base::MessageLoop loop(message_loop_type); 284 MessageLoop loop(message_loop_type);
242 285
243 DelayTimerTarget target; 286 DelayTimerTarget target;
244 base::DelayTimer timer(FROM_HERE, TimeDelta::FromMilliseconds(1), &target, 287 DelayTimer timer(FROM_HERE, TimeDelta::FromMilliseconds(1), &target,
245 &DelayTimerTarget::Signal); 288 &DelayTimerTarget::Signal);
246 timer.Reset(); 289 timer.Reset();
247 290
248 bool did_run = false; 291 OneShotTimerTester tester(nullptr, TimeDelta::FromMilliseconds(100));
249 OneShotTimerTester tester(&did_run, 100 /* milliseconds */);
250 tester.Start(); 292 tester.Start();
251 base::RunLoop().Run(); 293 tester.WaitAndConfirmTimerFiredAfterDelay();
252 294
253 ASSERT_TRUE(target.signaled()); 295 ASSERT_TRUE(target.signaled());
254 } 296 }
255 297
256 struct ResetHelper { 298 struct ResetHelper {
257 ResetHelper(base::DelayTimer* timer, DelayTimerTarget* target) 299 ResetHelper(DelayTimer* timer, DelayTimerTarget* target)
258 : timer_(timer), target_(target) {} 300 : timer_(timer), target_(target) {}
259 301
260 void Reset() { 302 void Reset() {
261 ASSERT_FALSE(target_->signaled()); 303 ASSERT_FALSE(target_->signaled());
262 timer_->Reset(); 304 timer_->Reset();
263 } 305 }
264 306
265 private: 307 private:
266 base::DelayTimer* const timer_; 308 DelayTimer* const timer_;
267 DelayTimerTarget* const target_; 309 DelayTimerTarget* const target_;
268 }; 310 };
269 311
270 void RunTest_DelayTimer_Reset(base::MessageLoop::Type message_loop_type) { 312 void RunTest_DelayTimer_Reset(MessageLoop::Type message_loop_type) {
271 base::MessageLoop loop(message_loop_type); 313 MessageLoop loop(message_loop_type);
272 314
273 // If Delay is never called, the timer shouldn't go off. 315 // If Delay is never called, the timer shouldn't go off.
274 DelayTimerTarget target; 316 DelayTimerTarget target;
275 base::DelayTimer timer(FROM_HERE, TimeDelta::FromMilliseconds(50), &target, 317 DelayTimer timer(FROM_HERE, TimeDelta::FromMilliseconds(50), &target,
276 &DelayTimerTarget::Signal); 318 &DelayTimerTarget::Signal);
277 timer.Reset(); 319 timer.Reset();
278 320
279 ResetHelper reset_helper(&timer, &target); 321 ResetHelper reset_helper(&timer, &target);
280 322
281 base::OneShotTimer timers[20]; 323 OneShotTimer timers[20];
282 for (size_t i = 0; i < arraysize(timers); ++i) { 324 for (size_t i = 0; i < arraysize(timers); ++i) {
283 timers[i].Start(FROM_HERE, TimeDelta::FromMilliseconds(i * 10), 325 timers[i].Start(FROM_HERE, TimeDelta::FromMilliseconds(i * 10),
284 &reset_helper, &ResetHelper::Reset); 326 &reset_helper, &ResetHelper::Reset);
285 } 327 }
286 328
287 bool did_run = false; 329 OneShotTimerTester tester(nullptr, TimeDelta::FromMilliseconds(300));
288 OneShotTimerTester tester(&did_run, 300);
289 tester.Start(); 330 tester.Start();
290 base::RunLoop().Run(); 331 tester.WaitAndConfirmTimerFiredAfterDelay();
291 332
292 ASSERT_TRUE(target.signaled()); 333 ASSERT_TRUE(target.signaled());
293 } 334 }
294 335
295 class DelayTimerFatalTarget { 336 class DelayTimerFatalTarget {
296 public: 337 public:
297 void Signal() { 338 void Signal() {
298 ASSERT_TRUE(false); 339 ASSERT_TRUE(false);
299 } 340 }
300 }; 341 };
301 342
302 343 void RunTest_DelayTimer_Deleted(MessageLoop::Type message_loop_type) {
303 void RunTest_DelayTimer_Deleted(base::MessageLoop::Type message_loop_type) { 344 MessageLoop loop(message_loop_type);
304 base::MessageLoop loop(message_loop_type);
305 345
306 DelayTimerFatalTarget target; 346 DelayTimerFatalTarget target;
307 347
308 { 348 {
309 base::DelayTimer timer(FROM_HERE, TimeDelta::FromMilliseconds(50), &target, 349 DelayTimer timer(FROM_HERE, TimeDelta::FromMilliseconds(50), &target,
310 &DelayTimerFatalTarget::Signal); 350 &DelayTimerFatalTarget::Signal);
311 timer.Reset(); 351 timer.Reset();
312 } 352 }
313 353
314 // When the timer is deleted, the DelayTimerFatalTarget should never be 354 // When the timer is deleted, the DelayTimerFatalTarget should never be
315 // called. 355 // called.
316 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(100)); 356 PlatformThread::Sleep(TimeDelta::FromMilliseconds(100));
317 } 357 }
318 358
319 } // namespace 359 } // namespace
320 360
321 //----------------------------------------------------------------------------- 361 //-----------------------------------------------------------------------------
322 // Each test is run against each type of MessageLoop. That way we are sure 362 // Each test is run against each type of MessageLoop. That way we are sure
323 // that timers work properly in all configurations. 363 // that timers work properly in all configurations.
324 364
325 TEST(TimerTest, OneShotTimer) { 365 TEST(TimerTest, OneShotTimers) {
326 for (int i = 0; i < kNumTestingMessageLoops; i++) { 366 for (int i = 0; i < kNumTestingMessageLoops; i++) {
327 RunTest_OneShotTimer(testing_message_loops[i]); 367 RunTest_OneShotTimers(testing_message_loops[i]);
328 } 368 }
329 } 369 }
330 370
331 TEST(TimerTest, OneShotTimer_Cancel) { 371 TEST(TimerTest, OneShotTimers_Cancel) {
332 for (int i = 0; i < kNumTestingMessageLoops; i++) { 372 for (int i = 0; i < kNumTestingMessageLoops; i++) {
333 RunTest_OneShotTimer_Cancel(testing_message_loops[i]); 373 RunTest_OneShotTimers_Cancel(testing_message_loops[i]);
334 } 374 }
335 } 375 }
336 376
337 // If underline timer does not handle properly, we will crash or fail 377 // If underline timer does not handle properly, we will crash or fail
338 // in full page heap environment. 378 // in full page heap environment.
339 TEST(TimerTest, OneShotSelfDeletingTimer) { 379 TEST(TimerTest, OneShotSelfDeletingTimer) {
340 for (int i = 0; i < kNumTestingMessageLoops; i++) { 380 for (int i = 0; i < kNumTestingMessageLoops; i++) {
341 RunTest_OneShotSelfDeletingTimer(testing_message_loops[i]); 381 RunTest_OneShotSelfDeletingTimer(testing_message_loops[i]);
342 } 382 }
343 } 383 }
344 384
345 TEST(TimerTest, OneShotTimer_CustomTaskRunner) { 385 TEST(TimerTest, OneShotTimer_CustomTaskRunner) {
346 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 386 // A MessageLoop is required for the timer events on the other thread to
347 new base::TestSimpleTaskRunner(); 387 // communicate back to the Timer under test.
388 MessageLoop loop;
348 389
349 bool did_run = false; 390 Thread other_thread("OneShotTimer_CustomTaskRunner");
391 other_thread.Start();
392
393 WaitableEvent did_run(WaitableEvent::ResetPolicy::MANUAL,
394 WaitableEvent::InitialState::NOT_SIGNALED);
350 OneShotTimerTester f(&did_run); 395 OneShotTimerTester f(&did_run);
351 f.SetTaskRunner(task_runner); 396 f.SetTaskRunner(other_thread.task_runner());
352 f.Start(); 397 f.Start();
398 EXPECT_TRUE(f.IsRunning());
353 399
354 EXPECT_FALSE(did_run); 400 f.WaitAndConfirmTimerFiredAfterDelay();
355 task_runner->RunUntilIdle(); 401 EXPECT_TRUE(did_run.IsSignaled());
356 EXPECT_TRUE(did_run); 402
403 // |f| should already have communicated back to this |loop| before invoking
404 // Run() and as such this thread should already be aware that |f| is no longer
405 // running.
406 EXPECT_TRUE(loop.IsIdleForTesting());
407 EXPECT_FALSE(f.IsRunning());
357 } 408 }
358 409
359 TEST(TimerTest, OneShotTimerWithTickClock) { 410 TEST(TimerTest, OneShotTimerWithTickClock) {
360 scoped_refptr<base::TestMockTimeTaskRunner> task_runner( 411 scoped_refptr<TestMockTimeTaskRunner> task_runner(
361 new base::TestMockTimeTaskRunner(base::Time::Now(), 412 new TestMockTimeTaskRunner(Time::Now(), TimeTicks::Now()));
362 base::TimeTicks::Now())); 413 std::unique_ptr<TickClock> tick_clock(task_runner->GetMockTickClock());
363 std::unique_ptr<base::TickClock> tick_clock(task_runner->GetMockTickClock()); 414 MessageLoop message_loop;
364 base::MessageLoop message_loop;
365 message_loop.SetTaskRunner(task_runner); 415 message_loop.SetTaskRunner(task_runner);
366 Receiver receiver; 416 Receiver receiver;
367 base::OneShotTimer timer(tick_clock.get()); 417 OneShotTimer timer(tick_clock.get());
368 timer.Start(FROM_HERE, base::TimeDelta::FromSeconds(1), 418 timer.Start(FROM_HERE, TimeDelta::FromSeconds(1),
369 base::Bind(&Receiver::OnCalled, base::Unretained(&receiver))); 419 Bind(&Receiver::OnCalled, Unretained(&receiver)));
370 task_runner->FastForwardBy(base::TimeDelta::FromSeconds(1)); 420 task_runner->FastForwardBy(TimeDelta::FromSeconds(1));
371 EXPECT_TRUE(receiver.WasCalled()); 421 EXPECT_TRUE(receiver.WasCalled());
372 } 422 }
373 423
374 TEST(TimerTest, RepeatingTimer) { 424 TEST(TimerTest, RepeatingTimer) {
375 for (int i = 0; i < kNumTestingMessageLoops; i++) { 425 for (int i = 0; i < kNumTestingMessageLoops; i++) {
376 RunTest_RepeatingTimer(testing_message_loops[i], 426 RunTest_RepeatingTimer(testing_message_loops[i],
377 TimeDelta::FromMilliseconds(10)); 427 TimeDelta::FromMilliseconds(10));
378 } 428 }
379 } 429 }
380 430
(...skipping 12 matching lines...) Expand all
393 } 443 }
394 444
395 TEST(TimerTest, RepeatingTimerZeroDelay_Cancel) { 445 TEST(TimerTest, RepeatingTimerZeroDelay_Cancel) {
396 for (int i = 0; i < kNumTestingMessageLoops; i++) { 446 for (int i = 0; i < kNumTestingMessageLoops; i++) {
397 RunTest_RepeatingTimer_Cancel(testing_message_loops[i], 447 RunTest_RepeatingTimer_Cancel(testing_message_loops[i],
398 TimeDelta::FromMilliseconds(0)); 448 TimeDelta::FromMilliseconds(0));
399 } 449 }
400 } 450 }
401 451
402 TEST(TimerTest, RepeatingTimerWithTickClock) { 452 TEST(TimerTest, RepeatingTimerWithTickClock) {
403 scoped_refptr<base::TestMockTimeTaskRunner> task_runner( 453 scoped_refptr<TestMockTimeTaskRunner> task_runner(
404 new base::TestMockTimeTaskRunner(base::Time::Now(), 454 new TestMockTimeTaskRunner(Time::Now(), TimeTicks::Now()));
405 base::TimeTicks::Now())); 455 std::unique_ptr<TickClock> tick_clock(task_runner->GetMockTickClock());
406 std::unique_ptr<base::TickClock> tick_clock(task_runner->GetMockTickClock()); 456 MessageLoop message_loop;
407 base::MessageLoop message_loop;
408 message_loop.SetTaskRunner(task_runner); 457 message_loop.SetTaskRunner(task_runner);
409 Receiver receiver; 458 Receiver receiver;
410 const int expected_times_called = 10; 459 const int expected_times_called = 10;
411 base::RepeatingTimer timer(tick_clock.get()); 460 RepeatingTimer timer(tick_clock.get());
412 timer.Start(FROM_HERE, base::TimeDelta::FromSeconds(1), 461 timer.Start(FROM_HERE, TimeDelta::FromSeconds(1),
413 base::Bind(&Receiver::OnCalled, base::Unretained(&receiver))); 462 Bind(&Receiver::OnCalled, Unretained(&receiver)));
414 task_runner->FastForwardBy( 463 task_runner->FastForwardBy(TimeDelta::FromSeconds(expected_times_called));
415 base::TimeDelta::FromSeconds(expected_times_called));
416 timer.Stop(); 464 timer.Stop();
417 EXPECT_EQ(expected_times_called, receiver.TimesCalled()); 465 EXPECT_EQ(expected_times_called, receiver.TimesCalled());
418 } 466 }
419 467
420 TEST(TimerTest, DelayTimer_NoCall) { 468 TEST(TimerTest, DelayTimer_NoCall) {
421 for (int i = 0; i < kNumTestingMessageLoops; i++) { 469 for (int i = 0; i < kNumTestingMessageLoops; i++) {
422 RunTest_DelayTimer_NoCall(testing_message_loops[i]); 470 RunTest_DelayTimer_NoCall(testing_message_loops[i]);
423 } 471 }
424 } 472 }
425 473
(...skipping 10 matching lines...) Expand all
436 } 484 }
437 } 485 }
438 486
439 TEST(TimerTest, DelayTimer_Deleted) { 487 TEST(TimerTest, DelayTimer_Deleted) {
440 for (int i = 0; i < kNumTestingMessageLoops; i++) { 488 for (int i = 0; i < kNumTestingMessageLoops; i++) {
441 RunTest_DelayTimer_Deleted(testing_message_loops[i]); 489 RunTest_DelayTimer_Deleted(testing_message_loops[i]);
442 } 490 }
443 } 491 }
444 492
445 TEST(TimerTest, DelayTimerWithTickClock) { 493 TEST(TimerTest, DelayTimerWithTickClock) {
446 scoped_refptr<base::TestMockTimeTaskRunner> task_runner( 494 scoped_refptr<TestMockTimeTaskRunner> task_runner(
447 new base::TestMockTimeTaskRunner(base::Time::Now(), 495 new TestMockTimeTaskRunner(Time::Now(), TimeTicks::Now()));
448 base::TimeTicks::Now())); 496 std::unique_ptr<TickClock> tick_clock(task_runner->GetMockTickClock());
449 std::unique_ptr<base::TickClock> tick_clock(task_runner->GetMockTickClock()); 497 MessageLoop message_loop;
450 base::MessageLoop message_loop;
451 message_loop.SetTaskRunner(task_runner); 498 message_loop.SetTaskRunner(task_runner);
452 Receiver receiver; 499 Receiver receiver;
453 base::DelayTimer timer(FROM_HERE, base::TimeDelta::FromSeconds(1), &receiver, 500 DelayTimer timer(FROM_HERE, TimeDelta::FromSeconds(1), &receiver,
454 &Receiver::OnCalled, tick_clock.get()); 501 &Receiver::OnCalled, tick_clock.get());
455 task_runner->FastForwardBy(base::TimeDelta::FromMilliseconds(999)); 502 task_runner->FastForwardBy(TimeDelta::FromMilliseconds(999));
456 EXPECT_FALSE(receiver.WasCalled()); 503 EXPECT_FALSE(receiver.WasCalled());
457 timer.Reset(); 504 timer.Reset();
458 task_runner->FastForwardBy(base::TimeDelta::FromMilliseconds(999)); 505 task_runner->FastForwardBy(TimeDelta::FromMilliseconds(999));
459 EXPECT_FALSE(receiver.WasCalled()); 506 EXPECT_FALSE(receiver.WasCalled());
460 timer.Reset(); 507 timer.Reset();
461 task_runner->FastForwardBy(base::TimeDelta::FromSeconds(1)); 508 task_runner->FastForwardBy(TimeDelta::FromSeconds(1));
462 EXPECT_TRUE(receiver.WasCalled()); 509 EXPECT_TRUE(receiver.WasCalled());
463 } 510 }
464 511
465 TEST(TimerTest, MessageLoopShutdown) { 512 TEST(TimerTest, MessageLoopShutdown) {
466 // This test is designed to verify that shutdown of the 513 // This test is designed to verify that shutdown of the
467 // message loop does not cause crashes if there were pending 514 // message loop does not cause crashes if there were pending
468 // timers not yet fired. It may only trigger exceptions 515 // timers not yet fired. It may only trigger exceptions
469 // if debug heap checking is enabled. 516 // if debug heap checking is enabled.
470 bool did_run = false; 517 WaitableEvent did_run(WaitableEvent::ResetPolicy::MANUAL,
518 WaitableEvent::InitialState::NOT_SIGNALED);
471 { 519 {
472 OneShotTimerTester a(&did_run); 520 OneShotTimerTester a(&did_run);
473 OneShotTimerTester b(&did_run); 521 OneShotTimerTester b(&did_run);
474 OneShotTimerTester c(&did_run); 522 OneShotTimerTester c(&did_run);
475 OneShotTimerTester d(&did_run); 523 OneShotTimerTester d(&did_run);
476 { 524 {
477 base::MessageLoop loop; 525 MessageLoop loop;
478 a.Start(); 526 a.Start();
479 b.Start(); 527 b.Start();
480 } // MessageLoop destructs by falling out of scope. 528 } // MessageLoop destructs by falling out of scope.
481 } // OneShotTimers destruct. SHOULD NOT CRASH, of course. 529 } // OneShotTimers destruct. SHOULD NOT CRASH, of course.
482 530
483 EXPECT_FALSE(did_run); 531 EXPECT_FALSE(did_run.IsSignaled());
484 } 532 }
485 533
486 void TimerTestCallback() { 534 void TimerTestCallback() {
487 } 535 }
488 536
489 TEST(TimerTest, NonRepeatIsRunning) { 537 TEST(TimerTest, NonRepeatIsRunning) {
490 { 538 {
491 base::MessageLoop loop; 539 MessageLoop loop;
492 base::Timer timer(false, false); 540 Timer timer(false, false);
493 EXPECT_FALSE(timer.IsRunning()); 541 EXPECT_FALSE(timer.IsRunning());
494 timer.Start(FROM_HERE, TimeDelta::FromDays(1), 542 timer.Start(FROM_HERE, TimeDelta::FromDays(1), Bind(&TimerTestCallback));
495 base::Bind(&TimerTestCallback));
496 EXPECT_TRUE(timer.IsRunning()); 543 EXPECT_TRUE(timer.IsRunning());
497 timer.Stop(); 544 timer.Stop();
498 EXPECT_FALSE(timer.IsRunning()); 545 EXPECT_FALSE(timer.IsRunning());
499 EXPECT_TRUE(timer.user_task().is_null()); 546 EXPECT_TRUE(timer.user_task().is_null());
500 } 547 }
501 548
502 { 549 {
503 base::Timer timer(true, false); 550 Timer timer(true, false);
504 base::MessageLoop loop; 551 MessageLoop loop;
505 EXPECT_FALSE(timer.IsRunning()); 552 EXPECT_FALSE(timer.IsRunning());
506 timer.Start(FROM_HERE, TimeDelta::FromDays(1), 553 timer.Start(FROM_HERE, TimeDelta::FromDays(1), Bind(&TimerTestCallback));
507 base::Bind(&TimerTestCallback));
508 EXPECT_TRUE(timer.IsRunning()); 554 EXPECT_TRUE(timer.IsRunning());
509 timer.Stop(); 555 timer.Stop();
510 EXPECT_FALSE(timer.IsRunning()); 556 EXPECT_FALSE(timer.IsRunning());
511 ASSERT_FALSE(timer.user_task().is_null()); 557 ASSERT_FALSE(timer.user_task().is_null());
512 timer.Reset(); 558 timer.Reset();
513 EXPECT_TRUE(timer.IsRunning()); 559 EXPECT_TRUE(timer.IsRunning());
514 } 560 }
515 } 561 }
516 562
517 TEST(TimerTest, NonRepeatMessageLoopDeath) { 563 TEST(TimerTest, NonRepeatMessageLoopDeath) {
518 base::Timer timer(false, false); 564 Timer timer(false, false);
519 { 565 {
520 base::MessageLoop loop; 566 MessageLoop loop;
521 EXPECT_FALSE(timer.IsRunning()); 567 EXPECT_FALSE(timer.IsRunning());
522 timer.Start(FROM_HERE, TimeDelta::FromDays(1), 568 timer.Start(FROM_HERE, TimeDelta::FromDays(1), Bind(&TimerTestCallback));
523 base::Bind(&TimerTestCallback));
524 EXPECT_TRUE(timer.IsRunning()); 569 EXPECT_TRUE(timer.IsRunning());
525 } 570 }
526 EXPECT_FALSE(timer.IsRunning()); 571 EXPECT_FALSE(timer.IsRunning());
527 EXPECT_TRUE(timer.user_task().is_null()); 572 EXPECT_TRUE(timer.user_task().is_null());
528 } 573 }
529 574
530 TEST(TimerTest, RetainRepeatIsRunning) { 575 TEST(TimerTest, RetainRepeatIsRunning) {
531 base::MessageLoop loop; 576 MessageLoop loop;
532 base::Timer timer(FROM_HERE, TimeDelta::FromDays(1), 577 Timer timer(FROM_HERE, TimeDelta::FromDays(1), Bind(&TimerTestCallback),
533 base::Bind(&TimerTestCallback), true); 578 true);
534 EXPECT_FALSE(timer.IsRunning()); 579 EXPECT_FALSE(timer.IsRunning());
535 timer.Reset(); 580 timer.Reset();
536 EXPECT_TRUE(timer.IsRunning()); 581 EXPECT_TRUE(timer.IsRunning());
537 timer.Stop(); 582 timer.Stop();
538 EXPECT_FALSE(timer.IsRunning()); 583 EXPECT_FALSE(timer.IsRunning());
539 timer.Reset(); 584 timer.Reset();
540 EXPECT_TRUE(timer.IsRunning()); 585 EXPECT_TRUE(timer.IsRunning());
541 } 586 }
542 587
543 TEST(TimerTest, RetainNonRepeatIsRunning) { 588 TEST(TimerTest, RetainNonRepeatIsRunning) {
544 base::MessageLoop loop; 589 MessageLoop loop;
545 base::Timer timer(FROM_HERE, TimeDelta::FromDays(1), 590 Timer timer(FROM_HERE, TimeDelta::FromDays(1), Bind(&TimerTestCallback),
546 base::Bind(&TimerTestCallback), false); 591 false);
547 EXPECT_FALSE(timer.IsRunning()); 592 EXPECT_FALSE(timer.IsRunning());
548 timer.Reset(); 593 timer.Reset();
549 EXPECT_TRUE(timer.IsRunning()); 594 EXPECT_TRUE(timer.IsRunning());
550 timer.Stop(); 595 timer.Stop();
551 EXPECT_FALSE(timer.IsRunning()); 596 EXPECT_FALSE(timer.IsRunning());
552 timer.Reset(); 597 timer.Reset();
553 EXPECT_TRUE(timer.IsRunning()); 598 EXPECT_TRUE(timer.IsRunning());
554 } 599 }
555 600
556 namespace { 601 namespace {
557 602
558 bool g_callback_happened1 = false; 603 bool g_callback_happened1 = false;
559 bool g_callback_happened2 = false; 604 bool g_callback_happened2 = false;
560 605
561 void ClearAllCallbackHappened() { 606 void ClearAllCallbackHappened() {
562 g_callback_happened1 = false; 607 g_callback_happened1 = false;
563 g_callback_happened2 = false; 608 g_callback_happened2 = false;
564 } 609 }
565 610
566 void SetCallbackHappened1() { 611 void SetCallbackHappened1() {
567 g_callback_happened1 = true; 612 g_callback_happened1 = true;
568 base::MessageLoop::current()->QuitWhenIdle(); 613 MessageLoop::current()->QuitWhenIdle();
569 } 614 }
570 615
571 void SetCallbackHappened2() { 616 void SetCallbackHappened2() {
572 g_callback_happened2 = true; 617 g_callback_happened2 = true;
573 base::MessageLoop::current()->QuitWhenIdle(); 618 MessageLoop::current()->QuitWhenIdle();
574 } 619 }
575 620
621 } // namespace
622
576 TEST(TimerTest, ContinuationStopStart) { 623 TEST(TimerTest, ContinuationStopStart) {
577 { 624 {
578 ClearAllCallbackHappened(); 625 ClearAllCallbackHappened();
579 base::MessageLoop loop; 626 MessageLoop loop;
580 base::Timer timer(false, false); 627 Timer timer(false, false);
581 timer.Start(FROM_HERE, TimeDelta::FromMilliseconds(10), 628 timer.Start(FROM_HERE, TimeDelta::FromMilliseconds(10),
582 base::Bind(&SetCallbackHappened1)); 629 Bind(&SetCallbackHappened1));
583 timer.Stop(); 630 timer.Stop();
584 timer.Start(FROM_HERE, TimeDelta::FromMilliseconds(40), 631 timer.Start(FROM_HERE, TimeDelta::FromMilliseconds(40),
585 base::Bind(&SetCallbackHappened2)); 632 Bind(&SetCallbackHappened2));
586 base::RunLoop().Run(); 633 RunLoop().Run();
587 EXPECT_FALSE(g_callback_happened1); 634 EXPECT_FALSE(g_callback_happened1);
588 EXPECT_TRUE(g_callback_happened2); 635 EXPECT_TRUE(g_callback_happened2);
589 } 636 }
590 } 637 }
591 638
592 TEST(TimerTest, ContinuationReset) { 639 TEST(TimerTest, ContinuationReset) {
593 { 640 {
594 ClearAllCallbackHappened(); 641 ClearAllCallbackHappened();
595 base::MessageLoop loop; 642 MessageLoop loop;
596 base::Timer timer(false, false); 643 Timer timer(false, false);
597 timer.Start(FROM_HERE, TimeDelta::FromMilliseconds(10), 644 timer.Start(FROM_HERE, TimeDelta::FromMilliseconds(10),
598 base::Bind(&SetCallbackHappened1)); 645 Bind(&SetCallbackHappened1));
599 timer.Reset(); 646 timer.Reset();
600 // Since Reset happened before task ran, the user_task must not be cleared: 647 // Since Reset happened before task ran, the user_task must not be cleared:
601 ASSERT_FALSE(timer.user_task().is_null()); 648 ASSERT_FALSE(timer.user_task().is_null());
602 base::RunLoop().Run(); 649 RunLoop().Run();
603 EXPECT_TRUE(g_callback_happened1); 650 EXPECT_TRUE(g_callback_happened1);
604 } 651 }
605 } 652 }
606 653
607 } // namespace 654 } // namespace base
OLDNEW
« no previous file with comments | « base/timer/timer.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698