1b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Use of this source code is governed by a BSD-style license that can be 3b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// found in the LICENSE file. 4b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 5cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#include <stddef.h> 6cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko 7cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#include "base/macros.h" 8b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/memory/scoped_ptr.h" 9b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/message_loop/message_loop.h" 10b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/test/test_simple_task_runner.h" 11b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/timer/timer.h" 12cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#include "build/build_config.h" 13b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "testing/gtest/include/gtest/gtest.h" 14b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 15b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratusing base::TimeDelta; 16b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratusing base::SingleThreadTaskRunner; 17b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 18b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace { 19b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 20b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// The message loops on which each timer should be tested. 21b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst base::MessageLoop::Type testing_message_loops[] = { 22b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop::TYPE_DEFAULT, 23b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop::TYPE_IO, 24b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if !defined(OS_IOS) // iOS does not allow direct running of the UI loop. 25b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop::TYPE_UI, 26b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif 27b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 28b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 29b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst int kNumTestingMessageLoops = arraysize(testing_message_loops); 30b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 31b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass OneShotTimerTester { 32b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public: 33b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat explicit OneShotTimerTester(bool* did_run, unsigned milliseconds = 10) 34b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat : did_run_(did_run), 35b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat delay_ms_(milliseconds), 36b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat quit_message_loop_(true) { 37b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 38b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 39b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void Start() { 40b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat timer_.Start(FROM_HERE, TimeDelta::FromMilliseconds(delay_ms_), this, 41b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat &OneShotTimerTester::Run); 42b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 43b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 44b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void SetTaskRunner(scoped_refptr<SingleThreadTaskRunner> task_runner) { 45b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat quit_message_loop_ = false; 46b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat timer_.SetTaskRunner(task_runner); 47b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 48b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 49b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat private: 50b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void Run() { 51b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *did_run_ = true; 52b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (quit_message_loop_) { 53b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop::current()->QuitWhenIdle(); 54b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 55b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 56b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 57b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool* did_run_; 58cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko base::OneShotTimer timer_; 59b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned delay_ms_; 60b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool quit_message_loop_; 61b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 62b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 63b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass OneShotSelfDeletingTimerTester { 64b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public: 65cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko explicit OneShotSelfDeletingTimerTester(bool* did_run) 66cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko : did_run_(did_run), timer_(new base::OneShotTimer()) {} 67b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 68b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void Start() { 69b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat timer_->Start(FROM_HERE, TimeDelta::FromMilliseconds(10), this, 70b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat &OneShotSelfDeletingTimerTester::Run); 71b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 72b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 73b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat private: 74b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void Run() { 75b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *did_run_ = true; 76b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat timer_.reset(); 77b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop::current()->QuitWhenIdle(); 78b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 79b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 80b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool* did_run_; 81cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko scoped_ptr<base::OneShotTimer> timer_; 82b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 83b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 84b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass RepeatingTimerTester { 85b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public: 86b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat explicit RepeatingTimerTester(bool* did_run, const TimeDelta& delay) 87b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat : did_run_(did_run), counter_(10), delay_(delay) { 88b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 89b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 90b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void Start() { 91b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat timer_.Start(FROM_HERE, delay_, this, &RepeatingTimerTester::Run); 92b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 93b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 94b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat private: 95b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void Run() { 96b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (--counter_ == 0) { 97b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *did_run_ = true; 98b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat timer_.Stop(); 99b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop::current()->QuitWhenIdle(); 100b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 101b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 102b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 103b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool* did_run_; 104b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int counter_; 105b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TimeDelta delay_; 106cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko base::RepeatingTimer timer_; 107b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 108b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 109b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid RunTest_OneShotTimer(base::MessageLoop::Type message_loop_type) { 110b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop loop(message_loop_type); 111b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 112b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool did_run = false; 113b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat OneShotTimerTester f(&did_run); 114b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat f.Start(); 115b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 116b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop::current()->Run(); 117b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 118b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(did_run); 119b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 120b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 121b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid RunTest_OneShotTimer_Cancel(base::MessageLoop::Type message_loop_type) { 122b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop loop(message_loop_type); 123b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 124b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool did_run_a = false; 125b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat OneShotTimerTester* a = new OneShotTimerTester(&did_run_a); 126b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 127b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // This should run before the timer expires. 128b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop::current()->DeleteSoon(FROM_HERE, a); 129b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 130b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Now start the timer. 131b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat a->Start(); 132b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 133b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool did_run_b = false; 134b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat OneShotTimerTester b(&did_run_b); 135b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat b.Start(); 136b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 137b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop::current()->Run(); 138b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 139b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(did_run_a); 140b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(did_run_b); 141b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 142b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 143b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid RunTest_OneShotSelfDeletingTimer( 144b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop::Type message_loop_type) { 145b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop loop(message_loop_type); 146b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 147b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool did_run = false; 148b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat OneShotSelfDeletingTimerTester f(&did_run); 149b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat f.Start(); 150b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 151b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop::current()->Run(); 152b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 153b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(did_run); 154b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 155b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 156b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid RunTest_RepeatingTimer(base::MessageLoop::Type message_loop_type, 157b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const TimeDelta& delay) { 158b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop loop(message_loop_type); 159b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 160b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool did_run = false; 161b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat RepeatingTimerTester f(&did_run, delay); 162b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat f.Start(); 163b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 164b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop::current()->Run(); 165b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 166b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(did_run); 167b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 168b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 169b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid RunTest_RepeatingTimer_Cancel(base::MessageLoop::Type message_loop_type, 170b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const TimeDelta& delay) { 171b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop loop(message_loop_type); 172b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 173b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool did_run_a = false; 174b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat RepeatingTimerTester* a = new RepeatingTimerTester(&did_run_a, delay); 175b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 176b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // This should run before the timer expires. 177b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop::current()->DeleteSoon(FROM_HERE, a); 178b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 179b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Now start the timer. 180b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat a->Start(); 181b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 182b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool did_run_b = false; 183b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat RepeatingTimerTester b(&did_run_b, delay); 184b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat b.Start(); 185b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 186b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop::current()->Run(); 187b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 188b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(did_run_a); 189b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(did_run_b); 190b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 191b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 192b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass DelayTimerTarget { 193b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public: 194b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool signaled() const { return signaled_; } 195b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 196b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void Signal() { 197b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_FALSE(signaled_); 198b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat signaled_ = true; 199b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 200b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 201b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat private: 202b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool signaled_ = false; 203b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 204b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 205b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid RunTest_DelayTimer_NoCall(base::MessageLoop::Type message_loop_type) { 206b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop loop(message_loop_type); 207b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 208b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // If Delay is never called, the timer shouldn't go off. 209b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DelayTimerTarget target; 210cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko base::DelayTimer timer(FROM_HERE, TimeDelta::FromMilliseconds(1), &target, 211cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko &DelayTimerTarget::Signal); 212b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 213b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool did_run = false; 214b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat OneShotTimerTester tester(&did_run); 215b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat tester.Start(); 216b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop::current()->Run(); 217b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 218b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_FALSE(target.signaled()); 219b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 220b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 221b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid RunTest_DelayTimer_OneCall(base::MessageLoop::Type message_loop_type) { 222b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop loop(message_loop_type); 223b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 224b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DelayTimerTarget target; 225cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko base::DelayTimer timer(FROM_HERE, TimeDelta::FromMilliseconds(1), &target, 226cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko &DelayTimerTarget::Signal); 227b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat timer.Reset(); 228b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 229b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool did_run = false; 230b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat OneShotTimerTester tester(&did_run, 100 /* milliseconds */); 231b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat tester.Start(); 232b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop::current()->Run(); 233b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 234b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(target.signaled()); 235b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 236b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 237b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstruct ResetHelper { 238cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko ResetHelper(base::DelayTimer* timer, DelayTimerTarget* target) 239cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko : timer_(timer), target_(target) {} 240b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 241b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void Reset() { 242b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_FALSE(target_->signaled()); 243b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat timer_->Reset(); 244b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 245b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 246b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat private: 247cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko base::DelayTimer* const timer_; 248cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko DelayTimerTarget* const target_; 249b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 250b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 251b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid RunTest_DelayTimer_Reset(base::MessageLoop::Type message_loop_type) { 252b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop loop(message_loop_type); 253b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 254b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // If Delay is never called, the timer shouldn't go off. 255b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DelayTimerTarget target; 256cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko base::DelayTimer timer(FROM_HERE, TimeDelta::FromMilliseconds(50), &target, 257cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko &DelayTimerTarget::Signal); 258b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat timer.Reset(); 259b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 260b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ResetHelper reset_helper(&timer, &target); 261b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 262cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko base::OneShotTimer timers[20]; 263b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (size_t i = 0; i < arraysize(timers); ++i) { 264b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat timers[i].Start(FROM_HERE, TimeDelta::FromMilliseconds(i * 10), 265b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat &reset_helper, &ResetHelper::Reset); 266b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 267b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 268b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool did_run = false; 269b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat OneShotTimerTester tester(&did_run, 300); 270b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat tester.Start(); 271b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop::current()->Run(); 272b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 273b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(target.signaled()); 274b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 275b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 276b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass DelayTimerFatalTarget { 277b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public: 278b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void Signal() { 279b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(false); 280b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 281b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 282b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 283b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 284b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid RunTest_DelayTimer_Deleted(base::MessageLoop::Type message_loop_type) { 285b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop loop(message_loop_type); 286b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 287b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DelayTimerFatalTarget target; 288b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 289b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 290cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko base::DelayTimer timer(FROM_HERE, TimeDelta::FromMilliseconds(50), &target, 291cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko &DelayTimerFatalTarget::Signal); 292b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat timer.Reset(); 293b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 294b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 295b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // When the timer is deleted, the DelayTimerFatalTarget should never be 296b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // called. 297b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(100)); 298b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 299b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 300b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} // namespace 301b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 302b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat//----------------------------------------------------------------------------- 303b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Each test is run against each type of MessageLoop. That way we are sure 304b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// that timers work properly in all configurations. 305b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 306b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(TimerTest, OneShotTimer) { 307b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (int i = 0; i < kNumTestingMessageLoops; i++) { 308b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat RunTest_OneShotTimer(testing_message_loops[i]); 309b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 310b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 311b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 312b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(TimerTest, OneShotTimer_Cancel) { 313b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (int i = 0; i < kNumTestingMessageLoops; i++) { 314b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat RunTest_OneShotTimer_Cancel(testing_message_loops[i]); 315b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 316b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 317b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 318b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// If underline timer does not handle properly, we will crash or fail 319b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// in full page heap environment. 320b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(TimerTest, OneShotSelfDeletingTimer) { 321b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (int i = 0; i < kNumTestingMessageLoops; i++) { 322b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat RunTest_OneShotSelfDeletingTimer(testing_message_loops[i]); 323b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 324b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 325b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 326b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(TimerTest, OneShotTimer_CustomTaskRunner) { 327b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat scoped_refptr<base::TestSimpleTaskRunner> task_runner = 328b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat new base::TestSimpleTaskRunner(); 329b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 330b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool did_run = false; 331b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat OneShotTimerTester f(&did_run); 332b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat f.SetTaskRunner(task_runner); 333b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat f.Start(); 334b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 335b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(did_run); 336b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_runner->RunUntilIdle(); 337b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(did_run); 338b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 339b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 340b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(TimerTest, RepeatingTimer) { 341b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (int i = 0; i < kNumTestingMessageLoops; i++) { 342b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat RunTest_RepeatingTimer(testing_message_loops[i], 343b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TimeDelta::FromMilliseconds(10)); 344b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 345b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 346b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 347b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(TimerTest, RepeatingTimer_Cancel) { 348b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (int i = 0; i < kNumTestingMessageLoops; i++) { 349b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat RunTest_RepeatingTimer_Cancel(testing_message_loops[i], 350b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TimeDelta::FromMilliseconds(10)); 351b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 352b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 353b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 354b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(TimerTest, RepeatingTimerZeroDelay) { 355b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (int i = 0; i < kNumTestingMessageLoops; i++) { 356b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat RunTest_RepeatingTimer(testing_message_loops[i], 357b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TimeDelta::FromMilliseconds(0)); 358b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 359b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 360b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 361b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(TimerTest, RepeatingTimerZeroDelay_Cancel) { 362b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (int i = 0; i < kNumTestingMessageLoops; i++) { 363b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat RunTest_RepeatingTimer_Cancel(testing_message_loops[i], 364b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TimeDelta::FromMilliseconds(0)); 365b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 366b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 367b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 368b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(TimerTest, DelayTimer_NoCall) { 369b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (int i = 0; i < kNumTestingMessageLoops; i++) { 370b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat RunTest_DelayTimer_NoCall(testing_message_loops[i]); 371b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 372b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 373b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 374b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(TimerTest, DelayTimer_OneCall) { 375b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (int i = 0; i < kNumTestingMessageLoops; i++) { 376b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat RunTest_DelayTimer_OneCall(testing_message_loops[i]); 377b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 378b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 379b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 380b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// It's flaky on the buildbot, http://crbug.com/25038. 381b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(TimerTest, DISABLED_DelayTimer_Reset) { 382b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (int i = 0; i < kNumTestingMessageLoops; i++) { 383b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat RunTest_DelayTimer_Reset(testing_message_loops[i]); 384b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 385b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 386b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 387b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(TimerTest, DelayTimer_Deleted) { 388b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (int i = 0; i < kNumTestingMessageLoops; i++) { 389b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat RunTest_DelayTimer_Deleted(testing_message_loops[i]); 390b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 391b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 392b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 393b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(TimerTest, MessageLoopShutdown) { 394b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // This test is designed to verify that shutdown of the 395b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // message loop does not cause crashes if there were pending 396b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // timers not yet fired. It may only trigger exceptions 397b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // if debug heap checking is enabled. 398b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool did_run = false; 399b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 400b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat OneShotTimerTester a(&did_run); 401b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat OneShotTimerTester b(&did_run); 402b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat OneShotTimerTester c(&did_run); 403b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat OneShotTimerTester d(&did_run); 404b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 405b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop loop; 406b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat a.Start(); 407b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat b.Start(); 408b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } // MessageLoop destructs by falling out of scope. 409b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } // OneShotTimers destruct. SHOULD NOT CRASH, of course. 410b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 411b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(did_run); 412b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 413b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 414b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid TimerTestCallback() { 415b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 416b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 417b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(TimerTest, NonRepeatIsRunning) { 418b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 419b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop loop; 420b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::Timer timer(false, false); 421b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(timer.IsRunning()); 422b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat timer.Start(FROM_HERE, TimeDelta::FromDays(1), 423b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::Bind(&TimerTestCallback)); 424b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(timer.IsRunning()); 425b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat timer.Stop(); 426b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(timer.IsRunning()); 427b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(timer.user_task().is_null()); 428b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 429b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 430b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 431b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::Timer timer(true, false); 432b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop loop; 433b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(timer.IsRunning()); 434b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat timer.Start(FROM_HERE, TimeDelta::FromDays(1), 435b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::Bind(&TimerTestCallback)); 436b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(timer.IsRunning()); 437b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat timer.Stop(); 438b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(timer.IsRunning()); 439b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_FALSE(timer.user_task().is_null()); 440b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat timer.Reset(); 441b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(timer.IsRunning()); 442b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 443b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 444b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 445b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(TimerTest, NonRepeatMessageLoopDeath) { 446b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::Timer timer(false, false); 447b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 448b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop loop; 449b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(timer.IsRunning()); 450b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat timer.Start(FROM_HERE, TimeDelta::FromDays(1), 451b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::Bind(&TimerTestCallback)); 452b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(timer.IsRunning()); 453b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 454b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(timer.IsRunning()); 455b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(timer.user_task().is_null()); 456b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 457b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 458b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(TimerTest, RetainRepeatIsRunning) { 459b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop loop; 460b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::Timer timer(FROM_HERE, TimeDelta::FromDays(1), 461b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::Bind(&TimerTestCallback), true); 462b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(timer.IsRunning()); 463b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat timer.Reset(); 464b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(timer.IsRunning()); 465b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat timer.Stop(); 466b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(timer.IsRunning()); 467b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat timer.Reset(); 468b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(timer.IsRunning()); 469b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 470b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 471b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(TimerTest, RetainNonRepeatIsRunning) { 472b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop loop; 473b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::Timer timer(FROM_HERE, TimeDelta::FromDays(1), 474b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::Bind(&TimerTestCallback), false); 475b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(timer.IsRunning()); 476b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat timer.Reset(); 477b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(timer.IsRunning()); 478b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat timer.Stop(); 479b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(timer.IsRunning()); 480b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat timer.Reset(); 481b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(timer.IsRunning()); 482b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 483b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 484b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace { 485b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 486b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool g_callback_happened1 = false; 487b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool g_callback_happened2 = false; 488b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 489b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid ClearAllCallbackHappened() { 490b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat g_callback_happened1 = false; 491b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat g_callback_happened2 = false; 492b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 493b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 494b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid SetCallbackHappened1() { 495b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat g_callback_happened1 = true; 496b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop::current()->QuitWhenIdle(); 497b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 498b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 499b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid SetCallbackHappened2() { 500b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat g_callback_happened2 = true; 501b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop::current()->QuitWhenIdle(); 502b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 503b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 504b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(TimerTest, ContinuationStopStart) { 505b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 506b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ClearAllCallbackHappened(); 507b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop loop; 508b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::Timer timer(false, false); 509b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat timer.Start(FROM_HERE, TimeDelta::FromMilliseconds(10), 510b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::Bind(&SetCallbackHappened1)); 511b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat timer.Stop(); 512b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat timer.Start(FROM_HERE, TimeDelta::FromMilliseconds(40), 513b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::Bind(&SetCallbackHappened2)); 514b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop::current()->Run(); 515b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(g_callback_happened1); 516b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(g_callback_happened2); 517b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 518b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 519b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 520b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(TimerTest, ContinuationReset) { 521b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 522b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ClearAllCallbackHappened(); 523b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop loop; 524b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::Timer timer(false, false); 525b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat timer.Start(FROM_HERE, TimeDelta::FromMilliseconds(10), 526b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::Bind(&SetCallbackHappened1)); 527b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat timer.Reset(); 528b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Since Reset happened before task ran, the user_task must not be cleared: 529b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_FALSE(timer.user_task().is_null()); 530b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::MessageLoop::current()->Run(); 531b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(g_callback_happened1); 532b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 533b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 534b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 535b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} // namespace 536