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, |