1*6777b538SAndroid Build Coastguard Worker // Copyright 2014 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/mock_timer.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include "base/functional/bind.h"
8*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
9*6777b538SAndroid Build Coastguard Worker
10*6777b538SAndroid Build Coastguard Worker namespace {
11*6777b538SAndroid Build Coastguard Worker
CallMeMaybe(int * number)12*6777b538SAndroid Build Coastguard Worker void CallMeMaybe(int *number) {
13*6777b538SAndroid Build Coastguard Worker (*number)++;
14*6777b538SAndroid Build Coastguard Worker }
15*6777b538SAndroid Build Coastguard Worker
TEST(MockTimerTest,FiresOnce)16*6777b538SAndroid Build Coastguard Worker TEST(MockTimerTest, FiresOnce) {
17*6777b538SAndroid Build Coastguard Worker int calls = 0;
18*6777b538SAndroid Build Coastguard Worker base::MockOneShotTimer timer;
19*6777b538SAndroid Build Coastguard Worker base::TimeDelta delay = base::Seconds(2);
20*6777b538SAndroid Build Coastguard Worker timer.Start(FROM_HERE, delay,
21*6777b538SAndroid Build Coastguard Worker base::BindOnce(&CallMeMaybe, base::Unretained(&calls)));
22*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(delay, timer.GetCurrentDelay());
23*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(timer.IsRunning());
24*6777b538SAndroid Build Coastguard Worker timer.Fire();
25*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(timer.IsRunning());
26*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, calls);
27*6777b538SAndroid Build Coastguard Worker }
28*6777b538SAndroid Build Coastguard Worker
TEST(MockTimerTest,FiresRepeatedly)29*6777b538SAndroid Build Coastguard Worker TEST(MockTimerTest, FiresRepeatedly) {
30*6777b538SAndroid Build Coastguard Worker int calls = 0;
31*6777b538SAndroid Build Coastguard Worker base::MockRepeatingTimer timer;
32*6777b538SAndroid Build Coastguard Worker base::TimeDelta delay = base::Seconds(2);
33*6777b538SAndroid Build Coastguard Worker timer.Start(FROM_HERE, delay,
34*6777b538SAndroid Build Coastguard Worker base::BindRepeating(&CallMeMaybe, base::Unretained(&calls)));
35*6777b538SAndroid Build Coastguard Worker timer.Fire();
36*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(timer.IsRunning());
37*6777b538SAndroid Build Coastguard Worker timer.Fire();
38*6777b538SAndroid Build Coastguard Worker timer.Fire();
39*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(timer.IsRunning());
40*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3, calls);
41*6777b538SAndroid Build Coastguard Worker }
42*6777b538SAndroid Build Coastguard Worker
TEST(MockTimerTest,Stops)43*6777b538SAndroid Build Coastguard Worker TEST(MockTimerTest, Stops) {
44*6777b538SAndroid Build Coastguard Worker int calls = 0;
45*6777b538SAndroid Build Coastguard Worker base::MockRepeatingTimer timer;
46*6777b538SAndroid Build Coastguard Worker base::TimeDelta delay = base::Seconds(2);
47*6777b538SAndroid Build Coastguard Worker timer.Start(FROM_HERE, delay,
48*6777b538SAndroid Build Coastguard Worker base::BindRepeating(&CallMeMaybe, base::Unretained(&calls)));
49*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(timer.IsRunning());
50*6777b538SAndroid Build Coastguard Worker timer.Stop();
51*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(timer.IsRunning());
52*6777b538SAndroid Build Coastguard Worker }
53*6777b538SAndroid Build Coastguard Worker
TEST(MockOneShotTimerTest,FireNow)54*6777b538SAndroid Build Coastguard Worker TEST(MockOneShotTimerTest, FireNow) {
55*6777b538SAndroid Build Coastguard Worker int calls = 0;
56*6777b538SAndroid Build Coastguard Worker base::MockOneShotTimer timer;
57*6777b538SAndroid Build Coastguard Worker base::TimeDelta delay = base::Seconds(2);
58*6777b538SAndroid Build Coastguard Worker timer.Start(FROM_HERE, delay,
59*6777b538SAndroid Build Coastguard Worker base::BindOnce(&CallMeMaybe, base::Unretained(&calls)));
60*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(delay, timer.GetCurrentDelay());
61*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(timer.IsRunning());
62*6777b538SAndroid Build Coastguard Worker timer.FireNow();
63*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(timer.IsRunning());
64*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, calls);
65*6777b538SAndroid Build Coastguard Worker }
66*6777b538SAndroid Build Coastguard Worker
67*6777b538SAndroid Build Coastguard Worker class HasWeakPtr {
68*6777b538SAndroid Build Coastguard Worker public:
69*6777b538SAndroid Build Coastguard Worker HasWeakPtr() = default;
70*6777b538SAndroid Build Coastguard Worker
71*6777b538SAndroid Build Coastguard Worker HasWeakPtr(const HasWeakPtr&) = delete;
72*6777b538SAndroid Build Coastguard Worker HasWeakPtr& operator=(const HasWeakPtr&) = delete;
73*6777b538SAndroid Build Coastguard Worker
74*6777b538SAndroid Build Coastguard Worker virtual ~HasWeakPtr() = default;
75*6777b538SAndroid Build Coastguard Worker
AsWeakPtr()76*6777b538SAndroid Build Coastguard Worker base::WeakPtr<HasWeakPtr> AsWeakPtr() {
77*6777b538SAndroid Build Coastguard Worker return weak_ptr_factory_.GetWeakPtr();
78*6777b538SAndroid Build Coastguard Worker }
79*6777b538SAndroid Build Coastguard Worker
80*6777b538SAndroid Build Coastguard Worker private:
81*6777b538SAndroid Build Coastguard Worker base::WeakPtrFactory<HasWeakPtr> weak_ptr_factory_{this};
82*6777b538SAndroid Build Coastguard Worker };
83*6777b538SAndroid Build Coastguard Worker
TEST(MockTimerTest,DoesNotRetainClosure)84*6777b538SAndroid Build Coastguard Worker TEST(MockTimerTest, DoesNotRetainClosure) {
85*6777b538SAndroid Build Coastguard Worker HasWeakPtr *has_weak_ptr = new HasWeakPtr();
86*6777b538SAndroid Build Coastguard Worker base::WeakPtr<HasWeakPtr> weak_ptr(has_weak_ptr->AsWeakPtr());
87*6777b538SAndroid Build Coastguard Worker base::MockOneShotTimer timer;
88*6777b538SAndroid Build Coastguard Worker base::TimeDelta delay = base::Seconds(2);
89*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(weak_ptr.get());
90*6777b538SAndroid Build Coastguard Worker timer.Start(FROM_HERE, delay,
91*6777b538SAndroid Build Coastguard Worker base::BindOnce([](HasWeakPtr*) {}, base::Owned(has_weak_ptr)));
92*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(weak_ptr.get());
93*6777b538SAndroid Build Coastguard Worker timer.Fire();
94*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(weak_ptr.get());
95*6777b538SAndroid Build Coastguard Worker }
96*6777b538SAndroid Build Coastguard Worker
97*6777b538SAndroid Build Coastguard Worker } // namespace
98