| Index: base/task_scheduler/task_scheduler_impl_unittest.cc
|
| diff --git a/base/task_scheduler/task_scheduler_impl_unittest.cc b/base/task_scheduler/task_scheduler_impl_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..73ca0454984966ce7a3f716cff1c8be0f5d57fdb
|
| --- /dev/null
|
| +++ b/base/task_scheduler/task_scheduler_impl_unittest.cc
|
| @@ -0,0 +1,146 @@
|
| +// Copyright 2016 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/task_scheduler/task_scheduler_impl.h"
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/callback_forward.h"
|
| +#include "base/synchronization/condition_variable.h"
|
| +#include "base/task_scheduler/scheduler_lock.h"
|
| +#include "base/threading/platform_thread.h"
|
| +#include "build/build_config.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace base {
|
| +namespace task_scheduler {
|
| +
|
| +class TaskSchedulerImplTest : public testing::Test {
|
| + protected:
|
| + TaskSchedulerImplTest()
|
| + : cv_(lock_.RawLockForConditionVariable()),
|
| + num_posted_tasks_(0),
|
| + num_executed_tasks_(0),
|
| + ran_all_tasks_with_expected_priority_(true) {}
|
| +
|
| + Closure GetTaskClosure(ThreadPriority expected_priority) {
|
| + ++num_posted_tasks_;
|
| + return Bind(&TaskSchedulerImplTest::RunTask, Unretained(this),
|
| + expected_priority);
|
| + }
|
| +
|
| + void WaitUntilLastPostedTaskHasRun() {
|
| + AutoSchedulerLock auto_lock(lock_);
|
| + while (num_posted_tasks_ != num_executed_tasks_)
|
| + cv_.Wait();
|
| + }
|
| +
|
| + void Shutdown() {
|
| + scheduler_.Shutdown();
|
| + scheduler_.JoinAllThreadsForTesting();
|
| + }
|
| +
|
| + bool ran_all_tasks_with_expected_priority() const {
|
| + return ran_all_tasks_with_expected_priority_;
|
| + }
|
| +
|
| + TaskSchedulerImpl scheduler_;
|
| +
|
| + private:
|
| + void RunTask(ThreadPriority expected_priority) {
|
| +#if !defined(OS_MACOSX)
|
| + // PlatformThread::GetCurrentThreadPriority() isn't implemented on Mac.
|
| + // crbug.com/554651
|
| + if (PlatformThread::GetCurrentThreadPriority() != expected_priority)
|
| + ran_all_tasks_with_expected_priority_ = false;
|
| +#endif // defined(OS_MACOSX)
|
| +
|
| + AutoSchedulerLock auto_lock(lock_);
|
| + ++num_executed_tasks_;
|
| + cv_.Signal();
|
| + }
|
| +
|
| + // Lock protecting |cv_|.
|
| + SchedulerLock lock_;
|
| +
|
| + // Condition variable signaled each time a task completes its execution.
|
| + ConditionVariable cv_;
|
| +
|
| + // Number of posted tasks.
|
| + size_t num_posted_tasks_;
|
| +
|
| + // Number of tasks that were executed.
|
| + size_t num_executed_tasks_;
|
| +
|
| + // True if all tasks ran on a thread with the expected priority.
|
| + bool ran_all_tasks_with_expected_priority_;
|
| +};
|
| +
|
| +TEST_F(TaskSchedulerImplTest, PostTaskWithTraits) {
|
| + scheduler_.PostTaskWithTraits(
|
| + FROM_HERE, TaskTraits().WithPriority(TaskPriority::BACKGROUND),
|
| + GetTaskClosure(ThreadPriority::BACKGROUND));
|
| + scheduler_.PostTaskWithTraits(
|
| + FROM_HERE, TaskTraits().WithPriority(TaskPriority::USER_VISIBLE),
|
| + GetTaskClosure(ThreadPriority::NORMAL));
|
| + scheduler_.PostTaskWithTraits(
|
| + FROM_HERE, TaskTraits().WithPriority(TaskPriority::USER_BLOCKING),
|
| + GetTaskClosure(ThreadPriority::NORMAL));
|
| +
|
| + scheduler_.PostTaskWithTraits(
|
| + FROM_HERE,
|
| + TaskTraits().WithPriority(TaskPriority::BACKGROUND).WithFileIO(),
|
| + GetTaskClosure(ThreadPriority::BACKGROUND));
|
| + scheduler_.PostTaskWithTraits(
|
| + FROM_HERE,
|
| + TaskTraits().WithPriority(TaskPriority::USER_VISIBLE).WithFileIO(),
|
| + GetTaskClosure(ThreadPriority::NORMAL));
|
| + scheduler_.PostTaskWithTraits(
|
| + FROM_HERE,
|
| + TaskTraits().WithPriority(TaskPriority::USER_BLOCKING).WithFileIO(),
|
| + GetTaskClosure(ThreadPriority::NORMAL));
|
| +
|
| + WaitUntilLastPostedTaskHasRun();
|
| + Shutdown();
|
| +
|
| + EXPECT_TRUE(ran_all_tasks_with_expected_priority());
|
| +}
|
| +
|
| +TEST_F(TaskSchedulerImplTest, CreateTaskRunnerWithTraits) {
|
| + scheduler_.CreateTaskRunnerWithTraits(
|
| + TaskTraits().WithPriority(TaskPriority::BACKGROUND),
|
| + ExecutionMode::PARALLEL)
|
| + ->PostTask(FROM_HERE, GetTaskClosure(ThreadPriority::BACKGROUND));
|
| + scheduler_.CreateTaskRunnerWithTraits(
|
| + TaskTraits().WithPriority(TaskPriority::USER_VISIBLE),
|
| + ExecutionMode::PARALLEL)
|
| + ->PostTask(FROM_HERE, GetTaskClosure(ThreadPriority::NORMAL));
|
| + scheduler_.CreateTaskRunnerWithTraits(
|
| + TaskTraits().WithPriority(TaskPriority::USER_BLOCKING),
|
| + ExecutionMode::PARALLEL)
|
| + ->PostTask(FROM_HERE, GetTaskClosure(ThreadPriority::NORMAL));
|
| +
|
| + scheduler_
|
| + .CreateTaskRunnerWithTraits(
|
| + TaskTraits().WithPriority(TaskPriority::BACKGROUND).WithFileIO(),
|
| + ExecutionMode::PARALLEL)
|
| + ->PostTask(FROM_HERE, GetTaskClosure(ThreadPriority::BACKGROUND));
|
| + scheduler_
|
| + .CreateTaskRunnerWithTraits(
|
| + TaskTraits().WithPriority(TaskPriority::USER_VISIBLE).WithFileIO(),
|
| + ExecutionMode::PARALLEL)
|
| + ->PostTask(FROM_HERE, GetTaskClosure(ThreadPriority::NORMAL));
|
| + scheduler_
|
| + .CreateTaskRunnerWithTraits(
|
| + TaskTraits().WithPriority(TaskPriority::USER_BLOCKING).WithFileIO(),
|
| + ExecutionMode::PARALLEL)
|
| + ->PostTask(FROM_HERE, GetTaskClosure(ThreadPriority::NORMAL));
|
| +
|
| + WaitUntilLastPostedTaskHasRun();
|
| + Shutdown();
|
| +
|
| + EXPECT_TRUE(ran_all_tasks_with_expected_priority());
|
| +}
|
| +
|
| +} // namespace task_scheduler
|
| +} // namespace base
|
|
|