xref: /aosp_15_r20/external/cronet/base/timer/timer_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "base/timer/timer.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
8*6777b538SAndroid Build Coastguard Worker 
9*6777b538SAndroid Build Coastguard Worker #include <memory>
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker #include "base/functional/bind.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback_helpers.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/memory/ref_counted.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/run_loop.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/task/sequenced_task_runner.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/test/bind.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/test/mock_callback.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/test/task_environment.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/test/test_simple_task_runner.h"
21*6777b538SAndroid Build Coastguard Worker #include "base/time/tick_clock.h"
22*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
23*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
24*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
25*6777b538SAndroid Build Coastguard Worker 
26*6777b538SAndroid Build Coastguard Worker namespace base {
27*6777b538SAndroid Build Coastguard Worker 
28*6777b538SAndroid Build Coastguard Worker namespace {
29*6777b538SAndroid Build Coastguard Worker 
30*6777b538SAndroid Build Coastguard Worker constexpr TimeDelta kTestDelay = Seconds(10);
31*6777b538SAndroid Build Coastguard Worker constexpr TimeDelta kLongTestDelay = Minutes(10);
32*6777b538SAndroid Build Coastguard Worker 
33*6777b538SAndroid Build Coastguard Worker // The main thread types on which each timer should be tested.
34*6777b538SAndroid Build Coastguard Worker const test::TaskEnvironment::MainThreadType testing_main_threads[] = {
35*6777b538SAndroid Build Coastguard Worker     test::TaskEnvironment::MainThreadType::DEFAULT,
36*6777b538SAndroid Build Coastguard Worker     test::TaskEnvironment::MainThreadType::IO,
37*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_IOS)  // iOS does not allow direct running of the UI loop.
38*6777b538SAndroid Build Coastguard Worker     test::TaskEnvironment::MainThreadType::UI,
39*6777b538SAndroid Build Coastguard Worker #endif
40*6777b538SAndroid Build Coastguard Worker };
41*6777b538SAndroid Build Coastguard Worker 
42*6777b538SAndroid Build Coastguard Worker class Receiver {
43*6777b538SAndroid Build Coastguard Worker  public:
Receiver()44*6777b538SAndroid Build Coastguard Worker   Receiver() : count_(0) {}
OnCalled()45*6777b538SAndroid Build Coastguard Worker   void OnCalled() { count_++; }
WasCalled()46*6777b538SAndroid Build Coastguard Worker   bool WasCalled() { return count_ > 0; }
TimesCalled()47*6777b538SAndroid Build Coastguard Worker   int TimesCalled() { return count_; }
48*6777b538SAndroid Build Coastguard Worker 
49*6777b538SAndroid Build Coastguard Worker  private:
50*6777b538SAndroid Build Coastguard Worker   int count_;
51*6777b538SAndroid Build Coastguard Worker };
52*6777b538SAndroid Build Coastguard Worker 
53*6777b538SAndroid Build Coastguard Worker // Basic test with same setup as RunTest_OneShotTimers_Cancel below to confirm
54*6777b538SAndroid Build Coastguard Worker // that |timer| would be fired in that test if it wasn't for the deletion.
RunTest_OneShotTimers(test::TaskEnvironment::MainThreadType main_thread_type)55*6777b538SAndroid Build Coastguard Worker void RunTest_OneShotTimers(
56*6777b538SAndroid Build Coastguard Worker     test::TaskEnvironment::MainThreadType main_thread_type) {
57*6777b538SAndroid Build Coastguard Worker   test::TaskEnvironment task_environment(
58*6777b538SAndroid Build Coastguard Worker       test::TaskEnvironment::TimeSource::MOCK_TIME, main_thread_type);
59*6777b538SAndroid Build Coastguard Worker 
60*6777b538SAndroid Build Coastguard Worker   Receiver receiver;
61*6777b538SAndroid Build Coastguard Worker   OneShotTimer timer;
62*6777b538SAndroid Build Coastguard Worker   timer.Start(FROM_HERE, kTestDelay,
63*6777b538SAndroid Build Coastguard Worker               BindOnce(&Receiver::OnCalled, Unretained(&receiver)));
64*6777b538SAndroid Build Coastguard Worker 
65*6777b538SAndroid Build Coastguard Worker   task_environment.FastForwardBy(kTestDelay);
66*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(receiver.WasCalled());
67*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(timer.IsRunning());
68*6777b538SAndroid Build Coastguard Worker }
69*6777b538SAndroid Build Coastguard Worker 
RunTest_OneShotTimers_Cancel(test::TaskEnvironment::MainThreadType main_thread_type)70*6777b538SAndroid Build Coastguard Worker void RunTest_OneShotTimers_Cancel(
71*6777b538SAndroid Build Coastguard Worker     test::TaskEnvironment::MainThreadType main_thread_type) {
72*6777b538SAndroid Build Coastguard Worker   test::TaskEnvironment task_environment(
73*6777b538SAndroid Build Coastguard Worker       test::TaskEnvironment::TimeSource::MOCK_TIME, main_thread_type);
74*6777b538SAndroid Build Coastguard Worker 
75*6777b538SAndroid Build Coastguard Worker   Receiver receiver;
76*6777b538SAndroid Build Coastguard Worker   auto timer = std::make_unique<OneShotTimer>();
77*6777b538SAndroid Build Coastguard Worker   auto* timer_ptr = timer.get();
78*6777b538SAndroid Build Coastguard Worker 
79*6777b538SAndroid Build Coastguard Worker   // This should run before the timer expires.
80*6777b538SAndroid Build Coastguard Worker   SequencedTaskRunner::GetCurrentDefault()->DeleteSoon(FROM_HERE,
81*6777b538SAndroid Build Coastguard Worker                                                        std::move(timer));
82*6777b538SAndroid Build Coastguard Worker 
83*6777b538SAndroid Build Coastguard Worker   timer_ptr->Start(FROM_HERE, kTestDelay,
84*6777b538SAndroid Build Coastguard Worker                    BindOnce(&Receiver::OnCalled, Unretained(&receiver)));
85*6777b538SAndroid Build Coastguard Worker 
86*6777b538SAndroid Build Coastguard Worker   task_environment.FastForwardBy(kTestDelay);
87*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(receiver.WasCalled());
88*6777b538SAndroid Build Coastguard Worker }
89*6777b538SAndroid Build Coastguard Worker 
RunTest_OneShotSelfDeletingTimer(test::TaskEnvironment::MainThreadType main_thread_type)90*6777b538SAndroid Build Coastguard Worker void RunTest_OneShotSelfDeletingTimer(
91*6777b538SAndroid Build Coastguard Worker     test::TaskEnvironment::MainThreadType main_thread_type) {
92*6777b538SAndroid Build Coastguard Worker   test::TaskEnvironment task_environment(
93*6777b538SAndroid Build Coastguard Worker       test::TaskEnvironment::TimeSource::MOCK_TIME, main_thread_type);
94*6777b538SAndroid Build Coastguard Worker 
95*6777b538SAndroid Build Coastguard Worker   Receiver receiver;
96*6777b538SAndroid Build Coastguard Worker   auto timer = std::make_unique<OneShotTimer>();
97*6777b538SAndroid Build Coastguard Worker   auto* timer_ptr = timer.get();
98*6777b538SAndroid Build Coastguard Worker 
99*6777b538SAndroid Build Coastguard Worker   timer_ptr->Start(
100*6777b538SAndroid Build Coastguard Worker       FROM_HERE, kTestDelay,
101*6777b538SAndroid Build Coastguard Worker       BindLambdaForTesting([&receiver, timer = std::move(timer)]() mutable {
102*6777b538SAndroid Build Coastguard Worker         receiver.OnCalled();
103*6777b538SAndroid Build Coastguard Worker         EXPECT_FALSE(timer->IsRunning());
104*6777b538SAndroid Build Coastguard Worker         timer.reset();
105*6777b538SAndroid Build Coastguard Worker       }));
106*6777b538SAndroid Build Coastguard Worker 
107*6777b538SAndroid Build Coastguard Worker   task_environment.FastForwardBy(kTestDelay);
108*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(receiver.WasCalled());
109*6777b538SAndroid Build Coastguard Worker }
110*6777b538SAndroid Build Coastguard Worker 
RunTest_RepeatingTimer(test::TaskEnvironment::MainThreadType main_thread_type,const TimeDelta & delay)111*6777b538SAndroid Build Coastguard Worker void RunTest_RepeatingTimer(
112*6777b538SAndroid Build Coastguard Worker     test::TaskEnvironment::MainThreadType main_thread_type,
113*6777b538SAndroid Build Coastguard Worker     const TimeDelta& delay) {
114*6777b538SAndroid Build Coastguard Worker   test::TaskEnvironment task_environment(
115*6777b538SAndroid Build Coastguard Worker       test::TaskEnvironment::TimeSource::MOCK_TIME, main_thread_type);
116*6777b538SAndroid Build Coastguard Worker 
117*6777b538SAndroid Build Coastguard Worker   Receiver receiver;
118*6777b538SAndroid Build Coastguard Worker   RepeatingTimer timer;
119*6777b538SAndroid Build Coastguard Worker   timer.Start(FROM_HERE, kTestDelay,
120*6777b538SAndroid Build Coastguard Worker               BindRepeating(&Receiver::OnCalled, Unretained(&receiver)));
121*6777b538SAndroid Build Coastguard Worker 
122*6777b538SAndroid Build Coastguard Worker   task_environment.FastForwardBy(20 * kTestDelay);
123*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(receiver.TimesCalled(), 20);
124*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(timer.IsRunning());
125*6777b538SAndroid Build Coastguard Worker }
126*6777b538SAndroid Build Coastguard Worker 
RunTest_RepeatingTimer_Cancel(test::TaskEnvironment::MainThreadType main_thread_type,const TimeDelta & delay)127*6777b538SAndroid Build Coastguard Worker void RunTest_RepeatingTimer_Cancel(
128*6777b538SAndroid Build Coastguard Worker     test::TaskEnvironment::MainThreadType main_thread_type,
129*6777b538SAndroid Build Coastguard Worker     const TimeDelta& delay) {
130*6777b538SAndroid Build Coastguard Worker   test::TaskEnvironment task_environment(
131*6777b538SAndroid Build Coastguard Worker       test::TaskEnvironment::TimeSource::MOCK_TIME, main_thread_type);
132*6777b538SAndroid Build Coastguard Worker 
133*6777b538SAndroid Build Coastguard Worker   Receiver receiver;
134*6777b538SAndroid Build Coastguard Worker   auto timer = std::make_unique<RepeatingTimer>();
135*6777b538SAndroid Build Coastguard Worker   auto* timer_ptr = timer.get();
136*6777b538SAndroid Build Coastguard Worker 
137*6777b538SAndroid Build Coastguard Worker   // This should run before the timer expires.
138*6777b538SAndroid Build Coastguard Worker   SequencedTaskRunner::GetCurrentDefault()->DeleteSoon(FROM_HERE,
139*6777b538SAndroid Build Coastguard Worker                                                        std::move(timer));
140*6777b538SAndroid Build Coastguard Worker 
141*6777b538SAndroid Build Coastguard Worker   timer_ptr->Start(FROM_HERE, delay,
142*6777b538SAndroid Build Coastguard Worker                    BindRepeating(&Receiver::OnCalled, Unretained(&receiver)));
143*6777b538SAndroid Build Coastguard Worker 
144*6777b538SAndroid Build Coastguard Worker   task_environment.FastForwardBy(delay);
145*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(receiver.WasCalled());
146*6777b538SAndroid Build Coastguard Worker }
147*6777b538SAndroid Build Coastguard Worker 
RunTest_DelayTimer_NoCall(test::TaskEnvironment::MainThreadType main_thread_type)148*6777b538SAndroid Build Coastguard Worker void RunTest_DelayTimer_NoCall(
149*6777b538SAndroid Build Coastguard Worker     test::TaskEnvironment::MainThreadType main_thread_type) {
150*6777b538SAndroid Build Coastguard Worker   test::TaskEnvironment task_environment(
151*6777b538SAndroid Build Coastguard Worker       test::TaskEnvironment::TimeSource::MOCK_TIME, main_thread_type);
152*6777b538SAndroid Build Coastguard Worker 
153*6777b538SAndroid Build Coastguard Worker   Receiver receiver;
154*6777b538SAndroid Build Coastguard Worker   DelayTimer timer(FROM_HERE, kTestDelay, &receiver, &Receiver::OnCalled);
155*6777b538SAndroid Build Coastguard Worker 
156*6777b538SAndroid Build Coastguard Worker   task_environment.FastForwardBy(kTestDelay);
157*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(receiver.WasCalled());
158*6777b538SAndroid Build Coastguard Worker }
159*6777b538SAndroid Build Coastguard Worker 
RunTest_DelayTimer_OneCall(test::TaskEnvironment::MainThreadType main_thread_type)160*6777b538SAndroid Build Coastguard Worker void RunTest_DelayTimer_OneCall(
161*6777b538SAndroid Build Coastguard Worker     test::TaskEnvironment::MainThreadType main_thread_type) {
162*6777b538SAndroid Build Coastguard Worker   test::TaskEnvironment task_environment(
163*6777b538SAndroid Build Coastguard Worker       test::TaskEnvironment::TimeSource::MOCK_TIME, main_thread_type);
164*6777b538SAndroid Build Coastguard Worker 
165*6777b538SAndroid Build Coastguard Worker   Receiver receiver;
166*6777b538SAndroid Build Coastguard Worker   DelayTimer timer(FROM_HERE, kTestDelay, &receiver, &Receiver::OnCalled);
167*6777b538SAndroid Build Coastguard Worker   timer.Reset();
168*6777b538SAndroid Build Coastguard Worker 
169*6777b538SAndroid Build Coastguard Worker   task_environment.FastForwardBy(kTestDelay);
170*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(receiver.WasCalled());
171*6777b538SAndroid Build Coastguard Worker }
172*6777b538SAndroid Build Coastguard Worker 
RunTest_DelayTimer_Reset(test::TaskEnvironment::MainThreadType main_thread_type)173*6777b538SAndroid Build Coastguard Worker void RunTest_DelayTimer_Reset(
174*6777b538SAndroid Build Coastguard Worker     test::TaskEnvironment::MainThreadType main_thread_type) {
175*6777b538SAndroid Build Coastguard Worker   test::TaskEnvironment task_environment(
176*6777b538SAndroid Build Coastguard Worker       test::TaskEnvironment::TimeSource::MOCK_TIME, main_thread_type);
177*6777b538SAndroid Build Coastguard Worker 
178*6777b538SAndroid Build Coastguard Worker   Receiver receiver;
179*6777b538SAndroid Build Coastguard Worker   DelayTimer timer(FROM_HERE, kTestDelay, &receiver, &Receiver::OnCalled);
180*6777b538SAndroid Build Coastguard Worker   timer.Reset();
181*6777b538SAndroid Build Coastguard Worker 
182*6777b538SAndroid Build Coastguard Worker   // Fast-forward by a delay smaller than the timer delay. The timer will not
183*6777b538SAndroid Build Coastguard Worker   // fire.
184*6777b538SAndroid Build Coastguard Worker   task_environment.FastForwardBy(kTestDelay / 2);
185*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(receiver.WasCalled());
186*6777b538SAndroid Build Coastguard Worker 
187*6777b538SAndroid Build Coastguard Worker   // Postpone the fire time.
188*6777b538SAndroid Build Coastguard Worker   timer.Reset();
189*6777b538SAndroid Build Coastguard Worker 
190*6777b538SAndroid Build Coastguard Worker   // Verify that the timer does not fire at its original fire time.
191*6777b538SAndroid Build Coastguard Worker   task_environment.FastForwardBy(kTestDelay / 2);
192*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(receiver.WasCalled());
193*6777b538SAndroid Build Coastguard Worker 
194*6777b538SAndroid Build Coastguard Worker   // Fast-forward by the timer delay. The timer will fire.
195*6777b538SAndroid Build Coastguard Worker   task_environment.FastForwardBy(kTestDelay / 2);
196*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(receiver.WasCalled());
197*6777b538SAndroid Build Coastguard Worker }
198*6777b538SAndroid Build Coastguard Worker 
RunTest_DelayTimer_Deleted(test::TaskEnvironment::MainThreadType main_thread_type)199*6777b538SAndroid Build Coastguard Worker void RunTest_DelayTimer_Deleted(
200*6777b538SAndroid Build Coastguard Worker     test::TaskEnvironment::MainThreadType main_thread_type) {
201*6777b538SAndroid Build Coastguard Worker   test::TaskEnvironment task_environment(
202*6777b538SAndroid Build Coastguard Worker       test::TaskEnvironment::TimeSource::MOCK_TIME, main_thread_type);
203*6777b538SAndroid Build Coastguard Worker 
204*6777b538SAndroid Build Coastguard Worker   Receiver receiver;
205*6777b538SAndroid Build Coastguard Worker 
206*6777b538SAndroid Build Coastguard Worker   {
207*6777b538SAndroid Build Coastguard Worker     DelayTimer timer(FROM_HERE, kTestDelay, &receiver, &Receiver::OnCalled);
208*6777b538SAndroid Build Coastguard Worker     timer.Reset();
209*6777b538SAndroid Build Coastguard Worker   }
210*6777b538SAndroid Build Coastguard Worker 
211*6777b538SAndroid Build Coastguard Worker   // Because the timer was deleted, it will never fire.
212*6777b538SAndroid Build Coastguard Worker   task_environment.FastForwardBy(kTestDelay);
213*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(receiver.WasCalled());
214*6777b538SAndroid Build Coastguard Worker }
215*6777b538SAndroid Build Coastguard Worker 
216*6777b538SAndroid Build Coastguard Worker }  // namespace
217*6777b538SAndroid Build Coastguard Worker 
218*6777b538SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
219*6777b538SAndroid Build Coastguard Worker // Each test is run against each type of main thread.  That way we are sure
220*6777b538SAndroid Build Coastguard Worker // that timers work properly in all configurations.
221*6777b538SAndroid Build Coastguard Worker 
222*6777b538SAndroid Build Coastguard Worker class TimerTestWithThreadType
223*6777b538SAndroid Build Coastguard Worker     : public testing::TestWithParam<test::TaskEnvironment::MainThreadType> {};
224*6777b538SAndroid Build Coastguard Worker 
TEST_P(TimerTestWithThreadType,OneShotTimers)225*6777b538SAndroid Build Coastguard Worker TEST_P(TimerTestWithThreadType, OneShotTimers) {
226*6777b538SAndroid Build Coastguard Worker   RunTest_OneShotTimers(GetParam());
227*6777b538SAndroid Build Coastguard Worker }
228*6777b538SAndroid Build Coastguard Worker 
TEST_P(TimerTestWithThreadType,OneShotTimers_Cancel)229*6777b538SAndroid Build Coastguard Worker TEST_P(TimerTestWithThreadType, OneShotTimers_Cancel) {
230*6777b538SAndroid Build Coastguard Worker   RunTest_OneShotTimers_Cancel(GetParam());
231*6777b538SAndroid Build Coastguard Worker }
232*6777b538SAndroid Build Coastguard Worker 
233*6777b538SAndroid Build Coastguard Worker // If underline timer does not handle properly, we will crash or fail
234*6777b538SAndroid Build Coastguard Worker // in full page heap environment.
TEST_P(TimerTestWithThreadType,OneShotSelfDeletingTimer)235*6777b538SAndroid Build Coastguard Worker TEST_P(TimerTestWithThreadType, OneShotSelfDeletingTimer) {
236*6777b538SAndroid Build Coastguard Worker   RunTest_OneShotSelfDeletingTimer(GetParam());
237*6777b538SAndroid Build Coastguard Worker }
238*6777b538SAndroid Build Coastguard Worker 
TEST(TimerTest,OneShotTimer_CustomTaskRunner)239*6777b538SAndroid Build Coastguard Worker TEST(TimerTest, OneShotTimer_CustomTaskRunner) {
240*6777b538SAndroid Build Coastguard Worker   auto task_runner = base::MakeRefCounted<TestSimpleTaskRunner>();
241*6777b538SAndroid Build Coastguard Worker 
242*6777b538SAndroid Build Coastguard Worker   OneShotTimer timer;
243*6777b538SAndroid Build Coastguard Worker 
244*6777b538SAndroid Build Coastguard Worker   bool task_ran = false;
245*6777b538SAndroid Build Coastguard Worker 
246*6777b538SAndroid Build Coastguard Worker   // The timer will use the TestSimpleTaskRunner to schedule its delays.
247*6777b538SAndroid Build Coastguard Worker   timer.SetTaskRunner(task_runner);
248*6777b538SAndroid Build Coastguard Worker   timer.Start(FROM_HERE, Days(1),
249*6777b538SAndroid Build Coastguard Worker               BindLambdaForTesting([&]() { task_ran = true; }));
250*6777b538SAndroid Build Coastguard Worker 
251*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(task_ran);
252*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(task_runner->HasPendingTask());
253*6777b538SAndroid Build Coastguard Worker 
254*6777b538SAndroid Build Coastguard Worker   task_runner->RunPendingTasks();
255*6777b538SAndroid Build Coastguard Worker 
256*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(task_ran);
257*6777b538SAndroid Build Coastguard Worker }
258*6777b538SAndroid Build Coastguard Worker 
TEST(TimerTest,OneShotTimerWithTickClock)259*6777b538SAndroid Build Coastguard Worker TEST(TimerTest, OneShotTimerWithTickClock) {
260*6777b538SAndroid Build Coastguard Worker   test::TaskEnvironment task_environment(
261*6777b538SAndroid Build Coastguard Worker       test::TaskEnvironment::TimeSource::MOCK_TIME);
262*6777b538SAndroid Build Coastguard Worker   Receiver receiver;
263*6777b538SAndroid Build Coastguard Worker   OneShotTimer timer(task_environment.GetMockTickClock());
264*6777b538SAndroid Build Coastguard Worker   timer.Start(FROM_HERE, kTestDelay,
265*6777b538SAndroid Build Coastguard Worker               BindOnce(&Receiver::OnCalled, Unretained(&receiver)));
266*6777b538SAndroid Build Coastguard Worker   task_environment.FastForwardBy(kTestDelay);
267*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(receiver.WasCalled());
268*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(timer.IsRunning());
269*6777b538SAndroid Build Coastguard Worker }
270*6777b538SAndroid Build Coastguard Worker 
TEST_P(TimerTestWithThreadType,RepeatingTimer)271*6777b538SAndroid Build Coastguard Worker TEST_P(TimerTestWithThreadType, RepeatingTimer) {
272*6777b538SAndroid Build Coastguard Worker   RunTest_RepeatingTimer(GetParam(), kTestDelay);
273*6777b538SAndroid Build Coastguard Worker }
274*6777b538SAndroid Build Coastguard Worker 
TEST_P(TimerTestWithThreadType,RepeatingTimer_Cancel)275*6777b538SAndroid Build Coastguard Worker TEST_P(TimerTestWithThreadType, RepeatingTimer_Cancel) {
276*6777b538SAndroid Build Coastguard Worker   RunTest_RepeatingTimer_Cancel(GetParam(), kTestDelay);
277*6777b538SAndroid Build Coastguard Worker }
278*6777b538SAndroid Build Coastguard Worker 
TEST_P(TimerTestWithThreadType,RepeatingTimerZeroDelay)279*6777b538SAndroid Build Coastguard Worker TEST_P(TimerTestWithThreadType, RepeatingTimerZeroDelay) {
280*6777b538SAndroid Build Coastguard Worker   RunTest_RepeatingTimer(GetParam(), Seconds(0));
281*6777b538SAndroid Build Coastguard Worker }
282*6777b538SAndroid Build Coastguard Worker 
TEST_P(TimerTestWithThreadType,RepeatingTimerZeroDelay_Cancel)283*6777b538SAndroid Build Coastguard Worker TEST_P(TimerTestWithThreadType, RepeatingTimerZeroDelay_Cancel) {
284*6777b538SAndroid Build Coastguard Worker   RunTest_RepeatingTimer_Cancel(GetParam(), Seconds(0));
285*6777b538SAndroid Build Coastguard Worker }
286*6777b538SAndroid Build Coastguard Worker 
TEST(TimerTest,RepeatingTimerWithTickClock)287*6777b538SAndroid Build Coastguard Worker TEST(TimerTest, RepeatingTimerWithTickClock) {
288*6777b538SAndroid Build Coastguard Worker   test::TaskEnvironment task_environment(
289*6777b538SAndroid Build Coastguard Worker       test::TaskEnvironment::TimeSource::MOCK_TIME);
290*6777b538SAndroid Build Coastguard Worker   Receiver receiver;
291*6777b538SAndroid Build Coastguard Worker   const int expected_times_called = 10;
292*6777b538SAndroid Build Coastguard Worker   RepeatingTimer timer(task_environment.GetMockTickClock());
293*6777b538SAndroid Build Coastguard Worker   timer.Start(FROM_HERE, kTestDelay,
294*6777b538SAndroid Build Coastguard Worker               BindRepeating(&Receiver::OnCalled, Unretained(&receiver)));
295*6777b538SAndroid Build Coastguard Worker   task_environment.FastForwardBy(expected_times_called * kTestDelay);
296*6777b538SAndroid Build Coastguard Worker   timer.Stop();
297*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(expected_times_called, receiver.TimesCalled());
298*6777b538SAndroid Build Coastguard Worker }
299*6777b538SAndroid Build Coastguard Worker 
TEST_P(TimerTestWithThreadType,DelayTimer_NoCall)300*6777b538SAndroid Build Coastguard Worker TEST_P(TimerTestWithThreadType, DelayTimer_NoCall) {
301*6777b538SAndroid Build Coastguard Worker   RunTest_DelayTimer_NoCall(GetParam());
302*6777b538SAndroid Build Coastguard Worker }
303*6777b538SAndroid Build Coastguard Worker 
TEST_P(TimerTestWithThreadType,DelayTimer_OneCall)304*6777b538SAndroid Build Coastguard Worker TEST_P(TimerTestWithThreadType, DelayTimer_OneCall) {
305*6777b538SAndroid Build Coastguard Worker   RunTest_DelayTimer_OneCall(GetParam());
306*6777b538SAndroid Build Coastguard Worker }
307*6777b538SAndroid Build Coastguard Worker 
TEST_P(TimerTestWithThreadType,DelayTimer_Reset)308*6777b538SAndroid Build Coastguard Worker TEST_P(TimerTestWithThreadType, DelayTimer_Reset) {
309*6777b538SAndroid Build Coastguard Worker   RunTest_DelayTimer_Reset(GetParam());
310*6777b538SAndroid Build Coastguard Worker }
311*6777b538SAndroid Build Coastguard Worker 
TEST_P(TimerTestWithThreadType,DelayTimer_Deleted)312*6777b538SAndroid Build Coastguard Worker TEST_P(TimerTestWithThreadType, DelayTimer_Deleted) {
313*6777b538SAndroid Build Coastguard Worker   RunTest_DelayTimer_Deleted(GetParam());
314*6777b538SAndroid Build Coastguard Worker }
315*6777b538SAndroid Build Coastguard Worker 
TEST(TimerTest,DelayTimerWithTickClock)316*6777b538SAndroid Build Coastguard Worker TEST(TimerTest, DelayTimerWithTickClock) {
317*6777b538SAndroid Build Coastguard Worker   test::TaskEnvironment task_environment(
318*6777b538SAndroid Build Coastguard Worker       test::TaskEnvironment::TimeSource::MOCK_TIME);
319*6777b538SAndroid Build Coastguard Worker   Receiver receiver;
320*6777b538SAndroid Build Coastguard Worker   DelayTimer timer(FROM_HERE, kTestDelay, &receiver, &Receiver::OnCalled,
321*6777b538SAndroid Build Coastguard Worker                    task_environment.GetMockTickClock());
322*6777b538SAndroid Build Coastguard Worker   task_environment.FastForwardBy(kTestDelay - Microseconds(1));
323*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(receiver.WasCalled());
324*6777b538SAndroid Build Coastguard Worker   timer.Reset();
325*6777b538SAndroid Build Coastguard Worker   task_environment.FastForwardBy(kTestDelay - Microseconds(1));
326*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(receiver.WasCalled());
327*6777b538SAndroid Build Coastguard Worker   timer.Reset();
328*6777b538SAndroid Build Coastguard Worker   task_environment.FastForwardBy(kTestDelay);
329*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(receiver.WasCalled());
330*6777b538SAndroid Build Coastguard Worker }
331*6777b538SAndroid Build Coastguard Worker 
TEST(TimerTest,TaskEnvironmentShutdown)332*6777b538SAndroid Build Coastguard Worker TEST(TimerTest, TaskEnvironmentShutdown) {
333*6777b538SAndroid Build Coastguard Worker   // This test is designed to verify that shutdown of the
334*6777b538SAndroid Build Coastguard Worker   // message loop does not cause crashes if there were pending
335*6777b538SAndroid Build Coastguard Worker   // timers not yet fired.  It may only trigger exceptions
336*6777b538SAndroid Build Coastguard Worker   // if debug heap checking is enabled.
337*6777b538SAndroid Build Coastguard Worker   Receiver receiver;
338*6777b538SAndroid Build Coastguard Worker   OneShotTimer timer;
339*6777b538SAndroid Build Coastguard Worker 
340*6777b538SAndroid Build Coastguard Worker   {
341*6777b538SAndroid Build Coastguard Worker     test::TaskEnvironment task_environment;
342*6777b538SAndroid Build Coastguard Worker     timer.Start(FROM_HERE, kTestDelay,
343*6777b538SAndroid Build Coastguard Worker                 BindOnce(&Receiver::OnCalled, Unretained(&receiver)));
344*6777b538SAndroid Build Coastguard Worker   }  // Task environment destructs by falling out of scope.
345*6777b538SAndroid Build Coastguard Worker 
346*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(receiver.WasCalled());
347*6777b538SAndroid Build Coastguard Worker   // Timer destruct. SHOULD NOT CRASH, of course.
348*6777b538SAndroid Build Coastguard Worker }
349*6777b538SAndroid Build Coastguard Worker 
TEST(TimerTest,TaskEnvironmentSelfOwningTimer)350*6777b538SAndroid Build Coastguard Worker TEST(TimerTest, TaskEnvironmentSelfOwningTimer) {
351*6777b538SAndroid Build Coastguard Worker   // This test verifies that a timer does not cause crashes if
352*6777b538SAndroid Build Coastguard Worker   // |Timer::user_task_| owns the timer. The test may only trigger exceptions if
353*6777b538SAndroid Build Coastguard Worker   // debug heap checking is enabled.
354*6777b538SAndroid Build Coastguard Worker 
355*6777b538SAndroid Build Coastguard Worker   auto timer = std::make_unique<OneShotTimer>();
356*6777b538SAndroid Build Coastguard Worker   auto* timer_ptr = timer.get();
357*6777b538SAndroid Build Coastguard Worker 
358*6777b538SAndroid Build Coastguard Worker   test::TaskEnvironment task_environment(
359*6777b538SAndroid Build Coastguard Worker       test::TaskEnvironment::TimeSource::MOCK_TIME);
360*6777b538SAndroid Build Coastguard Worker 
361*6777b538SAndroid Build Coastguard Worker   timer_ptr->Start(FROM_HERE, kTestDelay,
362*6777b538SAndroid Build Coastguard Worker                    BindLambdaForTesting([timer = std::move(timer)]() {}));
363*6777b538SAndroid Build Coastguard Worker   // |Timer::user_task_| owns sole reference to |timer|. Both will be destroyed
364*6777b538SAndroid Build Coastguard Worker   // once the task ran. SHOULD NOT CRASH.
365*6777b538SAndroid Build Coastguard Worker   task_environment.FastForwardUntilNoTasksRemain();
366*6777b538SAndroid Build Coastguard Worker }
367*6777b538SAndroid Build Coastguard Worker 
TEST(TimerTest,TaskEnvironmentSelfOwningTimerStopped)368*6777b538SAndroid Build Coastguard Worker TEST(TimerTest, TaskEnvironmentSelfOwningTimerStopped) {
369*6777b538SAndroid Build Coastguard Worker   // This test verifies that a timer does not cause crashes when stopped if
370*6777b538SAndroid Build Coastguard Worker   // |Timer::user_task_| owns the timer. The test may only trigger exceptions if
371*6777b538SAndroid Build Coastguard Worker   // debug heap checking is enabled.
372*6777b538SAndroid Build Coastguard Worker 
373*6777b538SAndroid Build Coastguard Worker   auto timer = std::make_unique<OneShotTimer>();
374*6777b538SAndroid Build Coastguard Worker   auto* timer_ptr = timer.get();
375*6777b538SAndroid Build Coastguard Worker 
376*6777b538SAndroid Build Coastguard Worker   test::TaskEnvironment task_environment(
377*6777b538SAndroid Build Coastguard Worker       test::TaskEnvironment::TimeSource::MOCK_TIME);
378*6777b538SAndroid Build Coastguard Worker 
379*6777b538SAndroid Build Coastguard Worker   timer_ptr->Start(FROM_HERE, kTestDelay,
380*6777b538SAndroid Build Coastguard Worker                    BindLambdaForTesting([timer = std::move(timer)]() {
381*6777b538SAndroid Build Coastguard Worker                      // Stop destroys |Timer::user_task_| which owns sole
382*6777b538SAndroid Build Coastguard Worker                      // reference to |timer|. SHOULD NOT CRASH.
383*6777b538SAndroid Build Coastguard Worker                      timer->Stop();
384*6777b538SAndroid Build Coastguard Worker                    }));
385*6777b538SAndroid Build Coastguard Worker   task_environment.FastForwardUntilNoTasksRemain();
386*6777b538SAndroid Build Coastguard Worker }
387*6777b538SAndroid Build Coastguard Worker 
TEST(TimerTest,NonRepeatIsRunning)388*6777b538SAndroid Build Coastguard Worker TEST(TimerTest, NonRepeatIsRunning) {
389*6777b538SAndroid Build Coastguard Worker   {
390*6777b538SAndroid Build Coastguard Worker     test::TaskEnvironment task_environment;
391*6777b538SAndroid Build Coastguard Worker     OneShotTimer timer;
392*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(timer.IsRunning());
393*6777b538SAndroid Build Coastguard Worker     timer.Start(FROM_HERE, kTestDelay, DoNothing());
394*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(timer.IsRunning());
395*6777b538SAndroid Build Coastguard Worker     timer.Stop();
396*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(timer.IsRunning());
397*6777b538SAndroid Build Coastguard Worker   }
398*6777b538SAndroid Build Coastguard Worker 
399*6777b538SAndroid Build Coastguard Worker   {
400*6777b538SAndroid Build Coastguard Worker     RetainingOneShotTimer timer;
401*6777b538SAndroid Build Coastguard Worker     test::TaskEnvironment task_environment;
402*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(timer.IsRunning());
403*6777b538SAndroid Build Coastguard Worker     timer.Start(FROM_HERE, kTestDelay, DoNothing());
404*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(timer.IsRunning());
405*6777b538SAndroid Build Coastguard Worker     timer.Stop();
406*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(timer.IsRunning());
407*6777b538SAndroid Build Coastguard Worker     ASSERT_FALSE(timer.user_task().is_null());
408*6777b538SAndroid Build Coastguard Worker     timer.Reset();
409*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(timer.IsRunning());
410*6777b538SAndroid Build Coastguard Worker   }
411*6777b538SAndroid Build Coastguard Worker }
412*6777b538SAndroid Build Coastguard Worker 
TEST(TimerTest,NonRepeatTaskEnvironmentDeath)413*6777b538SAndroid Build Coastguard Worker TEST(TimerTest, NonRepeatTaskEnvironmentDeath) {
414*6777b538SAndroid Build Coastguard Worker   OneShotTimer timer;
415*6777b538SAndroid Build Coastguard Worker   {
416*6777b538SAndroid Build Coastguard Worker     test::TaskEnvironment task_environment;
417*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(timer.IsRunning());
418*6777b538SAndroid Build Coastguard Worker     timer.Start(FROM_HERE, kTestDelay, DoNothing());
419*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(timer.IsRunning());
420*6777b538SAndroid Build Coastguard Worker   }
421*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(timer.IsRunning());
422*6777b538SAndroid Build Coastguard Worker }
423*6777b538SAndroid Build Coastguard Worker 
TEST(TimerTest,RetainRepeatIsRunning)424*6777b538SAndroid Build Coastguard Worker TEST(TimerTest, RetainRepeatIsRunning) {
425*6777b538SAndroid Build Coastguard Worker   test::TaskEnvironment task_environment;
426*6777b538SAndroid Build Coastguard Worker   RepeatingTimer timer(FROM_HERE, kTestDelay, DoNothing());
427*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(timer.IsRunning());
428*6777b538SAndroid Build Coastguard Worker   timer.Reset();
429*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(timer.IsRunning());
430*6777b538SAndroid Build Coastguard Worker   timer.Stop();
431*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(timer.IsRunning());
432*6777b538SAndroid Build Coastguard Worker   timer.Reset();
433*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(timer.IsRunning());
434*6777b538SAndroid Build Coastguard Worker }
435*6777b538SAndroid Build Coastguard Worker 
TEST(TimerTest,RetainNonRepeatIsRunning)436*6777b538SAndroid Build Coastguard Worker TEST(TimerTest, RetainNonRepeatIsRunning) {
437*6777b538SAndroid Build Coastguard Worker   test::TaskEnvironment task_environment;
438*6777b538SAndroid Build Coastguard Worker   RetainingOneShotTimer timer(FROM_HERE, kTestDelay, DoNothing());
439*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(timer.IsRunning());
440*6777b538SAndroid Build Coastguard Worker   timer.Reset();
441*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(timer.IsRunning());
442*6777b538SAndroid Build Coastguard Worker   timer.Stop();
443*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(timer.IsRunning());
444*6777b538SAndroid Build Coastguard Worker   timer.Reset();
445*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(timer.IsRunning());
446*6777b538SAndroid Build Coastguard Worker }
447*6777b538SAndroid Build Coastguard Worker 
448*6777b538SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
449*6777b538SAndroid Build Coastguard Worker 
TEST(TimerTest,ContinuationStopStart)450*6777b538SAndroid Build Coastguard Worker TEST(TimerTest, ContinuationStopStart) {
451*6777b538SAndroid Build Coastguard Worker   test::TaskEnvironment task_environment(
452*6777b538SAndroid Build Coastguard Worker       test::TaskEnvironment::TimeSource::MOCK_TIME);
453*6777b538SAndroid Build Coastguard Worker 
454*6777b538SAndroid Build Coastguard Worker   Receiver receiver1;
455*6777b538SAndroid Build Coastguard Worker   Receiver receiver2;
456*6777b538SAndroid Build Coastguard Worker   OneShotTimer timer;
457*6777b538SAndroid Build Coastguard Worker   timer.Start(FROM_HERE, kTestDelay,
458*6777b538SAndroid Build Coastguard Worker               BindOnce(&Receiver::OnCalled, Unretained(&receiver1)));
459*6777b538SAndroid Build Coastguard Worker   timer.Stop();
460*6777b538SAndroid Build Coastguard Worker   timer.Start(FROM_HERE, kLongTestDelay,
461*6777b538SAndroid Build Coastguard Worker               BindOnce(&Receiver::OnCalled, Unretained(&receiver2)));
462*6777b538SAndroid Build Coastguard Worker   task_environment.FastForwardBy(kLongTestDelay);
463*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(receiver1.WasCalled());
464*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(receiver2.WasCalled());
465*6777b538SAndroid Build Coastguard Worker }
466*6777b538SAndroid Build Coastguard Worker 
TEST(TimerTest,ContinuationReset)467*6777b538SAndroid Build Coastguard Worker TEST(TimerTest, ContinuationReset) {
468*6777b538SAndroid Build Coastguard Worker   test::TaskEnvironment task_environment(
469*6777b538SAndroid Build Coastguard Worker       test::TaskEnvironment::TimeSource::MOCK_TIME);
470*6777b538SAndroid Build Coastguard Worker 
471*6777b538SAndroid Build Coastguard Worker   Receiver receiver;
472*6777b538SAndroid Build Coastguard Worker   OneShotTimer timer;
473*6777b538SAndroid Build Coastguard Worker   timer.Start(FROM_HERE, kTestDelay,
474*6777b538SAndroid Build Coastguard Worker               BindOnce(&Receiver::OnCalled, Unretained(&receiver)));
475*6777b538SAndroid Build Coastguard Worker   timer.Reset();
476*6777b538SAndroid Build Coastguard Worker   // // Since Reset happened before task ran, the user_task must not be
477*6777b538SAndroid Build Coastguard Worker   // cleared: ASSERT_FALSE(timer.user_task().is_null());
478*6777b538SAndroid Build Coastguard Worker   task_environment.FastForwardBy(kTestDelay);
479*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(receiver.WasCalled());
480*6777b538SAndroid Build Coastguard Worker }
481*6777b538SAndroid Build Coastguard Worker 
TEST(TimerTest,AbandonedTaskIsCancelled)482*6777b538SAndroid Build Coastguard Worker TEST(TimerTest, AbandonedTaskIsCancelled) {
483*6777b538SAndroid Build Coastguard Worker   test::TaskEnvironment task_environment(
484*6777b538SAndroid Build Coastguard Worker       test::TaskEnvironment::TimeSource::MOCK_TIME);
485*6777b538SAndroid Build Coastguard Worker   OneShotTimer timer;
486*6777b538SAndroid Build Coastguard Worker 
487*6777b538SAndroid Build Coastguard Worker   // Start a timer. There will be a pending task on the current sequence.
488*6777b538SAndroid Build Coastguard Worker   timer.Start(FROM_HERE, kTestDelay, base::DoNothing());
489*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1u, task_environment.GetPendingMainThreadTaskCount());
490*6777b538SAndroid Build Coastguard Worker 
491*6777b538SAndroid Build Coastguard Worker   // After AbandonAndStop(), the task is correctly treated as cancelled.
492*6777b538SAndroid Build Coastguard Worker   timer.AbandonAndStop();
493*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0u, task_environment.GetPendingMainThreadTaskCount());
494*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(timer.IsRunning());
495*6777b538SAndroid Build Coastguard Worker }
496*6777b538SAndroid Build Coastguard Worker 
TEST(TimerTest,DeadlineTimer)497*6777b538SAndroid Build Coastguard Worker TEST(TimerTest, DeadlineTimer) {
498*6777b538SAndroid Build Coastguard Worker   test::TaskEnvironment task_environment(
499*6777b538SAndroid Build Coastguard Worker       test::TaskEnvironment::TimeSource::MOCK_TIME);
500*6777b538SAndroid Build Coastguard Worker   RunLoop run_loop;
501*6777b538SAndroid Build Coastguard Worker   DeadlineTimer timer;
502*6777b538SAndroid Build Coastguard Worker   TimeTicks start = TimeTicks::Now();
503*6777b538SAndroid Build Coastguard Worker 
504*6777b538SAndroid Build Coastguard Worker   timer.Start(FROM_HERE, start + Seconds(5), run_loop.QuitClosure());
505*6777b538SAndroid Build Coastguard Worker   run_loop.Run();
506*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(start + Seconds(5), TimeTicks::Now());
507*6777b538SAndroid Build Coastguard Worker }
508*6777b538SAndroid Build Coastguard Worker 
TEST(TimerTest,DeadlineTimerCancel)509*6777b538SAndroid Build Coastguard Worker TEST(TimerTest, DeadlineTimerCancel) {
510*6777b538SAndroid Build Coastguard Worker   test::TaskEnvironment task_environment(
511*6777b538SAndroid Build Coastguard Worker       test::TaskEnvironment::TimeSource::MOCK_TIME);
512*6777b538SAndroid Build Coastguard Worker   RunLoop run_loop;
513*6777b538SAndroid Build Coastguard Worker   DeadlineTimer timer;
514*6777b538SAndroid Build Coastguard Worker   TimeTicks start = TimeTicks::Now();
515*6777b538SAndroid Build Coastguard Worker 
516*6777b538SAndroid Build Coastguard Worker   MockRepeatingCallback<void()> callback;
517*6777b538SAndroid Build Coastguard Worker   timer.Start(FROM_HERE, start + Seconds(5), callback.Get());
518*6777b538SAndroid Build Coastguard Worker 
519*6777b538SAndroid Build Coastguard Worker   EXPECT_CALL(callback, Run()).Times(0);
520*6777b538SAndroid Build Coastguard Worker   timer.Stop();
521*6777b538SAndroid Build Coastguard Worker   task_environment.FastForwardBy(Seconds(5));
522*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(start + Seconds(5), TimeTicks::Now());
523*6777b538SAndroid Build Coastguard Worker }
524*6777b538SAndroid Build Coastguard Worker 
TEST(TimerTest,DeadlineTimerTaskDestructed)525*6777b538SAndroid Build Coastguard Worker TEST(TimerTest, DeadlineTimerTaskDestructed) {
526*6777b538SAndroid Build Coastguard Worker   test::TaskEnvironment task_environment(
527*6777b538SAndroid Build Coastguard Worker       test::TaskEnvironment::TimeSource::MOCK_TIME);
528*6777b538SAndroid Build Coastguard Worker   RunLoop run_loop;
529*6777b538SAndroid Build Coastguard Worker   DeadlineTimer timer;
530*6777b538SAndroid Build Coastguard Worker   TimeTicks start = TimeTicks::Now();
531*6777b538SAndroid Build Coastguard Worker 
532*6777b538SAndroid Build Coastguard Worker   MockRepeatingCallback<void()> destructed;
533*6777b538SAndroid Build Coastguard Worker   ScopedClosureRunner scoped_closure(destructed.Get());
534*6777b538SAndroid Build Coastguard Worker   timer.Start(FROM_HERE, start + Seconds(5),
535*6777b538SAndroid Build Coastguard Worker               BindOnce([](ScopedClosureRunner) {}, std::move(scoped_closure)));
536*6777b538SAndroid Build Coastguard Worker 
537*6777b538SAndroid Build Coastguard Worker   EXPECT_CALL(destructed, Run());
538*6777b538SAndroid Build Coastguard Worker   timer.Stop();
539*6777b538SAndroid Build Coastguard Worker   testing::Mock::VerifyAndClearExpectations(&destructed);
540*6777b538SAndroid Build Coastguard Worker }
541*6777b538SAndroid Build Coastguard Worker 
TEST(TimerTest,DeadlineTimerStartTwice)542*6777b538SAndroid Build Coastguard Worker TEST(TimerTest, DeadlineTimerStartTwice) {
543*6777b538SAndroid Build Coastguard Worker   test::TaskEnvironment task_environment(
544*6777b538SAndroid Build Coastguard Worker       test::TaskEnvironment::TimeSource::MOCK_TIME);
545*6777b538SAndroid Build Coastguard Worker   DeadlineTimer timer;
546*6777b538SAndroid Build Coastguard Worker   TimeTicks start = TimeTicks::Now();
547*6777b538SAndroid Build Coastguard Worker 
548*6777b538SAndroid Build Coastguard Worker   RunLoop run_loop;
549*6777b538SAndroid Build Coastguard Worker   timer.Start(FROM_HERE, start + Seconds(5), run_loop.QuitClosure());
550*6777b538SAndroid Build Coastguard Worker   timer.Start(FROM_HERE, start + Seconds(10), run_loop.QuitClosure());
551*6777b538SAndroid Build Coastguard Worker   run_loop.Run();
552*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(start + Seconds(10), TimeTicks::Now());
553*6777b538SAndroid Build Coastguard Worker }
554*6777b538SAndroid Build Coastguard Worker 
TEST(TimerTest,MetronomeTimer)555*6777b538SAndroid Build Coastguard Worker TEST(TimerTest, MetronomeTimer) {
556*6777b538SAndroid Build Coastguard Worker   test::TaskEnvironment task_environment(
557*6777b538SAndroid Build Coastguard Worker       test::TaskEnvironment::TimeSource::MOCK_TIME);
558*6777b538SAndroid Build Coastguard Worker   MetronomeTimer timer;
559*6777b538SAndroid Build Coastguard Worker   TimeTicks start = TimeTicks::Now();
560*6777b538SAndroid Build Coastguard Worker 
561*6777b538SAndroid Build Coastguard Worker   // Ensure the run_loop.Run() below doesn't straddle over multiple ticks.
562*6777b538SAndroid Build Coastguard Worker   task_environment.AdvanceClock(
563*6777b538SAndroid Build Coastguard Worker       start.SnappedToNextTick(TimeTicks(), Seconds(5)) - start);
564*6777b538SAndroid Build Coastguard Worker   start = TimeTicks::Now();
565*6777b538SAndroid Build Coastguard Worker 
566*6777b538SAndroid Build Coastguard Worker   RunLoop run_loop;
567*6777b538SAndroid Build Coastguard Worker   timer.Start(FROM_HERE, Seconds(5), run_loop.QuitClosure());
568*6777b538SAndroid Build Coastguard Worker   run_loop.Run();
569*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(start + Seconds(5), TimeTicks::Now());
570*6777b538SAndroid Build Coastguard Worker }
571*6777b538SAndroid Build Coastguard Worker 
TEST(TimerTest,MetronomeTimerCustomPhase)572*6777b538SAndroid Build Coastguard Worker TEST(TimerTest, MetronomeTimerCustomPhase) {
573*6777b538SAndroid Build Coastguard Worker   test::TaskEnvironment task_environment(
574*6777b538SAndroid Build Coastguard Worker       test::TaskEnvironment::TimeSource::MOCK_TIME);
575*6777b538SAndroid Build Coastguard Worker   RunLoop run_loop;
576*6777b538SAndroid Build Coastguard Worker   MetronomeTimer timer;
577*6777b538SAndroid Build Coastguard Worker   TimeTicks start = TimeTicks::Now();
578*6777b538SAndroid Build Coastguard Worker 
579*6777b538SAndroid Build Coastguard Worker   timer.Start(FROM_HERE, Seconds(5), run_loop.QuitClosure(), start);
580*6777b538SAndroid Build Coastguard Worker   run_loop.Run();
581*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(start + Seconds(5), TimeTicks::Now());
582*6777b538SAndroid Build Coastguard Worker }
583*6777b538SAndroid Build Coastguard Worker 
TEST(TimerTest,MetronomeTimerReset)584*6777b538SAndroid Build Coastguard Worker TEST(TimerTest, MetronomeTimerReset) {
585*6777b538SAndroid Build Coastguard Worker   test::TaskEnvironment task_environment(
586*6777b538SAndroid Build Coastguard Worker       test::TaskEnvironment::TimeSource::MOCK_TIME);
587*6777b538SAndroid Build Coastguard Worker   RunLoop run_loop;
588*6777b538SAndroid Build Coastguard Worker   TimeTicks start = TimeTicks::Now();
589*6777b538SAndroid Build Coastguard Worker   MetronomeTimer timer(FROM_HERE, Seconds(5), run_loop.QuitClosure(), start);
590*6777b538SAndroid Build Coastguard Worker 
591*6777b538SAndroid Build Coastguard Worker   timer.Reset();
592*6777b538SAndroid Build Coastguard Worker   run_loop.Run();
593*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(start + Seconds(5), TimeTicks::Now());
594*6777b538SAndroid Build Coastguard Worker }
595*6777b538SAndroid Build Coastguard Worker 
TEST(TimerTest,MetronomeTimerStartTwice)596*6777b538SAndroid Build Coastguard Worker TEST(TimerTest, MetronomeTimerStartTwice) {
597*6777b538SAndroid Build Coastguard Worker   test::TaskEnvironment task_environment(
598*6777b538SAndroid Build Coastguard Worker       test::TaskEnvironment::TimeSource::MOCK_TIME);
599*6777b538SAndroid Build Coastguard Worker   MetronomeTimer timer;
600*6777b538SAndroid Build Coastguard Worker   TimeTicks start = TimeTicks::Now();
601*6777b538SAndroid Build Coastguard Worker 
602*6777b538SAndroid Build Coastguard Worker   {
603*6777b538SAndroid Build Coastguard Worker     RunLoop run_loop;
604*6777b538SAndroid Build Coastguard Worker     timer.Start(FROM_HERE, Seconds(4), run_loop.QuitClosure(), start);
605*6777b538SAndroid Build Coastguard Worker     run_loop.Run();
606*6777b538SAndroid Build Coastguard Worker   }
607*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(start + Seconds(4), TimeTicks::Now());
608*6777b538SAndroid Build Coastguard Worker 
609*6777b538SAndroid Build Coastguard Worker   {
610*6777b538SAndroid Build Coastguard Worker     RunLoop run_loop;
611*6777b538SAndroid Build Coastguard Worker     timer.Start(FROM_HERE, Seconds(2), run_loop.QuitClosure(), start);
612*6777b538SAndroid Build Coastguard Worker     run_loop.Run();
613*6777b538SAndroid Build Coastguard Worker   }
614*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(start + Seconds(6), TimeTicks::Now());
615*6777b538SAndroid Build Coastguard Worker }
616*6777b538SAndroid Build Coastguard Worker 
TEST(TimerTest,MetronomeTimerMultiple)617*6777b538SAndroid Build Coastguard Worker TEST(TimerTest, MetronomeTimerMultiple) {
618*6777b538SAndroid Build Coastguard Worker   test::TaskEnvironment task_environment(
619*6777b538SAndroid Build Coastguard Worker       test::TaskEnvironment::TimeSource::MOCK_TIME);
620*6777b538SAndroid Build Coastguard Worker   MetronomeTimer timer;
621*6777b538SAndroid Build Coastguard Worker   TimeTicks start = TimeTicks::Now();
622*6777b538SAndroid Build Coastguard Worker 
623*6777b538SAndroid Build Coastguard Worker   // Ensure the subsequent FastForwardBy() don't straddle over multiple ticks.
624*6777b538SAndroid Build Coastguard Worker   task_environment.AdvanceClock(
625*6777b538SAndroid Build Coastguard Worker       start.SnappedToNextTick(TimeTicks(), Seconds(5)) - start);
626*6777b538SAndroid Build Coastguard Worker 
627*6777b538SAndroid Build Coastguard Worker   MockRepeatingCallback<void()> callback;
628*6777b538SAndroid Build Coastguard Worker   timer.Start(FROM_HERE, Seconds(5), callback.Get());
629*6777b538SAndroid Build Coastguard Worker 
630*6777b538SAndroid Build Coastguard Worker   // The first tick is skipped because it is too close. Ticks at 5s and 10s.
631*6777b538SAndroid Build Coastguard Worker   EXPECT_CALL(callback, Run()).Times(2);
632*6777b538SAndroid Build Coastguard Worker   task_environment.FastForwardBy(Seconds(10));
633*6777b538SAndroid Build Coastguard Worker 
634*6777b538SAndroid Build Coastguard Worker   EXPECT_CALL(callback, Run()).Times(2);
635*6777b538SAndroid Build Coastguard Worker   // Ticks at 15s and 25s, while 20s is missed.
636*6777b538SAndroid Build Coastguard Worker   task_environment.AdvanceClock(Seconds(12));
637*6777b538SAndroid Build Coastguard Worker   task_environment.FastForwardBy(Seconds(3));
638*6777b538SAndroid Build Coastguard Worker }
639*6777b538SAndroid Build Coastguard Worker 
TEST(TimerTest,MetronomeTimerCancel)640*6777b538SAndroid Build Coastguard Worker TEST(TimerTest, MetronomeTimerCancel) {
641*6777b538SAndroid Build Coastguard Worker   test::TaskEnvironment task_environment(
642*6777b538SAndroid Build Coastguard Worker       test::TaskEnvironment::TimeSource::MOCK_TIME);
643*6777b538SAndroid Build Coastguard Worker   RunLoop run_loop;
644*6777b538SAndroid Build Coastguard Worker   MetronomeTimer timer;
645*6777b538SAndroid Build Coastguard Worker   TimeTicks start = TimeTicks::Now();
646*6777b538SAndroid Build Coastguard Worker 
647*6777b538SAndroid Build Coastguard Worker   MockRepeatingCallback<void()> callback;
648*6777b538SAndroid Build Coastguard Worker   timer.Start(FROM_HERE, Seconds(5), callback.Get());
649*6777b538SAndroid Build Coastguard Worker 
650*6777b538SAndroid Build Coastguard Worker   EXPECT_CALL(callback, Run()).Times(0);
651*6777b538SAndroid Build Coastguard Worker   timer.Stop();
652*6777b538SAndroid Build Coastguard Worker   task_environment.FastForwardBy(Seconds(5));
653*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(start + Seconds(5), TimeTicks::Now());
654*6777b538SAndroid Build Coastguard Worker }
655*6777b538SAndroid Build Coastguard Worker 
656*6777b538SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(All,
657*6777b538SAndroid Build Coastguard Worker                          TimerTestWithThreadType,
658*6777b538SAndroid Build Coastguard Worker                          testing::ValuesIn(testing_main_threads));
659*6777b538SAndroid Build Coastguard Worker 
660*6777b538SAndroid Build Coastguard Worker }  // namespace base
661