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