xref: /aosp_15_r20/external/libchrome/base/timer/mock_timer_unittest.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright 2014 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #include "base/timer/mock_timer.h"
6*635a8641SAndroid Build Coastguard Worker 
7*635a8641SAndroid Build Coastguard Worker #include "base/macros.h"
8*635a8641SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
9*635a8641SAndroid Build Coastguard Worker 
10*635a8641SAndroid Build Coastguard Worker namespace {
11*635a8641SAndroid Build Coastguard Worker 
CallMeMaybe(int * number)12*635a8641SAndroid Build Coastguard Worker void CallMeMaybe(int *number) {
13*635a8641SAndroid Build Coastguard Worker   (*number)++;
14*635a8641SAndroid Build Coastguard Worker }
15*635a8641SAndroid Build Coastguard Worker 
TEST(MockTimerTest,FiresOnce)16*635a8641SAndroid Build Coastguard Worker TEST(MockTimerTest, FiresOnce) {
17*635a8641SAndroid Build Coastguard Worker   int calls = 0;
18*635a8641SAndroid Build Coastguard Worker   base::MockOneShotTimer timer;
19*635a8641SAndroid Build Coastguard Worker   base::TimeDelta delay = base::TimeDelta::FromSeconds(2);
20*635a8641SAndroid Build Coastguard Worker   timer.Start(FROM_HERE, delay,
21*635a8641SAndroid Build Coastguard Worker               base::Bind(&CallMeMaybe,
22*635a8641SAndroid Build Coastguard Worker                          base::Unretained(&calls)));
23*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(delay, timer.GetCurrentDelay());
24*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(timer.IsRunning());
25*635a8641SAndroid Build Coastguard Worker   timer.Fire();
26*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(timer.IsRunning());
27*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, calls);
28*635a8641SAndroid Build Coastguard Worker }
29*635a8641SAndroid Build Coastguard Worker 
TEST(MockTimerTest,FiresRepeatedly)30*635a8641SAndroid Build Coastguard Worker TEST(MockTimerTest, FiresRepeatedly) {
31*635a8641SAndroid Build Coastguard Worker   int calls = 0;
32*635a8641SAndroid Build Coastguard Worker   base::MockRepeatingTimer timer;
33*635a8641SAndroid Build Coastguard Worker   base::TimeDelta delay = base::TimeDelta::FromSeconds(2);
34*635a8641SAndroid Build Coastguard Worker   timer.Start(FROM_HERE, delay,
35*635a8641SAndroid Build Coastguard Worker               base::Bind(&CallMeMaybe,
36*635a8641SAndroid Build Coastguard Worker                          base::Unretained(&calls)));
37*635a8641SAndroid Build Coastguard Worker   timer.Fire();
38*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(timer.IsRunning());
39*635a8641SAndroid Build Coastguard Worker   timer.Fire();
40*635a8641SAndroid Build Coastguard Worker   timer.Fire();
41*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(timer.IsRunning());
42*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(3, calls);
43*635a8641SAndroid Build Coastguard Worker }
44*635a8641SAndroid Build Coastguard Worker 
TEST(MockTimerTest,Stops)45*635a8641SAndroid Build Coastguard Worker TEST(MockTimerTest, Stops) {
46*635a8641SAndroid Build Coastguard Worker   int calls = 0;
47*635a8641SAndroid Build Coastguard Worker   base::MockRepeatingTimer timer;
48*635a8641SAndroid Build Coastguard Worker   base::TimeDelta delay = base::TimeDelta::FromSeconds(2);
49*635a8641SAndroid Build Coastguard Worker   timer.Start(FROM_HERE, delay,
50*635a8641SAndroid Build Coastguard Worker               base::Bind(&CallMeMaybe,
51*635a8641SAndroid Build Coastguard Worker                          base::Unretained(&calls)));
52*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(timer.IsRunning());
53*635a8641SAndroid Build Coastguard Worker   timer.Stop();
54*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(timer.IsRunning());
55*635a8641SAndroid Build Coastguard Worker }
56*635a8641SAndroid Build Coastguard Worker 
57*635a8641SAndroid Build Coastguard Worker class HasWeakPtr : public base::SupportsWeakPtr<HasWeakPtr> {
58*635a8641SAndroid Build Coastguard Worker  public:
59*635a8641SAndroid Build Coastguard Worker   HasWeakPtr() = default;
60*635a8641SAndroid Build Coastguard Worker   virtual ~HasWeakPtr() = default;
61*635a8641SAndroid Build Coastguard Worker 
62*635a8641SAndroid Build Coastguard Worker  private:
63*635a8641SAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(HasWeakPtr);
64*635a8641SAndroid Build Coastguard Worker };
65*635a8641SAndroid Build Coastguard Worker 
TEST(MockTimerTest,DoesNotRetainClosure)66*635a8641SAndroid Build Coastguard Worker TEST(MockTimerTest, DoesNotRetainClosure) {
67*635a8641SAndroid Build Coastguard Worker   HasWeakPtr *has_weak_ptr = new HasWeakPtr();
68*635a8641SAndroid Build Coastguard Worker   base::WeakPtr<HasWeakPtr> weak_ptr(has_weak_ptr->AsWeakPtr());
69*635a8641SAndroid Build Coastguard Worker   base::MockOneShotTimer timer;
70*635a8641SAndroid Build Coastguard Worker   base::TimeDelta delay = base::TimeDelta::FromSeconds(2);
71*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(weak_ptr.get());
72*635a8641SAndroid Build Coastguard Worker   timer.Start(FROM_HERE, delay,
73*635a8641SAndroid Build Coastguard Worker               base::Bind(base::DoNothing::Repeatedly<HasWeakPtr*>(),
74*635a8641SAndroid Build Coastguard Worker                          base::Owned(has_weak_ptr)));
75*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(weak_ptr.get());
76*635a8641SAndroid Build Coastguard Worker   timer.Fire();
77*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(weak_ptr.get());
78*635a8641SAndroid Build Coastguard Worker }
79*635a8641SAndroid Build Coastguard Worker 
80*635a8641SAndroid Build Coastguard Worker }  // namespace
81