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)namespace base {
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)MockTimer::MockTimer(bool retain_user_task, bool is_repeating)
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : Timer(retain_user_task, is_repeating),
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      is_running_(false) {
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)MockTimer::MockTimer(const tracked_objects::Location& posted_from,
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     TimeDelta delay,
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     const base::Closure& user_task,
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     bool is_repeating)
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : Timer(true, is_repeating),
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      delay_(delay),
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      is_running_(false) {
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)MockTimer::~MockTimer() {
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool MockTimer::IsRunning() const {
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return is_running_;
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)base::TimeDelta MockTimer::GetCurrentDelay() const {
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return delay_;
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void MockTimer::Start(const tracked_objects::Location& posted_from,
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      TimeDelta delay,
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      const base::Closure& user_task) {
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  delay_ = delay;
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  user_task_ = user_task;
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Reset();
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void MockTimer::Stop() {
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  is_running_ = false;
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!retain_user_task())
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    user_task_.Reset();
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void MockTimer::Reset() {
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(!user_task_.is_null());
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  is_running_ = true;
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void MockTimer::Fire() {
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(is_running_);
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::Closure old_task = user_task_;
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (is_repeating())
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    Reset();
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  else
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    Stop();
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  old_task.Run();
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace base
64