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 |
index 04ddc6fdfd4da5b75d7fb8f72744d339872728af..b8d8fad8343808296bff8dd7acedba946bdf8e4e 100644 |
--- a/base/task_scheduler/task_scheduler_impl_unittest.cc |
+++ b/base/task_scheduler/task_scheduler_impl_unittest.cc |
@@ -178,9 +178,9 @@ std::vector<TraitsExecutionModePair> GetTraitsExecutionModePairs() { |
class TaskSchedulerImplTest |
: public testing::TestWithParam<TraitsExecutionModePair> { |
protected: |
- TaskSchedulerImplTest() = default; |
+ TaskSchedulerImplTest() : scheduler_("Test") {} |
- void SetUp() override { |
+ void StartTaskScheduler() { |
using StandbyThreadPolicy = SchedulerWorkerPoolParams::StandbyThreadPolicy; |
constexpr TimeDelta kSuggestedReclaimTime = TimeDelta::FromSeconds(30); |
@@ -189,22 +189,20 @@ class TaskSchedulerImplTest |
constexpr int kMaxNumForegroundThreads = 4; |
constexpr int kMaxNumForegroundBlockingThreads = 12; |
- scheduler_ = TaskSchedulerImpl::Create( |
- "Test", {{StandbyThreadPolicy::LAZY, kMaxNumBackgroundThreads, |
- kSuggestedReclaimTime}, |
- {StandbyThreadPolicy::LAZY, kMaxNumBackgroundBlockingThreads, |
- kSuggestedReclaimTime}, |
- {StandbyThreadPolicy::LAZY, kMaxNumForegroundThreads, |
- kSuggestedReclaimTime}, |
- {StandbyThreadPolicy::LAZY, kMaxNumForegroundBlockingThreads, |
- kSuggestedReclaimTime}}); |
- |
- ASSERT_TRUE(scheduler_); |
+ scheduler_.Start( |
+ {{StandbyThreadPolicy::LAZY, kMaxNumBackgroundThreads, |
+ kSuggestedReclaimTime}, |
+ {StandbyThreadPolicy::LAZY, kMaxNumBackgroundBlockingThreads, |
+ kSuggestedReclaimTime}, |
+ {StandbyThreadPolicy::LAZY, kMaxNumForegroundThreads, |
+ kSuggestedReclaimTime}, |
+ {StandbyThreadPolicy::LAZY, kMaxNumForegroundBlockingThreads, |
+ kSuggestedReclaimTime}}); |
} |
- void TearDown() override { scheduler_->JoinForTesting(); } |
+ void TearDown() override { scheduler_.JoinForTesting(); } |
- std::unique_ptr<TaskSchedulerImpl> scheduler_; |
+ TaskSchedulerImpl scheduler_; |
private: |
DISALLOW_COPY_AND_ASSIGN(TaskSchedulerImplTest); |
@@ -216,9 +214,10 @@ class TaskSchedulerImplTest |
// TaskTraits and no delay runs on a thread with the expected priority and I/O |
// restrictions. The ExecutionMode parameter is ignored by this test. |
TEST_P(TaskSchedulerImplTest, PostDelayedTaskWithTraitsNoDelay) { |
+ StartTaskScheduler(); |
WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL, |
WaitableEvent::InitialState::NOT_SIGNALED); |
- scheduler_->PostDelayedTaskWithTraits( |
+ scheduler_.PostDelayedTaskWithTraits( |
FROM_HERE, GetParam().traits, |
BindOnce(&VerifyTaskEnvironmentAndSignalEvent, GetParam().traits, |
Unretained(&task_ran)), |
@@ -231,9 +230,10 @@ TEST_P(TaskSchedulerImplTest, PostDelayedTaskWithTraitsNoDelay) { |
// and I/O restrictions after the delay expires. The ExecutionMode parameter is |
// ignored by this test. |
TEST_P(TaskSchedulerImplTest, PostDelayedTaskWithTraitsWithDelay) { |
+ StartTaskScheduler(); |
WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL, |
WaitableEvent::InitialState::NOT_SIGNALED); |
- scheduler_->PostDelayedTaskWithTraits( |
+ scheduler_.PostDelayedTaskWithTraits( |
FROM_HERE, GetParam().traits, |
BindOnce(&VerifyTimeAndTaskEnvironmentAndSignalEvent, GetParam().traits, |
TimeTicks::Now() + TestTimeouts::tiny_timeout(), |
@@ -246,9 +246,10 @@ TEST_P(TaskSchedulerImplTest, PostDelayedTaskWithTraitsWithDelay) { |
// ExecutionMode run on a thread with the expected priority and I/O restrictions |
// and respect the characteristics of their ExecutionMode. |
TEST_P(TaskSchedulerImplTest, PostTasksViaTaskRunner) { |
+ StartTaskScheduler(); |
test::TestTaskFactory factory( |
- CreateTaskRunnerWithTraitsAndExecutionMode( |
- scheduler_.get(), GetParam().traits, GetParam().execution_mode), |
+ CreateTaskRunnerWithTraitsAndExecutionMode(&scheduler_, GetParam().traits, |
+ GetParam().execution_mode), |
GetParam().execution_mode); |
EXPECT_FALSE(factory.task_runner()->RunsTasksOnCurrentThread()); |
@@ -261,6 +262,75 @@ TEST_P(TaskSchedulerImplTest, PostTasksViaTaskRunner) { |
factory.WaitForAllTasksToRun(); |
} |
+// Verifies that a task posted via PostDelayedTaskWithTraits without a delay |
+// doesn't run before Start() is called. |
+TEST_P(TaskSchedulerImplTest, PostDelayedTaskWithTraitsNoDelayBeforeStart) { |
+ WaitableEvent task_running(WaitableEvent::ResetPolicy::MANUAL, |
+ WaitableEvent::InitialState::NOT_SIGNALED); |
+ scheduler_.PostDelayedTaskWithTraits( |
+ FROM_HERE, GetParam().traits, |
+ BindOnce(&VerifyTaskEnvironmentAndSignalEvent, GetParam().traits, |
+ Unretained(&task_running)), |
+ TimeDelta()); |
+ |
+ // Wait a little bit to make sure that the task isn't scheduled before |
+ // Start(). Note: This test won't catch a case where the task runs just after |
+ // the check and before Start(). However, we expect the test to be flaky if |
+ // the tested code allows that to happen. |
+ PlatformThread::Sleep(TestTimeouts::tiny_timeout()); |
+ EXPECT_FALSE(task_running.IsSignaled()); |
+ |
+ StartTaskScheduler(); |
+ task_running.Wait(); |
+} |
+ |
+// Verifies that a task posted via PostDelayedTaskWithTraits with a delay |
+// doesn't run before Start() is called. |
+TEST_P(TaskSchedulerImplTest, PostDelayedTaskWithTraitsWithDelayBeforeStart) { |
+ WaitableEvent task_running(WaitableEvent::ResetPolicy::MANUAL, |
+ WaitableEvent::InitialState::NOT_SIGNALED); |
+ scheduler_.PostDelayedTaskWithTraits( |
+ FROM_HERE, GetParam().traits, |
+ BindOnce(&VerifyTimeAndTaskEnvironmentAndSignalEvent, GetParam().traits, |
+ TimeTicks::Now() + TestTimeouts::tiny_timeout(), |
+ Unretained(&task_running)), |
+ TestTimeouts::tiny_timeout()); |
+ |
+ // Wait a little bit to make sure that the task isn't scheduled before |
+ // Start(). Note: This test won't catch a case where the task runs just after |
+ // the check and before Start(). However, we expect the test to be flaky if |
+ // the tested code allows that to happen. |
+ PlatformThread::Sleep(TestTimeouts::tiny_timeout()); |
+ EXPECT_FALSE(task_running.IsSignaled()); |
+ |
+ StartTaskScheduler(); |
+ task_running.Wait(); |
+} |
+ |
+// Verifies that a task posted via a TaskRunner doesn't run before Start() is |
+// called. |
+TEST_P(TaskSchedulerImplTest, PostTaskViaTaskRunnerBeforeStart) { |
+ WaitableEvent task_running(WaitableEvent::ResetPolicy::MANUAL, |
+ WaitableEvent::InitialState::NOT_SIGNALED); |
+ CreateTaskRunnerWithTraitsAndExecutionMode(&scheduler_, GetParam().traits, |
+ GetParam().execution_mode) |
+ ->PostTask(FROM_HERE, |
+ BindOnce(&VerifyTaskEnvironmentAndSignalEvent, |
+ GetParam().traits, Unretained(&task_running))); |
+ |
+ // Wait a little bit to make sure that the task isn't scheduled before |
+ // Start(). Note: This test won't catch a case where the task runs just after |
+ // the check and before Start(). However, we expect the test to be flaky if |
+ // the tested code allows that to happen. |
+ PlatformThread::Sleep(TestTimeouts::tiny_timeout()); |
+ EXPECT_FALSE(task_running.IsSignaled()); |
+ |
+ StartTaskScheduler(); |
+ |
+ // This should not hang if the task is scheduled after Start(). |
+ task_running.Wait(); |
+} |
+ |
INSTANTIATE_TEST_CASE_P(OneTraitsExecutionModePair, |
TaskSchedulerImplTest, |
::testing::ValuesIn(GetTraitsExecutionModePairs())); |
@@ -270,11 +340,12 @@ INSTANTIATE_TEST_CASE_P(OneTraitsExecutionModePair, |
// the expected priority and I/O restrictions and respects the characteristics |
// of its ExecutionMode. |
TEST_F(TaskSchedulerImplTest, MultipleTraitsExecutionModePairs) { |
+ StartTaskScheduler(); |
std::vector<std::unique_ptr<ThreadPostingTasks>> threads_posting_tasks; |
for (const auto& traits_execution_mode_pair : GetTraitsExecutionModePairs()) { |
- threads_posting_tasks.push_back(WrapUnique(new ThreadPostingTasks( |
- scheduler_.get(), traits_execution_mode_pair.traits, |
- traits_execution_mode_pair.execution_mode))); |
+ threads_posting_tasks.push_back(WrapUnique( |
+ new ThreadPostingTasks(&scheduler_, traits_execution_mode_pair.traits, |
+ traits_execution_mode_pair.execution_mode))); |
threads_posting_tasks.back()->Start(); |
} |
@@ -285,32 +356,34 @@ TEST_F(TaskSchedulerImplTest, MultipleTraitsExecutionModePairs) { |
} |
TEST_F(TaskSchedulerImplTest, GetMaxConcurrentTasksWithTraitsDeprecated) { |
- EXPECT_EQ(1, scheduler_->GetMaxConcurrentTasksWithTraitsDeprecated( |
+ StartTaskScheduler(); |
+ EXPECT_EQ(1, scheduler_.GetMaxConcurrentTasksWithTraitsDeprecated( |
TaskTraits().WithPriority(TaskPriority::BACKGROUND))); |
EXPECT_EQ( |
- 3, scheduler_->GetMaxConcurrentTasksWithTraitsDeprecated( |
+ 3, scheduler_.GetMaxConcurrentTasksWithTraitsDeprecated( |
TaskTraits().WithPriority(TaskPriority::BACKGROUND).MayBlock())); |
- EXPECT_EQ(4, scheduler_->GetMaxConcurrentTasksWithTraitsDeprecated( |
+ EXPECT_EQ(4, scheduler_.GetMaxConcurrentTasksWithTraitsDeprecated( |
TaskTraits().WithPriority(TaskPriority::USER_VISIBLE))); |
EXPECT_EQ( |
12, |
- scheduler_->GetMaxConcurrentTasksWithTraitsDeprecated( |
+ scheduler_.GetMaxConcurrentTasksWithTraitsDeprecated( |
TaskTraits().WithPriority(TaskPriority::USER_VISIBLE).MayBlock())); |
- EXPECT_EQ(4, scheduler_->GetMaxConcurrentTasksWithTraitsDeprecated( |
+ EXPECT_EQ(4, scheduler_.GetMaxConcurrentTasksWithTraitsDeprecated( |
TaskTraits().WithPriority(TaskPriority::USER_BLOCKING))); |
EXPECT_EQ( |
12, |
- scheduler_->GetMaxConcurrentTasksWithTraitsDeprecated( |
+ scheduler_.GetMaxConcurrentTasksWithTraitsDeprecated( |
TaskTraits().WithPriority(TaskPriority::USER_BLOCKING).MayBlock())); |
} |
// Verify that the RunsTasksOnCurrentThread() method of a SequencedTaskRunner |
// returns false when called from a task that isn't part of the sequence. |
TEST_F(TaskSchedulerImplTest, SequencedRunsTasksOnCurrentThread) { |
+ StartTaskScheduler(); |
auto single_thread_task_runner = |
- scheduler_->CreateSingleThreadTaskRunnerWithTraits(TaskTraits()); |
+ scheduler_.CreateSingleThreadTaskRunnerWithTraits(TaskTraits()); |
auto sequenced_task_runner = |
- scheduler_->CreateSequencedTaskRunnerWithTraits(TaskTraits()); |
+ scheduler_.CreateSequencedTaskRunnerWithTraits(TaskTraits()); |
WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL, |
WaitableEvent::InitialState::NOT_SIGNALED); |
@@ -329,10 +402,11 @@ TEST_F(TaskSchedulerImplTest, SequencedRunsTasksOnCurrentThread) { |
// Verify that the RunsTasksOnCurrentThread() method of a SingleThreadTaskRunner |
// returns false when called from a task that isn't part of the sequence. |
TEST_F(TaskSchedulerImplTest, SingleThreadRunsTasksOnCurrentThread) { |
+ StartTaskScheduler(); |
auto sequenced_task_runner = |
- scheduler_->CreateSequencedTaskRunnerWithTraits(TaskTraits()); |
+ scheduler_.CreateSequencedTaskRunnerWithTraits(TaskTraits()); |
auto single_thread_task_runner = |
- scheduler_->CreateSingleThreadTaskRunnerWithTraits(TaskTraits()); |
+ scheduler_.CreateSingleThreadTaskRunnerWithTraits(TaskTraits()); |
WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL, |
WaitableEvent::InitialState::NOT_SIGNALED); |
@@ -350,8 +424,9 @@ TEST_F(TaskSchedulerImplTest, SingleThreadRunsTasksOnCurrentThread) { |
#if defined(OS_WIN) |
TEST_F(TaskSchedulerImplTest, COMSTATaskRunnersRunWithCOMSTA) { |
+ StartTaskScheduler(); |
auto com_sta_task_runner = |
- scheduler_->CreateCOMSTATaskRunnerWithTraits(TaskTraits()); |
+ scheduler_.CreateCOMSTATaskRunnerWithTraits(TaskTraits()); |
WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL, |
WaitableEvent::InitialState::NOT_SIGNALED); |