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

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

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