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