Chromium Code Reviews| Index: base/threading/sequenced_worker_pool_unittest.cc |
| diff --git a/base/threading/sequenced_worker_pool_unittest.cc b/base/threading/sequenced_worker_pool_unittest.cc |
| index 18270a6f4f913bea794be5c70d4c710f8b291212..3a74dbffe56882f410430359c94a27e5a2c1ccd5 100644 |
| --- a/base/threading/sequenced_worker_pool_unittest.cc |
| +++ b/base/threading/sequenced_worker_pool_unittest.cc |
| @@ -8,6 +8,7 @@ |
| #include <algorithm> |
| #include <memory> |
| +#include <utility> |
| #include "base/bind.h" |
| #include "base/compiler_specific.h" |
| @@ -17,6 +18,9 @@ |
| #include "base/stl_util.h" |
| #include "base/synchronization/condition_variable.h" |
| #include "base/synchronization/lock.h" |
| +#include "base/task_scheduler/scheduler_worker_pool_params.h" |
| +#include "base/task_scheduler/task_scheduler.h" |
| +#include "base/task_scheduler/task_scheduler_impl.h" |
| #include "base/test/sequenced_task_runner_test_template.h" |
| #include "base/test/sequenced_worker_pool_owner.h" |
| #include "base/test/task_runner_test_template.h" |
| @@ -231,13 +235,46 @@ class TestTracker : public base::RefCountedThreadSafe<TestTracker> { |
| size_t started_events_; |
| }; |
| -class SequencedWorkerPoolTest : public testing::Test { |
| +enum class SequencedWorkerPoolRedirection { NONE, TO_TASK_SCHEDULER }; |
| + |
| +void StartRedirectionToTaskScheduler(size_t num_threads) { |
| + std::vector<SchedulerWorkerPoolParams> worker_pool_params; |
| + worker_pool_params.emplace_back( |
| + "SchedulerWorkerPoolName", ThreadPriority::NORMAL, |
| + SchedulerWorkerPoolParams::IORestriction::ALLOWED, num_threads, |
| + TimeDelta::Max()); |
| + TaskScheduler::CreateAndSetDefaultTaskScheduler( |
| + std::move(worker_pool_params), |
| + base::Bind([](const TaskTraits&) -> size_t { return 0U; })); |
| + SequencedWorkerPool::ResetRedirectToTaskSchedulerForProcessForTesting(); |
| + SequencedWorkerPool::RedirectToTaskSchedulerForProcess(); |
| +} |
| + |
| +void StopRedirectionToTaskScheduler() { |
| + SequencedWorkerPool::ResetRedirectToTaskSchedulerForProcessForTesting(); |
| + static_cast<internal::TaskSchedulerImpl*>(TaskScheduler::GetInstance()) |
| + ->JoinForTesting(); |
| + TaskScheduler::SetInstance(nullptr); |
| +} |
| + |
| +class SequencedWorkerPoolTest |
| + : public testing::TestWithParam<SequencedWorkerPoolRedirection> { |
| public: |
| SequencedWorkerPoolTest() |
| : tracker_(new TestTracker) { |
| ResetPool(); |
| } |
| + void SetUp() override { |
| + if (GetParam() == SequencedWorkerPoolRedirection::TO_TASK_SCHEDULER) |
| + StartRedirectionToTaskScheduler(kNumWorkerThreads); |
| + } |
| + |
| + void TearDown() override { |
| + if (GetParam() == SequencedWorkerPoolRedirection::TO_TASK_SCHEDULER) |
| + StopRedirectionToTaskScheduler(); |
| + } |
| + |
| const scoped_refptr<SequencedWorkerPool>& pool() { |
| return pool_owner_->pool(); |
| } |
| @@ -332,7 +369,7 @@ void HoldPoolReference(const scoped_refptr<base::SequencedWorkerPool>& pool, |
| } |
| // Tests that delayed tasks are deleted upon shutdown of the pool. |
| -TEST_F(SequencedWorkerPoolTest, DelayedTaskDuringShutdown) { |
| +TEST_P(SequencedWorkerPoolTest, DelayedTaskDuringShutdown) { |
| // Post something to verify the pool is started up. |
| EXPECT_TRUE(pool()->PostTask( |
| FROM_HERE, base::Bind(&TestTracker::FastTask, tracker(), 1))); |
| @@ -353,20 +390,26 @@ TEST_F(SequencedWorkerPoolTest, DelayedTaskDuringShutdown) { |
| ASSERT_EQ(1u, completion_sequence.size()); |
| ASSERT_EQ(1, completion_sequence[0]); |
| - // Shutdown is asynchronous, so use ResetPool() to block until the pool is |
| - // fully destroyed (and thus shut down). |
| - ResetPool(); |
| + if (GetParam() == SequencedWorkerPoolRedirection::NONE) { |
| + // Wait until the pool is fully shut down and destroyed. |
| + ResetPool(); |
| + } else { |
| + // Wait until the TaskScheduler is shut down. |
| + TaskScheduler::GetInstance()->Shutdown(); |
| + } |
| // Verify that we didn't block until the task was due. |
| ASSERT_LT(base::Time::Now() - posted_at, TestTimeouts::action_timeout()); |
| - // Verify that the deferred task has not only not run, but has also been |
| - // destroyed. |
| - ASSERT_TRUE(deleted_flag->data); |
| + // If tasks aren't redirected to the TaskScheduler, verify that the deferred |
| + // task has not only not run, but has also been destroyed. The TaskScheduler |
| + // doesn't destroy its tasks on shutdown. |
| + if (GetParam() == SequencedWorkerPoolRedirection::NONE) |
| + ASSERT_TRUE(deleted_flag->data); |
| } |
| // Tests that same-named tokens have the same ID. |
| -TEST_F(SequencedWorkerPoolTest, NamedTokens) { |
| +TEST_P(SequencedWorkerPoolTest, NamedTokens) { |
| const std::string name1("hello"); |
| SequencedWorkerPool::SequenceToken token1 = |
| pool()->GetNamedSequenceToken(name1); |
| @@ -394,7 +437,7 @@ TEST_F(SequencedWorkerPoolTest, NamedTokens) { |
| // Tests that posting a bunch of tasks (many more than the number of worker |
| // threads) runs them all. |
| -TEST_F(SequencedWorkerPoolTest, LotsOfTasks) { |
| +TEST_P(SequencedWorkerPoolTest, LotsOfTasks) { |
| pool()->PostWorkerTask(FROM_HERE, |
| base::Bind(&TestTracker::SlowTask, tracker(), 0)); |
| @@ -412,7 +455,7 @@ TEST_F(SequencedWorkerPoolTest, LotsOfTasks) { |
| // worker threads) to two pools simultaneously runs them all twice. |
| // This test is meant to shake out any concurrency issues between |
| // pools (like histograms). |
| -TEST_F(SequencedWorkerPoolTest, LotsOfTasksTwoPools) { |
| +TEST_P(SequencedWorkerPoolTest, LotsOfTasksTwoPools) { |
| SequencedWorkerPoolOwner pool1(kNumWorkerThreads, "test1"); |
| SequencedWorkerPoolOwner pool2(kNumWorkerThreads, "test2"); |
| @@ -435,7 +478,7 @@ TEST_F(SequencedWorkerPoolTest, LotsOfTasksTwoPools) { |
| // Test that tasks with the same sequence token are executed in order but don't |
| // affect other tasks. |
| -TEST_F(SequencedWorkerPoolTest, Sequence) { |
| +TEST_P(SequencedWorkerPoolTest, Sequence) { |
| // Fill all the worker threads except one. |
| const size_t kNumBackgroundTasks = kNumWorkerThreads - 1; |
| ThreadBlocker background_blocker; |
| @@ -496,7 +539,7 @@ TEST_F(SequencedWorkerPoolTest, Sequence) { |
| // Tests that any tasks posted after Shutdown are ignored. |
| // Disabled for flakiness. See http://crbug.com/166451. |
| -TEST_F(SequencedWorkerPoolTest, DISABLED_IgnoresAfterShutdown) { |
| +TEST_P(SequencedWorkerPoolTest, DISABLED_IgnoresAfterShutdown) { |
| // Start tasks to take all the threads and block them. |
| EnsureAllWorkersCreated(); |
| ThreadBlocker blocker; |
| @@ -543,7 +586,14 @@ TEST_F(SequencedWorkerPoolTest, DISABLED_IgnoresAfterShutdown) { |
| ASSERT_EQ(old_has_work_call_count, has_work_call_count()); |
| } |
| -TEST_F(SequencedWorkerPoolTest, AllowsAfterShutdown) { |
| +TEST_P(SequencedWorkerPoolTest, AllowsAfterShutdown) { |
| + // TaskScheduler supports posting new BLOCK_SHUTDOWN tasks during shutdown |
| + // (see TaskSchedulerTaskTrackerTest.WillPostAndRunDuringShutdown). However, |
| + // since it doesn't provide a way to run a callback from inside its Shutdown() |
| + // method, it would be hard to make this test work with redirection enabled. |
| + if (GetParam() == SequencedWorkerPoolRedirection::TO_TASK_SCHEDULER) |
| + return; |
| + |
| // Test that <n> new blocking tasks are allowed provided they're posted |
| // by a running tasks. |
| EnsureAllWorkersCreated(); |
| @@ -589,8 +639,15 @@ TEST_F(SequencedWorkerPoolTest, AllowsAfterShutdown) { |
| // Tests that blocking tasks can still be posted during shutdown, as long as |
| // the task is not being posted within the context of a running task. |
| -TEST_F(SequencedWorkerPoolTest, |
| +TEST_P(SequencedWorkerPoolTest, |
| AllowsBlockingTasksDuringShutdownOutsideOfRunningTask) { |
| + // TaskScheduler supports posting new BLOCK_SHUTDOWN tasks during shutdown |
| + // (see TaskSchedulerTaskTrackerTest.WillPostAndRunDuringShutdown). However, |
| + // since it doesn't provide a way to run a callback from inside its Shutdown() |
| + // method, it would be hard to make this test work with redirection enabled. |
| + if (GetParam() == SequencedWorkerPoolRedirection::TO_TASK_SCHEDULER) |
| + return; |
| + |
| EnsureAllWorkersCreated(); |
| ThreadBlocker blocker; |
| @@ -617,7 +674,13 @@ TEST_F(SequencedWorkerPoolTest, |
| // Tests that unrun tasks are discarded properly according to their shutdown |
| // mode. |
| -TEST_F(SequencedWorkerPoolTest, DiscardOnShutdown) { |
| +TEST_P(SequencedWorkerPoolTest, DiscardOnShutdown) { |
| + // Since TaskScheduler doesn't provide a way to run a callback from inside its |
| + // Shutdown() method, it would be hard to make this test work with redirection |
| + // enabled. |
| + if (GetParam() == SequencedWorkerPoolRedirection::TO_TASK_SCHEDULER) |
| + return; |
| + |
| // Start tasks to take all the threads and block them. |
| EnsureAllWorkersCreated(); |
| ThreadBlocker blocker; |
| @@ -661,7 +724,7 @@ TEST_F(SequencedWorkerPoolTest, DiscardOnShutdown) { |
| } |
| // Tests that CONTINUE_ON_SHUTDOWN tasks don't block shutdown. |
| -TEST_F(SequencedWorkerPoolTest, ContinueOnShutdown) { |
| +TEST_P(SequencedWorkerPoolTest, ContinueOnShutdown) { |
| scoped_refptr<TaskRunner> runner(pool()->GetTaskRunnerWithShutdownBehavior( |
| SequencedWorkerPool::CONTINUE_ON_SHUTDOWN)); |
| scoped_refptr<SequencedTaskRunner> sequenced_runner( |
| @@ -688,6 +751,8 @@ TEST_F(SequencedWorkerPoolTest, ContinueOnShutdown) { |
| // This should not block. If this test hangs, it means it failed. |
| pool()->Shutdown(); |
| + if (GetParam() == SequencedWorkerPoolRedirection::TO_TASK_SCHEDULER) |
| + TaskScheduler::GetInstance()->Shutdown(); |
|
robliao
2016/08/27 00:28:59
Does this mean that Shutdown doesn't quite work wh
fdoray
2016/08/29 15:07:11
Added comment to clarify.
|
| // The task should not have completed yet. |
| EXPECT_EQ(0u, tracker()->WaitUntilTasksComplete(0).size()); |
| @@ -709,7 +774,13 @@ TEST_F(SequencedWorkerPoolTest, ContinueOnShutdown) { |
| // Tests that SKIP_ON_SHUTDOWN tasks that have been started block Shutdown |
| // until they stop, but tasks not yet started do not. |
| -TEST_F(SequencedWorkerPoolTest, SkipOnShutdown) { |
| +TEST_P(SequencedWorkerPoolTest, SkipOnShutdown) { |
| + // Since TaskScheduler doesn't provide a way to run a callback from inside its |
| + // Shutdown() method, it would be hard to make this test work with redirection |
| + // enabled. |
| + if (GetParam() == SequencedWorkerPoolRedirection::TO_TASK_SCHEDULER) |
| + return; |
| + |
| // Start tasks to take all the threads and block them. |
| EnsureAllWorkersCreated(); |
| ThreadBlocker blocker; |
| @@ -760,7 +831,11 @@ TEST_F(SequencedWorkerPoolTest, SkipOnShutdown) { |
| // Ensure all worker threads are created, and then trigger a spurious |
| // work signal. This shouldn't cause any other work signals to be |
| // triggered. This is a regression test for http://crbug.com/117469. |
| -TEST_F(SequencedWorkerPoolTest, SpuriousWorkSignal) { |
| +TEST_P(SequencedWorkerPoolTest, SpuriousWorkSignal) { |
| + // This test doesn't apply when tasks are redirected to the TaskScheduler. |
| + if (GetParam() == SequencedWorkerPoolRedirection::TO_TASK_SCHEDULER) |
| + return; |
| + |
| EnsureAllWorkersCreated(); |
| int old_has_work_call_count = has_work_call_count(); |
| pool()->SignalHasWorkForTesting(); |
| @@ -773,19 +848,32 @@ void IsRunningOnCurrentThreadTask( |
| SequencedWorkerPool::SequenceToken test_positive_token, |
| SequencedWorkerPool::SequenceToken test_negative_token, |
| SequencedWorkerPool* pool, |
| - SequencedWorkerPool* unused_pool) { |
| + SequencedWorkerPool* unused_pool, |
| + SequencedWorkerPoolRedirection redirection) { |
| EXPECT_TRUE(pool->RunsTasksOnCurrentThread()); |
| EXPECT_TRUE(pool->IsRunningSequenceOnCurrentThread(test_positive_token)); |
| - EXPECT_FALSE(pool->IsRunningSequenceOnCurrentThread(test_negative_token)); |
| - EXPECT_FALSE(unused_pool->RunsTasksOnCurrentThread()); |
| - EXPECT_FALSE( |
| - unused_pool->IsRunningSequenceOnCurrentThread(test_positive_token)); |
| - EXPECT_FALSE( |
| - unused_pool->IsRunningSequenceOnCurrentThread(test_negative_token)); |
| + |
| + if (redirection == SequencedWorkerPoolRedirection::NONE) { |
| + // Tasks posted to different pools may run on the same threads when |
| + // redirection to the TaskScheduler is enabled. |
| + EXPECT_FALSE(unused_pool->RunsTasksOnCurrentThread()); |
| + |
| + // TODO(gab): When redirection to the TaskScheduler is enabled, |
| + // IsRunningSequenceOnCurrentThread() returns true if a task bound to the |
| + // provided sequence token *could* run on the current thread. Once the |
| + // method is fixed to return true only when called from a thread that is |
| + // *currently running* a task bound to the provided sequence token, move |
| + // these tests out of the conditional. |
| + EXPECT_FALSE(pool->IsRunningSequenceOnCurrentThread(test_negative_token)); |
| + EXPECT_FALSE( |
| + unused_pool->IsRunningSequenceOnCurrentThread(test_positive_token)); |
| + EXPECT_FALSE( |
| + unused_pool->IsRunningSequenceOnCurrentThread(test_negative_token)); |
| + } |
| } |
| // Verify correctness of the IsRunningSequenceOnCurrentThread method. |
| -TEST_F(SequencedWorkerPoolTest, IsRunningOnCurrentThread) { |
| +TEST_P(SequencedWorkerPoolTest, IsRunningOnCurrentThread) { |
| SequencedWorkerPool::SequenceToken token1 = pool()->GetSequenceToken(); |
| SequencedWorkerPool::SequenceToken token2 = pool()->GetSequenceToken(); |
| SequencedWorkerPool::SequenceToken unsequenced_token; |
| @@ -808,22 +896,28 @@ TEST_F(SequencedWorkerPoolTest, IsRunningOnCurrentThread) { |
| token1, FROM_HERE, |
| base::Bind(&IsRunningOnCurrentThreadTask, token1, token2, |
| base::RetainedRef(pool()), |
| - base::RetainedRef(unused_pool_owner.pool()))); |
| + base::RetainedRef(unused_pool_owner.pool()), GetParam())); |
| pool()->PostSequencedWorkerTask( |
| token2, FROM_HERE, |
| base::Bind(&IsRunningOnCurrentThreadTask, token2, unsequenced_token, |
| base::RetainedRef(pool()), |
| - base::RetainedRef(unused_pool_owner.pool()))); |
| + base::RetainedRef(unused_pool_owner.pool()), GetParam())); |
| pool()->PostWorkerTask( |
| - FROM_HERE, base::Bind(&IsRunningOnCurrentThreadTask, unsequenced_token, |
| - token1, base::RetainedRef(pool()), |
| - base::RetainedRef(unused_pool_owner.pool()))); |
| + FROM_HERE, |
| + base::Bind(&IsRunningOnCurrentThreadTask, unsequenced_token, token1, |
| + base::RetainedRef(pool()), |
| + base::RetainedRef(unused_pool_owner.pool()), GetParam())); |
| } |
| // Checks that tasks are destroyed in the right context during shutdown. If a |
| // task is destroyed while SequencedWorkerPool's global lock is held, |
| // SequencedWorkerPool might deadlock. |
| -TEST_F(SequencedWorkerPoolTest, AvoidsDeadlockOnShutdown) { |
| +TEST_P(SequencedWorkerPoolTest, AvoidsDeadlockOnShutdown) { |
| + // Since the TaskScheduler doesn't delete pending tasks on shutdown, this test |
| + // doesn't apply when tasks are redirected to the TaskScheduler. |
| + if (GetParam() == SequencedWorkerPoolRedirection::TO_TASK_SCHEDULER) |
| + return; |
| + |
| for (int i = 0; i < 4; ++i) { |
| scoped_refptr<DestructionDeadlockChecker> checker( |
| new DestructionDeadlockChecker(pool())); |
| @@ -837,8 +931,13 @@ TEST_F(SequencedWorkerPoolTest, AvoidsDeadlockOnShutdown) { |
| // Similar to the test AvoidsDeadlockOnShutdown, but there are now also |
| // sequenced, blocking tasks in the queue during shutdown. |
| -TEST_F(SequencedWorkerPoolTest, |
| +TEST_P(SequencedWorkerPoolTest, |
| AvoidsDeadlockOnShutdownWithSequencedBlockingTasks) { |
| + // Since the TaskScheduler doesn't delete pending tasks on shutdown, this test |
| + // doesn't apply when tasks are redirected to the TaskScheduler. |
| + if (GetParam() == SequencedWorkerPoolRedirection::TO_TASK_SCHEDULER) |
| + return; |
| + |
| const std::string sequence_token_name("name"); |
| for (int i = 0; i < 4; ++i) { |
| scoped_refptr<DestructionDeadlockChecker> checker( |
| @@ -856,7 +955,12 @@ TEST_F(SequencedWorkerPoolTest, |
| } |
| // Verify that FlushForTesting works as intended. |
| -TEST_F(SequencedWorkerPoolTest, FlushForTesting) { |
| +TEST_P(SequencedWorkerPoolTest, FlushForTesting) { |
| + // FlushForTesting cannot be called when tasks are redirected to the |
| + // TaskScheduler. |
| + if (GetParam() == SequencedWorkerPoolRedirection::TO_TASK_SCHEDULER) |
| + return; |
| + |
| // Should be fine to call on a new instance. |
| pool()->FlushForTesting(); |
| @@ -895,6 +999,15 @@ TEST_F(SequencedWorkerPoolTest, FlushForTesting) { |
| pool()->FlushForTesting(); |
| } |
| +INSTANTIATE_TEST_CASE_P( |
| + NoRedirection, |
| + SequencedWorkerPoolTest, |
| + ::testing::Values(SequencedWorkerPoolRedirection::NONE)); |
| +INSTANTIATE_TEST_CASE_P( |
| + RedirectionToTaskScheduler, |
| + SequencedWorkerPoolTest, |
| + ::testing::Values(SequencedWorkerPoolRedirection::TO_TASK_SCHEDULER)); |
| + |
| namespace { |
| void CheckWorkerPoolAndSequenceToken( |
| @@ -911,7 +1024,14 @@ void CheckWorkerPoolAndSequenceToken( |
| } // namespace |
| -TEST_F(SequencedWorkerPoolTest, GetWorkerPoolAndSequenceTokenForCurrentThread) { |
| +TEST_P(SequencedWorkerPoolTest, GetWorkerPoolAndSequenceTokenForCurrentThread) { |
| + // SequencedWorkerPool::GetSequenceTokenForCurrentThread() isn't supported |
| + // when tasks are redirected to the TaskScheduler. It will never be supported |
|
fdoray
2016/08/26 13:44:16
TODO(fdoray): Remove call from chromeos/accelerome
fdoray
2016/08/29 15:07:11
Done.
|
| + // since its only uses are in SequencedTaskRunnerHandle and |
| + // SequenceCheckerImpl which don't need it when redirection is enabled. |
| + if (GetParam() == SequencedWorkerPoolRedirection::TO_TASK_SCHEDULER) |
| + return; |
| + |
| EnsureAllWorkersCreated(); |
| // The current thread should have neither a worker pool nor a sequence token. |
| @@ -938,16 +1058,7 @@ TEST_F(SequencedWorkerPoolTest, GetWorkerPoolAndSequenceTokenForCurrentThread) { |
| pool()->FlushForTesting(); |
| } |
| -TEST_F(SequencedWorkerPoolTest, ShutsDownCleanWithContinueOnShutdown) { |
| - scoped_refptr<SequencedTaskRunner> task_runner = |
| - pool()->GetSequencedTaskRunnerWithShutdownBehavior( |
| - pool()->GetSequenceToken(), |
| - base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); |
| - |
| - // Upon test exit, should shut down without hanging. |
| - pool()->Shutdown(); |
| -} |
| - |
| +template <SequencedWorkerPoolRedirection redirection> |
| class SequencedWorkerPoolTaskRunnerTestDelegate { |
| public: |
| SequencedWorkerPoolTaskRunnerTestDelegate() {} |
| @@ -955,8 +1066,13 @@ class SequencedWorkerPoolTaskRunnerTestDelegate { |
| ~SequencedWorkerPoolTaskRunnerTestDelegate() {} |
| void StartTaskRunner() { |
| - pool_owner_.reset( |
| - new SequencedWorkerPoolOwner(10, "SequencedWorkerPoolTaskRunnerTest")); |
| + constexpr size_t kNumThreads = 10; |
|
robliao
2016/08/27 00:29:00
This might be more useful as a global. Is there a
fdoray
2016/08/29 15:07:11
Done.
|
| + |
| + pool_owner_.reset(new SequencedWorkerPoolOwner( |
| + kNumThreads, "SequencedWorkerPoolTaskRunnerTest")); |
| + |
| + if (redirection == SequencedWorkerPoolRedirection::TO_TASK_SCHEDULER) |
| + StartRedirectionToTaskScheduler(kNumThreads); |
| } |
| scoped_refptr<SequencedWorkerPool> GetTaskRunner() { |
| @@ -964,12 +1080,17 @@ class SequencedWorkerPoolTaskRunnerTestDelegate { |
| } |
| void StopTaskRunner() { |
| - // Make sure all tasks are run before shutting down. Delayed tasks are |
| - // not run, they're simply deleted. |
| - pool_owner_->pool()->FlushForTesting(); |
| - pool_owner_->pool()->Shutdown(); |
| - // Don't reset |pool_owner_| here, as the test may still hold a |
| - // reference to the pool. |
| + if (redirection == SequencedWorkerPoolRedirection::TO_TASK_SCHEDULER) { |
| + TaskScheduler::GetInstance()->Shutdown(); |
| + StopRedirectionToTaskScheduler(); |
| + } else { |
| + // Make sure all tasks are run before shutting down. Delayed tasks are |
| + // not run, they're simply deleted. |
| + pool_owner_->pool()->FlushForTesting(); |
| + pool_owner_->pool()->Shutdown(); |
|
robliao
2016/08/27 00:28:59
Add a comment why Start/Stop isn't symmetric (why
fdoray
2016/08/29 15:07:11
Changed the code to always shut down the pool as i
|
| + // Don't reset |pool_owner_| here, as the test may still hold a |
| + // reference to the pool. |
| + } |
| } |
| private: |
| @@ -977,12 +1098,26 @@ class SequencedWorkerPoolTaskRunnerTestDelegate { |
| std::unique_ptr<SequencedWorkerPoolOwner> pool_owner_; |
| }; |
| +INSTANTIATE_TYPED_TEST_CASE_P(SequencedWorkerPool, |
| + TaskRunnerTest, |
| + SequencedWorkerPoolTaskRunnerTestDelegate< |
| + SequencedWorkerPoolRedirection::NONE>); |
| +INSTANTIATE_TYPED_TEST_CASE_P(SequencedWorkerPool, |
| + TaskRunnerAffinityTest, |
| + SequencedWorkerPoolTaskRunnerTestDelegate< |
| + SequencedWorkerPoolRedirection::NONE>); |
| +INSTANTIATE_TYPED_TEST_CASE_P( |
| + SequencedWorkerPoolToTaskScheduler, |
| + TaskRunnerTest, |
| + SequencedWorkerPoolTaskRunnerTestDelegate< |
| + SequencedWorkerPoolRedirection::TO_TASK_SCHEDULER>); |
| INSTANTIATE_TYPED_TEST_CASE_P( |
| - SequencedWorkerPool, TaskRunnerTest, |
| - SequencedWorkerPoolTaskRunnerTestDelegate); |
| -INSTANTIATE_TYPED_TEST_CASE_P(SequencedWorkerPool, TaskRunnerAffinityTest, |
| - SequencedWorkerPoolTaskRunnerTestDelegate); |
| + SequencedWorkerPoolToTaskScheduler, |
| + TaskRunnerAffinityTest, |
| + SequencedWorkerPoolTaskRunnerTestDelegate< |
| + SequencedWorkerPoolRedirection::TO_TASK_SCHEDULER>); |
| +template <SequencedWorkerPoolRedirection redirection> |
| class SequencedWorkerPoolTaskRunnerWithShutdownBehaviorTestDelegate { |
| public: |
| SequencedWorkerPoolTaskRunnerWithShutdownBehaviorTestDelegate() {} |
| @@ -991,10 +1126,15 @@ class SequencedWorkerPoolTaskRunnerWithShutdownBehaviorTestDelegate { |
| } |
| void StartTaskRunner() { |
| - pool_owner_.reset( |
| - new SequencedWorkerPoolOwner(10, "SequencedWorkerPoolTaskRunnerTest")); |
| + constexpr size_t kNumThreads = 10; |
| + |
| + pool_owner_.reset(new SequencedWorkerPoolOwner( |
| + kNumThreads, "SequencedWorkerPoolSequencedTaskRunnerTest")); |
| task_runner_ = pool_owner_->pool()->GetTaskRunnerWithShutdownBehavior( |
| SequencedWorkerPool::BLOCK_SHUTDOWN); |
| + |
| + if (redirection == SequencedWorkerPoolRedirection::TO_TASK_SCHEDULER) |
| + StartRedirectionToTaskScheduler(kNumThreads); |
| } |
| scoped_refptr<TaskRunner> GetTaskRunner() { |
| @@ -1002,12 +1142,17 @@ class SequencedWorkerPoolTaskRunnerWithShutdownBehaviorTestDelegate { |
| } |
| void StopTaskRunner() { |
| - // Make sure all tasks are run before shutting down. Delayed tasks are |
| - // not run, they're simply deleted. |
| - pool_owner_->pool()->FlushForTesting(); |
| - pool_owner_->pool()->Shutdown(); |
| - // Don't reset |pool_owner_| here, as the test may still hold a |
| - // reference to the pool. |
| + if (redirection == SequencedWorkerPoolRedirection::TO_TASK_SCHEDULER) { |
| + TaskScheduler::GetInstance()->Shutdown(); |
| + StopRedirectionToTaskScheduler(); |
| + } else { |
| + // Make sure all tasks are run before shutting down. Delayed tasks are |
| + // not run, they're simply deleted. |
|
robliao
2016/08/27 00:28:59
Same here
fdoray
2016/08/29 15:07:11
Done.
|
| + pool_owner_->pool()->FlushForTesting(); |
| + pool_owner_->pool()->Shutdown(); |
| + // Don't reset |pool_owner_| here, as the test may still hold a |
| + // reference to the pool. |
| + } |
| } |
| private: |
| @@ -1017,12 +1162,27 @@ class SequencedWorkerPoolTaskRunnerWithShutdownBehaviorTestDelegate { |
| }; |
| INSTANTIATE_TYPED_TEST_CASE_P( |
| - SequencedWorkerPoolTaskRunner, TaskRunnerTest, |
| - SequencedWorkerPoolTaskRunnerWithShutdownBehaviorTestDelegate); |
| + SequencedWorkerPoolTaskRunner, |
| + TaskRunnerTest, |
| + SequencedWorkerPoolTaskRunnerWithShutdownBehaviorTestDelegate< |
| + SequencedWorkerPoolRedirection::NONE>); |
| INSTANTIATE_TYPED_TEST_CASE_P( |
| - SequencedWorkerPoolTaskRunner, TaskRunnerAffinityTest, |
| - SequencedWorkerPoolTaskRunnerWithShutdownBehaviorTestDelegate); |
| + SequencedWorkerPoolTaskRunner, |
| + TaskRunnerAffinityTest, |
| + SequencedWorkerPoolTaskRunnerWithShutdownBehaviorTestDelegate< |
| + SequencedWorkerPoolRedirection::NONE>); |
| +INSTANTIATE_TYPED_TEST_CASE_P( |
| + SequencedWorkerPoolTaskRunnerToTaskScheduler, |
| + TaskRunnerTest, |
| + SequencedWorkerPoolTaskRunnerWithShutdownBehaviorTestDelegate< |
| + SequencedWorkerPoolRedirection::TO_TASK_SCHEDULER>); |
| +INSTANTIATE_TYPED_TEST_CASE_P( |
| + SequencedWorkerPoolTaskRunnerToTaskScheduler, |
| + TaskRunnerAffinityTest, |
| + SequencedWorkerPoolTaskRunnerWithShutdownBehaviorTestDelegate< |
| + SequencedWorkerPoolRedirection::TO_TASK_SCHEDULER>); |
| +template <SequencedWorkerPoolRedirection redirection> |
| class SequencedWorkerPoolSequencedTaskRunnerTestDelegate { |
| public: |
| SequencedWorkerPoolSequencedTaskRunnerTestDelegate() {} |
| @@ -1031,10 +1191,15 @@ class SequencedWorkerPoolSequencedTaskRunnerTestDelegate { |
| } |
| void StartTaskRunner() { |
| + constexpr size_t kNumThreads = 10; |
| + |
| pool_owner_.reset(new SequencedWorkerPoolOwner( |
| - 10, "SequencedWorkerPoolSequencedTaskRunnerTest")); |
| + kNumThreads, "SequencedWorkerPoolSequencedTaskRunnerTest")); |
| task_runner_ = pool_owner_->pool()->GetSequencedTaskRunner( |
| pool_owner_->pool()->GetSequenceToken()); |
| + |
| + if (redirection == SequencedWorkerPoolRedirection::TO_TASK_SCHEDULER) |
| + StartRedirectionToTaskScheduler(kNumThreads); |
| } |
| scoped_refptr<SequencedTaskRunner> GetTaskRunner() { |
| @@ -1042,12 +1207,17 @@ class SequencedWorkerPoolSequencedTaskRunnerTestDelegate { |
| } |
| void StopTaskRunner() { |
| - // Make sure all tasks are run before shutting down. Delayed tasks are |
| - // not run, they're simply deleted. |
| - pool_owner_->pool()->FlushForTesting(); |
| - pool_owner_->pool()->Shutdown(); |
| - // Don't reset |pool_owner_| here, as the test may still hold a |
| - // reference to the pool. |
| + if (redirection == SequencedWorkerPoolRedirection::TO_TASK_SCHEDULER) { |
| + TaskScheduler::GetInstance()->Shutdown(); |
| + StopRedirectionToTaskScheduler(); |
| + } else { |
| + // Make sure all tasks are run before shutting down. Delayed tasks are |
| + // not run, they're simply deleted. |
| + pool_owner_->pool()->FlushForTesting(); |
| + pool_owner_->pool()->Shutdown(); |
| + // Don't reset |pool_owner_| here, as the test may still hold a |
| + // reference to the pool. |
| + } |
| } |
| private: |
| @@ -1057,19 +1227,37 @@ class SequencedWorkerPoolSequencedTaskRunnerTestDelegate { |
| }; |
| INSTANTIATE_TYPED_TEST_CASE_P( |
| - SequencedWorkerPoolSequencedTaskRunner, TaskRunnerTest, |
| - SequencedWorkerPoolSequencedTaskRunnerTestDelegate); |
| + SequencedWorkerPoolSequencedTaskRunner, |
| + TaskRunnerTest, |
| + SequencedWorkerPoolSequencedTaskRunnerTestDelegate< |
| + SequencedWorkerPoolRedirection::NONE>); |
| +INSTANTIATE_TYPED_TEST_CASE_P( |
| + SequencedWorkerPoolSequencedTaskRunner, |
| + TaskRunnerAffinityTest, |
| + SequencedWorkerPoolSequencedTaskRunnerTestDelegate< |
| + SequencedWorkerPoolRedirection::NONE>); |
| INSTANTIATE_TYPED_TEST_CASE_P( |
| - SequencedWorkerPoolSequencedTaskRunner, TaskRunnerAffinityTest, |
| - SequencedWorkerPoolSequencedTaskRunnerTestDelegate); |
| + SequencedWorkerPoolSequencedTaskRunnerToTaskScheduler, |
| + TaskRunnerAffinityTest, |
| + SequencedWorkerPoolSequencedTaskRunnerTestDelegate< |
| + SequencedWorkerPoolRedirection::TO_TASK_SCHEDULER>); |
| INSTANTIATE_TYPED_TEST_CASE_P( |
| - SequencedWorkerPoolSequencedTaskRunner, SequencedTaskRunnerTest, |
| - SequencedWorkerPoolSequencedTaskRunnerTestDelegate); |
| + SequencedWorkerPoolSequencedTaskRunner, |
| + SequencedTaskRunnerTest, |
| + SequencedWorkerPoolSequencedTaskRunnerTestDelegate< |
| + SequencedWorkerPoolRedirection::NONE>); |
| INSTANTIATE_TYPED_TEST_CASE_P( |
| SequencedWorkerPoolSequencedTaskRunner, |
| SequencedTaskRunnerDelayedTest, |
| - SequencedWorkerPoolSequencedTaskRunnerTestDelegate); |
| + SequencedWorkerPoolSequencedTaskRunnerTestDelegate< |
| + SequencedWorkerPoolRedirection::NONE>); |
| + |
| +// Don't run TaskRunnerTest, SequencedTaskRunnerTest and |
| +// SequencedTaskRunnerDelayedTest with sequenced tasks redirected to the |
| +// TaskScheduler. These tests post tasks with and without delays which result in |
| +// getting tasks with different shutdown behaviors in the same sequence. That |
| +// isn't supported by the TaskScheduler. |
| } // namespace |