xref: /aosp_15_r20/external/cronet/base/timer/mock_timer.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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)13 void 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()27 MockOneShotTimer::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)35 void MockOneShotTimer::SetTaskRunner(
36     scoped_refptr<SequencedTaskRunner> task_runner) {
37   NOTREACHED() << "MockOneShotTimer doesn't support SetTaskRunner().";
38 }
39 
Fire()40 void 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()46 void MockOneShotTimer::FireNow() {
47   DCHECK(IsRunning());
48   FlushPendingTasks(test_task_runner_.get());
49 }
50 
MockRepeatingTimer()51 MockRepeatingTimer::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)59 void MockRepeatingTimer::SetTaskRunner(
60     scoped_refptr<SequencedTaskRunner> task_runner) {
61   NOTREACHED() << "MockRepeatingTimer doesn't support SetTaskRunner().";
62 }
63 
Fire()64 void 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()70 MockRetainingOneShotTimer::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)78 void MockRetainingOneShotTimer::SetTaskRunner(
79     scoped_refptr<SequencedTaskRunner> task_runner) {
80   NOTREACHED() << "MockRetainingOneShotTimer doesn't support SetTaskRunner().";
81 }
82 
Fire()83 void 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