Chromium Code Reviews| Index: base/task_scheduler/scheduler_worker_pool_impl_unittest.cc |
| diff --git a/base/task_scheduler/scheduler_worker_pool_impl_unittest.cc b/base/task_scheduler/scheduler_worker_pool_impl_unittest.cc |
| index 0f8475a69051fc7f56a1d5d3f3feb1d4a6a75f39..6b93dae036c0ef5f1aed8e2e9c5a32c256726ecf 100644 |
| --- a/base/task_scheduler/scheduler_worker_pool_impl_unittest.cc |
| +++ b/base/task_scheduler/scheduler_worker_pool_impl_unittest.cc |
| @@ -24,15 +24,17 @@ |
| #include "base/synchronization/lock.h" |
| #include "base/synchronization/waitable_event.h" |
| #include "base/task_runner.h" |
| -#include "base/task_scheduler/delayed_task_manager.h" |
| #include "base/task_scheduler/scheduler_worker_pool_params.h" |
| #include "base/task_scheduler/sequence.h" |
| #include "base/task_scheduler/sequence_sort_key.h" |
| #include "base/task_scheduler/task_tracker.h" |
| #include "base/task_scheduler/test_task_factory.h" |
| #include "base/test/gtest_util.h" |
| +#include "base/test/test_simple_task_runner.h" |
| +#include "base/test/test_timeouts.h" |
| #include "base/threading/platform_thread.h" |
| #include "base/threading/simple_thread.h" |
| +#include "base/threading/thread.h" |
| #include "base/threading/thread_checker_impl.h" |
| #include "base/threading/thread_local_storage.h" |
| #include "base/threading/thread_restrictions.h" |
| @@ -56,51 +58,40 @@ constexpr TimeDelta kExtraTimeToWaitForDetach = |
| using IORestriction = SchedulerWorkerPoolParams::IORestriction; |
| -class TestDelayedTaskManager : public DelayedTaskManager { |
| - public: |
| - TestDelayedTaskManager() : DelayedTaskManager(Bind(&DoNothing)) {} |
| - |
| - void SetCurrentTime(TimeTicks now) { now_ = now; } |
| - |
| - // DelayedTaskManager: |
| - TimeTicks Now() const override { return now_; } |
| - |
| - private: |
| - TimeTicks now_ = TimeTicks::Now(); |
| - |
| - DISALLOW_COPY_AND_ASSIGN(TestDelayedTaskManager); |
| -}; |
| - |
| class TaskSchedulerWorkerPoolImplTest |
| : public testing::TestWithParam<ExecutionMode> { |
| protected: |
| - TaskSchedulerWorkerPoolImplTest() = default; |
| + TaskSchedulerWorkerPoolImplTest() |
| + : service_thread_("TaskSchedulerServiceThread") {} |
| void SetUp() override { |
| InitializeWorkerPool(TimeDelta::Max(), kNumWorkersInWorkerPool); |
| } |
| void TearDown() override { |
| + service_thread_.Stop(); |
| worker_pool_->WaitForAllWorkersIdleForTesting(); |
| worker_pool_->JoinForTesting(); |
| } |
| void InitializeWorkerPool(const TimeDelta& suggested_reclaim_time, |
| size_t num_workers) { |
| + ASSERT_FALSE(worker_pool_); |
| + service_thread_.Start(); |
| worker_pool_ = SchedulerWorkerPoolImpl::Create( |
| SchedulerWorkerPoolParams("TestWorkerPool", ThreadPriority::NORMAL, |
| IORestriction::ALLOWED, num_workers, |
| suggested_reclaim_time), |
| Bind(&TaskSchedulerWorkerPoolImplTest::ReEnqueueSequenceCallback, |
| Unretained(this)), |
| - &task_tracker_, &delayed_task_manager_); |
| + &task_tracker_, service_thread_.task_runner()); |
| ASSERT_TRUE(worker_pool_); |
| } |
| std::unique_ptr<SchedulerWorkerPoolImpl> worker_pool_; |
| TaskTracker task_tracker_; |
| - TestDelayedTaskManager delayed_task_manager_; |
| + Thread service_thread_; |
| private: |
| void ReEnqueueSequenceCallback(scoped_refptr<Sequence> sequence) { |
| @@ -306,32 +297,38 @@ TEST_P(TaskSchedulerWorkerPoolImplTest, PostTaskAfterShutdown) { |
| EXPECT_FALSE(task_runner->PostTask(FROM_HERE, Bind(&ShouldNotRunCallback))); |
| } |
| -// Verify that a Task posted with a delay is added to the DelayedTaskManager and |
| -// doesn't run before its delay expires. |
| +// Verify that a Task doesn't run before its delay expires. |
| +TEST_P(TaskSchedulerWorkerPoolImplTest, PostDelayedTaskNeverRuns) { |
| + // Post a task with a very long delay. |
| + EXPECT_TRUE(worker_pool_->CreateTaskRunnerWithTraits(TaskTraits(), GetParam()) |
| + ->PostDelayedTask(FROM_HERE, Bind([]() { |
| + ADD_FAILURE() |
| + << "The delayed task should not run."; |
| + }), |
| + TimeDelta::FromDays(30))); |
| + |
| + // Wait a few milliseconds. The test will fail if the delayed task runs. |
| + PlatformThread::Sleep(TestTimeouts::tiny_timeout()); |
| +} |
| + |
| +// Verify that a Task runs shortly after its delay expires. |
| TEST_P(TaskSchedulerWorkerPoolImplTest, PostDelayedTask) { |
| - EXPECT_TRUE(delayed_task_manager_.GetDelayedRunTime().is_null()); |
| + TimeTicks start_time = TimeTicks::Now(); |
| - // Post a delayed task. |
| + // Post a task with a short delay. |
| WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL, |
| WaitableEvent::InitialState::NOT_SIGNALED); |
| EXPECT_TRUE(worker_pool_->CreateTaskRunnerWithTraits(TaskTraits(), GetParam()) |
| ->PostDelayedTask(FROM_HERE, Bind(&WaitableEvent::Signal, |
| Unretained(&task_ran)), |
| - TimeDelta::FromSeconds(10))); |
| - |
| - // The task should have been added to the DelayedTaskManager. |
| - EXPECT_FALSE(delayed_task_manager_.GetDelayedRunTime().is_null()); |
| + TestTimeouts::tiny_timeout())); |
| - // The task shouldn't run. |
| - EXPECT_FALSE(task_ran.IsSignaled()); |
| - |
| - // Fast-forward time and post tasks that are ripe for execution. |
| - delayed_task_manager_.SetCurrentTime( |
| - delayed_task_manager_.GetDelayedRunTime()); |
| - delayed_task_manager_.PostReadyTasks(); |
| - |
| - // The task should run. |
| + // Wait until the task runs. |
| task_ran.Wait(); |
| + |
| + // Expect the task to run less than 250 ms after its delay expires. |
| + EXPECT_LT(TimeTicks::Now() - start_time, |
| + TimeDelta::FromMilliseconds(250) + TestTimeouts::tiny_timeout()); |
| } |
| // Verify that the RunsTasksOnCurrentThread() method of a SEQUENCED TaskRunner |
| @@ -403,14 +400,15 @@ class TaskSchedulerWorkerPoolImplIORestrictionTest |
| TEST_P(TaskSchedulerWorkerPoolImplIORestrictionTest, IORestriction) { |
| TaskTracker task_tracker; |
| - DelayedTaskManager delayed_task_manager(Bind(&DoNothing)); |
| + scoped_refptr<TaskRunner> service_thread_task_runner( |
| + new TestSimpleTaskRunner); |
| auto worker_pool = SchedulerWorkerPoolImpl::Create( |
| SchedulerWorkerPoolParams("TestWorkerPoolWithParam", |
| ThreadPriority::NORMAL, GetParam(), 1U, |
| TimeDelta::Max()), |
| Bind(&NotReachedReEnqueueSequenceCallback), &task_tracker, |
| - &delayed_task_manager); |
| + std::move(service_thread_task_runner)); |
|
robliao
2016/10/12 20:55:45
Can this be done inline to remove the declaration
fdoray
2016/10/13 13:51:29
Done.
|
| ASSERT_TRUE(worker_pool); |
| WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL, |