1// Copyright 2014 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 MEDIA_CAST_TEST_SKEWED_TASK_RUNNER_H_
6#define MEDIA_CAST_TEST_SKEWED_TASK_RUNNER_H_
7
8#include <map>
9
10#include "base/basictypes.h"
11#include "base/single_thread_task_runner.h"
12#include "base/test/simple_test_tick_clock.h"
13#include "base/test/test_pending_task.h"
14
15namespace media {
16namespace cast {
17namespace test {
18
19// This class wraps a SingleThreadTaskRunner, and allows you to scale
20// the delay for any posted task by a factor. The factor is changed by
21// calling SetSkew(). A skew of 2.0 means that all delayed task will
22// have to wait twice as long.
23class SkewedSingleThreadTaskRunner : public base::SingleThreadTaskRunner {
24 public:
25  explicit SkewedSingleThreadTaskRunner(
26      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner);
27
28  // Set the delay multiplier to |skew|.
29  void SetSkew(double skew);
30
31  // base::SingleThreadTaskRunner implementation.
32  virtual bool PostDelayedTask(const tracked_objects::Location& from_here,
33                               const base::Closure& task,
34                               base::TimeDelta delay) OVERRIDE;
35
36  virtual bool RunsTasksOnCurrentThread() const OVERRIDE;
37
38  // This function is currently not used, and will return false.
39  virtual bool PostNonNestableDelayedTask(
40      const tracked_objects::Location& from_here,
41      const base::Closure& task,
42      base::TimeDelta delay) OVERRIDE;
43
44 protected:
45  virtual ~SkewedSingleThreadTaskRunner();
46
47 private:
48  double skew_;
49  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
50
51  DISALLOW_COPY_AND_ASSIGN(SkewedSingleThreadTaskRunner);
52};
53
54}  // namespace test
55}  // namespace cast
56}  // namespace media
57
58#endif  // MEDIA_CAST_TEST_SKEWED_TASK_RUNNER_H_
59