Chromium Code Reviews| Index: base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc |
| diff --git a/base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc b/base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc |
| index 4415f5fd808adbd83124cac4686b062d8549e649..f620683bf58418d728d060f9b27ec7b449cebca2 100644 |
| --- a/base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc |
| +++ b/base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc |
| @@ -14,6 +14,7 @@ |
| #include "base/task_scheduler/scheduler_worker_pool_params.h" |
| #include "base/task_scheduler/task_tracker.h" |
| #include "base/task_scheduler/task_traits.h" |
| +#include "base/test/gtest_util.h" |
| #include "base/test/test_timeouts.h" |
| #include "base/threading/platform_thread.h" |
| #include "base/threading/simple_thread.h" |
| @@ -82,6 +83,10 @@ void CaptureThreadPriority(ThreadPriority* thread_priority) { |
| *thread_priority = PlatformThread::GetCurrentThreadPriority(); |
| } |
| +void CaptureThreadName(std::string* thread_name) { |
| + *thread_name = PlatformThread::GetName(); |
| +} |
| + |
| void ShouldNotRun() { |
| ADD_FAILURE() << "Ran a task that shouldn't run."; |
| } |
| @@ -92,13 +97,13 @@ TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, DifferentThreadsUsed) { |
| scoped_refptr<SingleThreadTaskRunner> task_runner_1 = |
| single_thread_task_runner_manager_ |
| ->CreateSingleThreadTaskRunnerWithTraits( |
| - "A", ThreadPriority::NORMAL, |
| - {TaskShutdownBehavior::BLOCK_SHUTDOWN}); |
| + "A", {TaskShutdownBehavior::BLOCK_SHUTDOWN}, |
| + SingleThreadTaskRunnerThreadMode::DEDICATED); |
| scoped_refptr<SingleThreadTaskRunner> task_runner_2 = |
| single_thread_task_runner_manager_ |
| ->CreateSingleThreadTaskRunnerWithTraits( |
| - "B", ThreadPriority::NORMAL, |
| - {TaskShutdownBehavior::BLOCK_SHUTDOWN}); |
| + "B", {TaskShutdownBehavior::BLOCK_SHUTDOWN}, |
| + SingleThreadTaskRunnerThreadMode::DEDICATED); |
| PlatformThreadRef thread_ref_1; |
| task_runner_1->PostTask(FROM_HERE, |
| @@ -114,19 +119,106 @@ TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, DifferentThreadsUsed) { |
| EXPECT_NE(thread_ref_1, thread_ref_2); |
| } |
| -TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, PrioritySetCorrectly) { |
| +TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, SameThreadUsed) { |
| + scoped_refptr<SingleThreadTaskRunner> task_runner_1 = |
| + single_thread_task_runner_manager_ |
| + ->CreateSingleThreadTaskRunnerWithTraits( |
| + "A", {TaskShutdownBehavior::BLOCK_SHUTDOWN}, |
| + SingleThreadTaskRunnerThreadMode::SHARED); |
| + scoped_refptr<SingleThreadTaskRunner> task_runner_2 = |
| + single_thread_task_runner_manager_ |
| + ->CreateSingleThreadTaskRunnerWithTraits( |
| + "B", {TaskShutdownBehavior::BLOCK_SHUTDOWN}, |
| + SingleThreadTaskRunnerThreadMode::SHARED); |
| + |
| + PlatformThreadRef thread_ref_1; |
| + task_runner_1->PostTask(FROM_HERE, |
| + BindOnce(&CaptureThreadRef, &thread_ref_1)); |
| + PlatformThreadRef thread_ref_2; |
| + task_runner_2->PostTask(FROM_HERE, |
| + BindOnce(&CaptureThreadRef, &thread_ref_2)); |
| + |
| + task_tracker_.Shutdown(); |
| + |
| + ASSERT_FALSE(thread_ref_1.is_null()); |
| + ASSERT_FALSE(thread_ref_2.is_null()); |
| + EXPECT_EQ(thread_ref_1, thread_ref_2); |
| +} |
| + |
| +TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, |
| + RunsTasksOnCurrentThread) { |
|
gab
2017/05/25 18:47:00
This test should work in both modes, parametrize a
robliao
2017/05/30 20:01:07
Since we do check the thread handle for the COM ca
|
| + scoped_refptr<SingleThreadTaskRunner> task_runner_1 = |
| + single_thread_task_runner_manager_ |
| + ->CreateSingleThreadTaskRunnerWithTraits( |
| + "A", {TaskShutdownBehavior::BLOCK_SHUTDOWN}, |
| + SingleThreadTaskRunnerThreadMode::DEDICATED); |
| + scoped_refptr<SingleThreadTaskRunner> task_runner_2 = |
| + single_thread_task_runner_manager_ |
| + ->CreateSingleThreadTaskRunnerWithTraits( |
| + "B", {TaskShutdownBehavior::BLOCK_SHUTDOWN}, |
| + SingleThreadTaskRunnerThreadMode::DEDICATED); |
| + |
| + EXPECT_FALSE(task_runner_1->RunsTasksOnCurrentThread()); |
| + EXPECT_FALSE(task_runner_2->RunsTasksOnCurrentThread()); |
| + |
| + task_runner_1->PostTask( |
| + FROM_HERE, BindOnce( |
| + [](scoped_refptr<SingleThreadTaskRunner> task_runner_1, |
| + scoped_refptr<SingleThreadTaskRunner> task_runner_2) { |
| + EXPECT_TRUE(task_runner_1->RunsTasksOnCurrentThread()); |
| + EXPECT_FALSE(task_runner_2->RunsTasksOnCurrentThread()); |
| + }, |
| + task_runner_1, task_runner_2)); |
| + |
| + task_runner_2->PostTask( |
| + FROM_HERE, BindOnce( |
| + [](scoped_refptr<SingleThreadTaskRunner> task_runner_1, |
| + scoped_refptr<SingleThreadTaskRunner> task_runner_2) { |
| + EXPECT_FALSE(task_runner_1->RunsTasksOnCurrentThread()); |
| + EXPECT_TRUE(task_runner_2->RunsTasksOnCurrentThread()); |
| + }, |
| + task_runner_1, task_runner_2)); |
| + |
| + task_tracker_.Shutdown(); |
| +} |
| + |
| +TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, |
| + SharedWithBaseSyncPrimitivesDCHECKs) { |
| + EXPECT_DCHECK_DEATH({ |
| + single_thread_task_runner_manager_->CreateSingleThreadTaskRunnerWithTraits( |
| + "A", {WithBaseSyncPrimitives()}, |
| + SingleThreadTaskRunnerThreadMode::SHARED); |
| + }); |
| +} |
| + |
| +namespace { |
| + |
| +class TaskSchedulerSingleThreadTaskRunnerManagerCommonTest |
| + : public TaskSchedulerSingleThreadTaskRunnerManagerTest, |
| + public ::testing::WithParamInterface<SingleThreadTaskRunnerThreadMode> { |
| + public: |
| + TaskSchedulerSingleThreadTaskRunnerManagerCommonTest() = default; |
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN( |
| + TaskSchedulerSingleThreadTaskRunnerManagerCommonTest); |
| +}; |
| + |
| +} // namespace |
| + |
| +TEST_P(TaskSchedulerSingleThreadTaskRunnerManagerCommonTest, |
| + PrioritySetCorrectly) { |
| // Why are events used here instead of the task tracker? |
| // Shutting down can cause priorities to get raised. This means we have to use |
| // events to determine when a task is run. |
| scoped_refptr<SingleThreadTaskRunner> task_runner_background = |
| single_thread_task_runner_manager_ |
| - ->CreateSingleThreadTaskRunnerWithTraits("Background", |
| - ThreadPriority::BACKGROUND, |
| - {TaskPriority::BACKGROUND}); |
| + ->CreateSingleThreadTaskRunnerWithTraits( |
| + "Background", {TaskPriority::BACKGROUND}, GetParam()); |
| scoped_refptr<SingleThreadTaskRunner> task_runner_normal = |
| single_thread_task_runner_manager_ |
| ->CreateSingleThreadTaskRunnerWithTraits( |
| - "Normal", ThreadPriority::NORMAL, {TaskPriority::USER_VISIBLE}); |
| + "Normal", {TaskPriority::USER_VISIBLE}, GetParam()); |
| ThreadPriority thread_priority_background; |
| task_runner_background->PostTask( |
| @@ -158,16 +250,62 @@ TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, PrioritySetCorrectly) { |
| EXPECT_EQ(ThreadPriority::NORMAL, thread_priority_normal); |
| } |
| -TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, PostTaskAfterShutdown) { |
| +TEST_P(TaskSchedulerSingleThreadTaskRunnerManagerCommonTest, ThreadNamesSet) { |
| + constexpr TaskTraits foo_traits = {TaskPriority::BACKGROUND, |
| + TaskShutdownBehavior::BLOCK_SHUTDOWN}; |
| + scoped_refptr<SingleThreadTaskRunner> foo_task_runner = |
| + single_thread_task_runner_manager_ |
| + ->CreateSingleThreadTaskRunnerWithTraits("MyName", foo_traits, |
| + GetParam()); |
| + std::string foo_captured_name; |
| + foo_task_runner->PostTask(FROM_HERE, |
| + BindOnce(&CaptureThreadName, &foo_captured_name)); |
| + |
| + constexpr TaskTraits user_blocking_traits = { |
| + TaskPriority::USER_BLOCKING, MayBlock(), |
| + TaskShutdownBehavior::BLOCK_SHUTDOWN}; |
| + scoped_refptr<SingleThreadTaskRunner> user_blocking_task_runner = |
| + single_thread_task_runner_manager_ |
| + ->CreateSingleThreadTaskRunnerWithTraits("A", user_blocking_traits, |
| + GetParam()); |
| + |
| + std::string user_blocking_captured_name; |
| + user_blocking_task_runner->PostTask( |
| + FROM_HERE, BindOnce(&CaptureThreadName, &user_blocking_captured_name)); |
| + |
| + task_tracker_.Shutdown(); |
| + |
| + EXPECT_NE(std::string::npos, foo_captured_name.find("MyName")); |
| + EXPECT_NE(std::string::npos, |
| + foo_captured_name.find( |
| + kEnvironmentParams[GetEnvironmentIndexForTraits(foo_traits)] |
| + .name_suffix)); |
| + EXPECT_NE( |
| + std::string::npos, |
| + user_blocking_captured_name.find( |
| + kEnvironmentParams[GetEnvironmentIndexForTraits(user_blocking_traits)] |
| + .name_suffix)); |
| + |
| + if (GetParam() == SingleThreadTaskRunnerThreadMode::DEDICATED) { |
| + EXPECT_EQ(std::string::npos, foo_captured_name.find("Shared")); |
| + EXPECT_EQ(std::string::npos, user_blocking_captured_name.find("Shared")); |
| + } else { |
| + EXPECT_NE(std::string::npos, foo_captured_name.find("Shared")); |
| + EXPECT_NE(std::string::npos, user_blocking_captured_name.find("Shared")); |
| + } |
| +} |
| + |
| +TEST_P(TaskSchedulerSingleThreadTaskRunnerManagerCommonTest, |
| + PostTaskAfterShutdown) { |
| auto task_runner = single_thread_task_runner_manager_ |
| ->CreateSingleThreadTaskRunnerWithTraits( |
| - "A", ThreadPriority::NORMAL, TaskTraits()); |
| + "A", TaskTraits(), GetParam()); |
| task_tracker_.Shutdown(); |
| EXPECT_FALSE(task_runner->PostTask(FROM_HERE, BindOnce(&ShouldNotRun))); |
| } |
| // Verify that a Task runs shortly after its delay expires. |
| -TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, PostDelayedTask) { |
| +TEST_P(TaskSchedulerSingleThreadTaskRunnerManagerCommonTest, PostDelayedTask) { |
| TimeTicks start_time = TimeTicks::Now(); |
| // Post a task with a short delay. |
| @@ -175,7 +313,7 @@ TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, PostDelayedTask) { |
| WaitableEvent::InitialState::NOT_SIGNALED); |
| auto task_runner = single_thread_task_runner_manager_ |
| ->CreateSingleThreadTaskRunnerWithTraits( |
| - "A", ThreadPriority::NORMAL, TaskTraits()); |
| + "A", TaskTraits(), GetParam()); |
| EXPECT_TRUE(task_runner->PostDelayedTask( |
| FROM_HERE, BindOnce(&WaitableEvent::Signal, Unretained(&task_ran)), |
| TestTimeouts::tiny_timeout())); |
| @@ -191,42 +329,11 @@ TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, PostDelayedTask) { |
| TimeDelta::FromMilliseconds(250) + TestTimeouts::tiny_timeout()); |
| } |
| -TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, |
| - RunsTasksOnCurrentThread) { |
|
gab
2017/05/25 18:47:01
Should stay here as a Common test, no?
robliao
2017/05/30 20:01:07
See above.
|
| - scoped_refptr<SingleThreadTaskRunner> task_runner_1 = |
| - single_thread_task_runner_manager_ |
| - ->CreateSingleThreadTaskRunnerWithTraits( |
| - "A", ThreadPriority::NORMAL, |
| - {TaskShutdownBehavior::BLOCK_SHUTDOWN}); |
| - scoped_refptr<SingleThreadTaskRunner> task_runner_2 = |
| - single_thread_task_runner_manager_ |
| - ->CreateSingleThreadTaskRunnerWithTraits( |
| - "B", ThreadPriority::NORMAL, |
| - {TaskShutdownBehavior::BLOCK_SHUTDOWN}); |
| - |
| - EXPECT_FALSE(task_runner_1->RunsTasksOnCurrentThread()); |
| - EXPECT_FALSE(task_runner_2->RunsTasksOnCurrentThread()); |
| - |
| - task_runner_1->PostTask( |
| - FROM_HERE, BindOnce( |
| - [](scoped_refptr<SingleThreadTaskRunner> task_runner_1, |
| - scoped_refptr<SingleThreadTaskRunner> task_runner_2) { |
| - EXPECT_TRUE(task_runner_1->RunsTasksOnCurrentThread()); |
| - EXPECT_FALSE(task_runner_2->RunsTasksOnCurrentThread()); |
| - }, |
| - task_runner_1, task_runner_2)); |
| - |
| - task_runner_2->PostTask( |
| - FROM_HERE, BindOnce( |
| - [](scoped_refptr<SingleThreadTaskRunner> task_runner_1, |
| - scoped_refptr<SingleThreadTaskRunner> task_runner_2) { |
| - EXPECT_FALSE(task_runner_1->RunsTasksOnCurrentThread()); |
| - EXPECT_TRUE(task_runner_2->RunsTasksOnCurrentThread()); |
| - }, |
| - task_runner_1, task_runner_2)); |
| - |
| - task_tracker_.Shutdown(); |
| -} |
| +INSTANTIATE_TEST_CASE_P( |
| + AllModes, |
| + TaskSchedulerSingleThreadTaskRunnerManagerCommonTest, |
| + ::testing::Values(SingleThreadTaskRunnerThreadMode::SHARED, |
| + SingleThreadTaskRunnerThreadMode::DEDICATED)); |
| namespace { |
| @@ -282,10 +389,10 @@ TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerJoinTest, ConcurrentJoin) { |
| WaitableEvent::InitialState::NOT_SIGNALED); |
| { |
| - auto task_runner = |
| - single_thread_task_runner_manager_ |
| - ->CreateSingleThreadTaskRunnerWithTraits( |
| - "A", ThreadPriority::NORMAL, {WithBaseSyncPrimitives()}); |
| + auto task_runner = single_thread_task_runner_manager_ |
| + ->CreateSingleThreadTaskRunnerWithTraits( |
| + "A", {WithBaseSyncPrimitives()}, |
| + SingleThreadTaskRunnerThreadMode::DEDICATED); |
| EXPECT_TRUE(task_runner->PostTask( |
| FROM_HERE, |
| BindOnce(&WaitableEvent::Signal, Unretained(&task_running)))); |
| @@ -312,10 +419,10 @@ TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerJoinTest, |
| WaitableEvent::InitialState::NOT_SIGNALED); |
| { |
| - auto task_runner = |
| - single_thread_task_runner_manager_ |
| - ->CreateSingleThreadTaskRunnerWithTraits( |
| - "A", ThreadPriority::NORMAL, {WithBaseSyncPrimitives()}); |
| + auto task_runner = single_thread_task_runner_manager_ |
| + ->CreateSingleThreadTaskRunnerWithTraits( |
| + "A", {WithBaseSyncPrimitives()}, |
| + SingleThreadTaskRunnerThreadMode::DEDICATED); |
| EXPECT_TRUE(task_runner->PostTask( |
| FROM_HERE, |
| BindOnce(&WaitableEvent::Signal, Unretained(&task_running)))); |
| @@ -335,10 +442,11 @@ TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerJoinTest, |
| #if defined(OS_WIN) |
| -TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, COMSTAInitialized) { |
| +TEST_P(TaskSchedulerSingleThreadTaskRunnerManagerCommonTest, |
| + COMSTAInitialized) { |
| scoped_refptr<SingleThreadTaskRunner> com_task_runner = |
| single_thread_task_runner_manager_->CreateCOMSTATaskRunnerWithTraits( |
| - "A", ThreadPriority::NORMAL, {TaskShutdownBehavior::BLOCK_SHUTDOWN}); |
| + "A", {TaskShutdownBehavior::BLOCK_SHUTDOWN}, GetParam()); |
| com_task_runner->PostTask( |
| FROM_HERE, BindOnce([]() { |
| @@ -352,6 +460,30 @@ TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, COMSTAInitialized) { |
| task_tracker_.Shutdown(); |
| } |
| +TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, COMSTASameThreadUsed) { |
|
gab
2017/05/25 18:47:01
Seems like this is testing an implementation detai
robliao
2017/05/30 20:01:07
This is currently the only reasonable way to verif
|
| + scoped_refptr<SingleThreadTaskRunner> task_runner_1 = |
| + single_thread_task_runner_manager_->CreateCOMSTATaskRunnerWithTraits( |
| + "A", {TaskShutdownBehavior::BLOCK_SHUTDOWN}, |
| + SingleThreadTaskRunnerThreadMode::SHARED); |
| + scoped_refptr<SingleThreadTaskRunner> task_runner_2 = |
| + single_thread_task_runner_manager_->CreateCOMSTATaskRunnerWithTraits( |
| + "B", {TaskShutdownBehavior::BLOCK_SHUTDOWN}, |
| + SingleThreadTaskRunnerThreadMode::SHARED); |
| + |
| + PlatformThreadRef thread_ref_1; |
| + task_runner_1->PostTask(FROM_HERE, |
| + BindOnce(&CaptureThreadRef, &thread_ref_1)); |
| + PlatformThreadRef thread_ref_2; |
| + task_runner_2->PostTask(FROM_HERE, |
| + BindOnce(&CaptureThreadRef, &thread_ref_2)); |
| + |
| + task_tracker_.Shutdown(); |
| + |
| + ASSERT_FALSE(thread_ref_1.is_null()); |
| + ASSERT_FALSE(thread_ref_2.is_null()); |
| + EXPECT_EQ(thread_ref_1, thread_ref_2); |
| +} |
| + |
| namespace { |
| const wchar_t* const kTestWindowClassName = |
| @@ -400,7 +532,8 @@ class TaskSchedulerSingleThreadTaskRunnerManagerTestWin |
| TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTestWin, PumpsMessages) { |
| scoped_refptr<SingleThreadTaskRunner> com_task_runner = |
| single_thread_task_runner_manager_->CreateCOMSTATaskRunnerWithTraits( |
| - "A", ThreadPriority::NORMAL, {TaskShutdownBehavior::BLOCK_SHUTDOWN}); |
| + "A", {TaskShutdownBehavior::BLOCK_SHUTDOWN}, |
| + SingleThreadTaskRunnerThreadMode::DEDICATED); |
|
gab
2017/05/25 18:47:01
Why isn't this also Common?
robliao
2017/05/30 20:01:07
This uses TaskSchedulerSingleThreadTaskRunnerTestW
|
| HWND hwnd = nullptr; |
| // HWNDs process messages on the thread that created them, so we have to |
| // create them within the context of the task runner to properly simulate a |
| @@ -451,8 +584,8 @@ TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerStartTest, |
| WaitableEvent task_running(WaitableEvent::ResetPolicy::MANUAL, |
| WaitableEvent::InitialState::NOT_SIGNALED); |
| single_thread_task_runner_manager_ |
| - ->CreateSingleThreadTaskRunnerWithTraits("A", ThreadPriority::NORMAL, |
| - TaskTraits()) |
| + ->CreateSingleThreadTaskRunnerWithTraits( |
| + "A", TaskTraits(), SingleThreadTaskRunnerThreadMode::DEDICATED) |
| ->PostTask( |
| FROM_HERE, |
| BindOnce( |