blob: ec9bfa181e39716d0bdd8c8a8ea3d1aea68d512e [file] [log] [blame]
// Copyright 2015 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 "base/test/scoped_mock_time_message_loop_task_runner.h"
#include <deque>
#include "base/bind.h"
#include "base/logging.h"
#include "base/message_loop/message_loop.h"
#include "base/run_loop.h"
#include "base/test/test_pending_task.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/time/time.h"
namespace base {
namespace {
void RunOnceClosure(OnceClosure closure) {
std::move(closure).Run();
}
} // namespace
ScopedMockTimeMessageLoopTaskRunner::ScopedMockTimeMessageLoopTaskRunner()
: task_runner_(new TestMockTimeTaskRunner),
previous_task_runner_(ThreadTaskRunnerHandle::Get()) {
DCHECK(MessageLoop::current());
// To ensure that we process any initialization tasks posted to the
// MessageLoop by a test fixture before replacing its TaskRunner.
RunLoop().RunUntilIdle();
MessageLoop::current()->SetTaskRunner(task_runner_);
}
ScopedMockTimeMessageLoopTaskRunner::~ScopedMockTimeMessageLoopTaskRunner() {
DCHECK(previous_task_runner_->RunsTasksInCurrentSequence());
DCHECK_EQ(task_runner_, ThreadTaskRunnerHandle::Get());
for (auto& pending_task : task_runner_->TakePendingTasks()) {
// TODO(tzik): Remove RunOnceClosure once TaskRunner migrates from Closure
// to OnceClosure.
previous_task_runner_->PostDelayedTask(
pending_task.location,
BindOnce(&RunOnceClosure, Passed(&pending_task.task)),
pending_task.GetTimeToRun() - task_runner_->NowTicks());
}
MessageLoop::current()->SetTaskRunner(std::move(previous_task_runner_));
}
} // namespace base