// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "media/cast/test/skewed_single_thread_task_runner.h"

#include "base/logging.h"
#include "base/time/tick_clock.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace cobalt {
namespace media {
namespace cast {
namespace test {

SkewedSingleThreadTaskRunner::SkewedSingleThreadTaskRunner(
    const scoped_refptr<base::SingleThreadTaskRunner>& task_runner)
    : skew_(1.0), task_runner_(task_runner) {}

SkewedSingleThreadTaskRunner::~SkewedSingleThreadTaskRunner() {}

void SkewedSingleThreadTaskRunner::SetSkew(double skew) { skew_ = skew; }

bool SkewedSingleThreadTaskRunner::PostDelayedTask(
    const tracked_objects::Location& from_here, const base::Closure& task,
    base::TimeDelta delay) {
  return task_runner_->PostDelayedTask(
      from_here, task,
      base::TimeDelta::FromMicroseconds(delay.InMicroseconds() * skew_));
}

bool SkewedSingleThreadTaskRunner::RunsTasksOnCurrentThread() const {
  return task_runner_->RunsTasksOnCurrentThread();
}

bool SkewedSingleThreadTaskRunner::PostNonNestableDelayedTask(
    const tracked_objects::Location& from_here, const base::Closure& task,
    base::TimeDelta delay) {
  return task_runner_->PostNonNestableDelayedTask(
      from_here, task,
      base::TimeDelta::FromMicroseconds(delay.InMicroseconds() * skew_));
}

}  // namespace test
}  // namespace cast
}  // namespace media
}  // namespace cobalt
