blob: d255285460be59ed146fdeeac8fac53f93fc5faf [file] [log] [blame]
// Copyright 2017 The Fuchsia 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 "garnet/lib/callback/scoped_task_runner.h"
#include "gtest/gtest.h"
#include "lib/fsl/tasks/message_loop.h"
namespace callback {
namespace {
class FakeTaskRunner : public fxl::TaskRunner {
public:
inline static fxl::RefPtr<FakeTaskRunner> Create() {
return AdoptRef(new FakeTaskRunner());
}
void PostTask(fxl::Closure task) override {
tasks.push_back(std::move(task));
}
void PostTaskForTime(fxl::Closure task,
fxl::TimePoint /*target_time*/) override {
tasks.push_back(std::move(task));
}
void PostDelayedTask(fxl::Closure task, fxl::TimeDelta /*delay*/) override {
tasks.push_back(std::move(task));
}
bool RunsTasksOnCurrentThread() override {
runs_task_on_current_thread_called = true;
return true;
}
std::vector<fxl::Closure> tasks;
bool runs_task_on_current_thread_called = false;
};
TEST(ScopedTaskRunner, DelegateToTaskRunner) {
auto base_task_runner = FakeTaskRunner::Create();
uint8_t called = 0;
auto increment_call = [&called] { ++called; };
ScopedTaskRunner task_runner(base_task_runner);
task_runner.PostTask(increment_call);
task_runner.PostDelayedTask(increment_call, fxl::TimeDelta::FromSeconds(0));
task_runner.PostTaskForTime(increment_call, fxl::TimePoint::Now());
EXPECT_TRUE(task_runner.RunsTasksOnCurrentThread());
EXPECT_TRUE(base_task_runner->runs_task_on_current_thread_called);
EXPECT_EQ(3u, base_task_runner->tasks.size());
for (const auto& task : base_task_runner->tasks) {
task();
}
EXPECT_EQ(3u, called);
}
TEST(ScopedTaskRunner, CancelOnDeletion) {
auto base_task_runner = FakeTaskRunner::Create();
uint8_t called = 0;
auto increment_call = [&called] { ++called; };
{
ScopedTaskRunner task_runner(base_task_runner);
task_runner.PostTask(increment_call);
task_runner.PostDelayedTask(increment_call, fxl::TimeDelta::FromSeconds(0));
task_runner.PostTaskForTime(increment_call, fxl::TimePoint::Now());
}
EXPECT_EQ(3u, base_task_runner->tasks.size());
for (const auto& task : base_task_runner->tasks) {
task();
}
EXPECT_EQ(0u, called);
}
} // namespace
} // namespace callback