xref: /aosp_15_r20/external/cronet/base/timer/mock_timer_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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