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