1 // Copyright 2014 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/timer/mock_timer.h" 6 7 #include "base/test/test_simple_task_runner.h" 8 9 namespace base { 10 11 namespace { 12 FlushPendingTasks(TestSimpleTaskRunner * task_runner)13void FlushPendingTasks(TestSimpleTaskRunner* task_runner) { 14 // Do not use TestSimpleTaskRunner::RunPendingTasks() here. As RunPendingTasks 15 // overrides SingleThreadTaskRunner::CurrentDefaultHandle when it runs tasks, 16 // tasks posted by timer tasks to STTR::CDH go to |test_task_runner_|, though 17 // they should be posted to the original task runner. Do not use 18 // TestSimpleTaskRunner::RunPendingTasks(), as its overridden 19 // SingleThreadTaskRunner::CurrentDefaultHandle causes unexpected side 20 // effects. 21 for (TestPendingTask& task : task_runner->TakePendingTasks()) 22 std::move(task.task).Run(); 23 } 24 25 } // namespace 26 MockOneShotTimer()27MockOneShotTimer::MockOneShotTimer() 28 : OneShotTimer(&clock_), 29 test_task_runner_(MakeRefCounted<TestSimpleTaskRunner>()) { 30 OneShotTimer::SetTaskRunner(test_task_runner_); 31 } 32 33 MockOneShotTimer::~MockOneShotTimer() = default; 34 SetTaskRunner(scoped_refptr<SequencedTaskRunner> task_runner)35void MockOneShotTimer::SetTaskRunner( 36 scoped_refptr<SequencedTaskRunner> task_runner) { 37 NOTREACHED() << "MockOneShotTimer doesn't support SetTaskRunner()."; 38 } 39 Fire()40void MockOneShotTimer::Fire() { 41 DCHECK(IsRunning()); 42 clock_.Advance(std::max(TimeDelta(), desired_run_time() - clock_.NowTicks())); 43 FlushPendingTasks(test_task_runner_.get()); 44 } 45 FireNow()46void MockOneShotTimer::FireNow() { 47 DCHECK(IsRunning()); 48 FlushPendingTasks(test_task_runner_.get()); 49 } 50 MockRepeatingTimer()51MockRepeatingTimer::MockRepeatingTimer() 52 : RepeatingTimer(&clock_), 53 test_task_runner_(MakeRefCounted<TestSimpleTaskRunner>()) { 54 RepeatingTimer::SetTaskRunner(test_task_runner_); 55 } 56 57 MockRepeatingTimer::~MockRepeatingTimer() = default; 58 SetTaskRunner(scoped_refptr<SequencedTaskRunner> task_runner)59void MockRepeatingTimer::SetTaskRunner( 60 scoped_refptr<SequencedTaskRunner> task_runner) { 61 NOTREACHED() << "MockRepeatingTimer doesn't support SetTaskRunner()."; 62 } 63 Fire()64void MockRepeatingTimer::Fire() { 65 DCHECK(IsRunning()); 66 clock_.Advance(std::max(TimeDelta(), desired_run_time() - clock_.NowTicks())); 67 FlushPendingTasks(test_task_runner_.get()); 68 } 69 MockRetainingOneShotTimer()70MockRetainingOneShotTimer::MockRetainingOneShotTimer() 71 : RetainingOneShotTimer(&clock_), 72 test_task_runner_(MakeRefCounted<TestSimpleTaskRunner>()) { 73 RetainingOneShotTimer::SetTaskRunner(test_task_runner_); 74 } 75 76 MockRetainingOneShotTimer::~MockRetainingOneShotTimer() = default; 77 SetTaskRunner(scoped_refptr<SequencedTaskRunner> task_runner)78void MockRetainingOneShotTimer::SetTaskRunner( 79 scoped_refptr<SequencedTaskRunner> task_runner) { 80 NOTREACHED() << "MockRetainingOneShotTimer doesn't support SetTaskRunner()."; 81 } 82 Fire()83void MockRetainingOneShotTimer::Fire() { 84 DCHECK(IsRunning()); 85 clock_.Advance(std::max(TimeDelta(), desired_run_time() - clock_.NowTicks())); 86 FlushPendingTasks(test_task_runner_.get()); 87 } 88 89 } // namespace base 90