1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef BASE_TEST_TEST_PENDING_TASK_H_
6#define BASE_TEST_TEST_PENDING_TASK_H_
7
8#include "base/callback.h"
9#include "base/location.h"
10#include "base/time/time.h"
11
12namespace base {
13
14// TestPendingTask is a helper class for test TaskRunner
15// implementations.  See test_simple_task_runner.h for example usage.
16
17struct TestPendingTask {
18  enum TestNestability { NESTABLE, NON_NESTABLE };
19
20  TestPendingTask();
21  TestPendingTask(const tracked_objects::Location& location,
22                  const Closure& task,
23                  TimeTicks post_time,
24                  TimeDelta delay,
25                  TestNestability nestability);
26  ~TestPendingTask();
27
28  // Returns post_time + delay.
29  TimeTicks GetTimeToRun() const;
30
31  // Returns true if this task is nestable and |other| isn't, or if
32  // this task's time to run is strictly earlier than |other|'s time
33  // to run.
34  //
35  // Note that two tasks may both have the same nestability and delay.
36  // In that case, the caller must use some other criterion (probably
37  // the position in some queue) to break the tie.  Conveniently, the
38  // following STL functions already do so:
39  //
40  //   - std::min_element
41  //   - std::stable_sort
42  //
43  // but the following STL functions don't:
44  //
45  //   - std::max_element
46  //   - std::sort.
47  bool ShouldRunBefore(const TestPendingTask& other) const;
48
49  tracked_objects::Location location;
50  Closure task;
51  TimeTicks post_time;
52  TimeDelta delay;
53  TestNestability nestability;
54};
55
56}  // namespace base
57
58#endif  // BASE_TEST_TEST_TASK_RUNNER_H_
59