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