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