Index: base/task_scheduler/task_tracker_unittest.cc |
diff --git a/base/task_scheduler/task_tracker_unittest.cc b/base/task_scheduler/task_tracker_unittest.cc |
index 57dca1f3909b129724fb5fce288d5f8fc3e8c85e..3a1ff789442496a625cf00158b02c337bdcdfe16 100644 |
--- a/base/task_scheduler/task_tracker_unittest.cc |
+++ b/base/task_scheduler/task_tracker_unittest.cc |
@@ -7,6 +7,7 @@ |
#include <stdint.h> |
#include <memory> |
+#include <utility> |
#include <vector> |
#include "base/bind.h" |
@@ -77,7 +78,26 @@ class ThreadPostingAndRunningTask : public SimpleThread { |
tracker_(tracker), |
task_(task), |
action_(action), |
- expect_post_succeeds_(expect_post_succeeds) {} |
+ expect_post_succeeds_(expect_post_succeeds) { |
+ EXPECT_TRUE(task_); |
+ |
+ // Ownership of the Task is required to run it. |
+ EXPECT_NE(Action::RUN, action_); |
+ EXPECT_NE(Action::WILL_POST_AND_RUN, action_); |
+ } |
+ |
+ ThreadPostingAndRunningTask(TaskTracker* tracker, |
+ std::unique_ptr<Task> task, |
+ Action action, |
+ bool expect_post_succeeds) |
+ : SimpleThread("ThreadPostingAndRunningTask"), |
+ tracker_(tracker), |
+ task_(task.get()), |
+ owned_task_(std::move(task)), |
+ action_(action), |
+ expect_post_succeeds_(expect_post_succeeds) { |
+ EXPECT_TRUE(task_); |
+ } |
private: |
void Run() override { |
@@ -88,12 +108,14 @@ class ThreadPostingAndRunningTask : public SimpleThread { |
} |
if (post_succeeded && |
(action_ == Action::RUN || action_ == Action::WILL_POST_AND_RUN)) { |
- tracker_->RunTask(task_, SequenceToken::Create()); |
+ EXPECT_TRUE(owned_task_); |
+ tracker_->RunTask(std::move(owned_task_), SequenceToken::Create()); |
} |
} |
TaskTracker* const tracker_; |
Task* const task_; |
+ std::unique_ptr<Task> owned_task_; |
const Action action_; |
const bool expect_post_succeeds_; |
@@ -229,7 +251,7 @@ TEST_P(TaskSchedulerTaskTrackerTest, WillPostAndRunBeforeShutdown) { |
// Run the task. |
EXPECT_EQ(0U, NumTasksExecuted()); |
- EXPECT_TRUE(tracker_.RunTask(task.get(), SequenceToken::Create())); |
+ EXPECT_TRUE(tracker_.RunTask(std::move(task), SequenceToken::Create())); |
EXPECT_EQ(1U, NumTasksExecuted()); |
// Shutdown() shouldn't block. |
@@ -240,16 +262,17 @@ TEST_P(TaskSchedulerTaskTrackerTest, WillPostAndRunLongTaskBeforeShutdown) { |
// Create a task that will block until |event| is signaled. |
WaitableEvent event(WaitableEvent::ResetPolicy::AUTOMATIC, |
WaitableEvent::InitialState::NOT_SIGNALED); |
- Task blocked_task(FROM_HERE, Bind(&WaitableEvent::Wait, Unretained(&event)), |
- TaskTraits().WithShutdownBehavior(GetParam()), TimeDelta()); |
+ auto blocked_task = base::MakeUnique<Task>( |
+ FROM_HERE, Bind(&WaitableEvent::Wait, Unretained(&event)), |
+ TaskTraits().WithShutdownBehavior(GetParam()), TimeDelta()); |
// Inform |task_tracker_| that |blocked_task| will be posted. |
- EXPECT_TRUE(tracker_.WillPostTask(&blocked_task)); |
+ EXPECT_TRUE(tracker_.WillPostTask(blocked_task.get())); |
// Run the task asynchronouly. |
ThreadPostingAndRunningTask thread_running_task( |
- &tracker_, &blocked_task, ThreadPostingAndRunningTask::Action::RUN, |
- false); |
+ &tracker_, std::move(blocked_task), |
+ ThreadPostingAndRunningTask::Action::RUN, false); |
thread_running_task.Start(); |
// Initiate shutdown while the task is running. |
@@ -291,13 +314,14 @@ TEST_P(TaskSchedulerTaskTrackerTest, WillPostBeforeShutdownRunDuringShutdown) { |
// should be discarded. |
EXPECT_EQ(0U, NumTasksExecuted()); |
const bool should_run = GetParam() == TaskShutdownBehavior::BLOCK_SHUTDOWN; |
- EXPECT_EQ(should_run, tracker_.RunTask(task.get(), SequenceToken::Create())); |
+ EXPECT_EQ(should_run, |
+ tracker_.RunTask(std::move(task), SequenceToken::Create())); |
EXPECT_EQ(should_run ? 1U : 0U, NumTasksExecuted()); |
VERIFY_ASYNC_SHUTDOWN_IN_PROGRESS(); |
// Unblock shutdown by running the remaining BLOCK_SHUTDOWN task. |
- EXPECT_TRUE( |
- tracker_.RunTask(block_shutdown_task.get(), SequenceToken::Create())); |
+ EXPECT_TRUE(tracker_.RunTask(std::move(block_shutdown_task), |
+ SequenceToken::Create())); |
EXPECT_EQ(should_run ? 2U : 1U, NumTasksExecuted()); |
WAIT_FOR_ASYNC_SHUTDOWN_COMPLETED(); |
} |
@@ -315,7 +339,7 @@ TEST_P(TaskSchedulerTaskTrackerTest, WillPostBeforeShutdownRunAfterShutdown) { |
VERIFY_ASYNC_SHUTDOWN_IN_PROGRESS(); |
// Run the task to unblock shutdown. |
- EXPECT_TRUE(tracker_.RunTask(task.get(), SequenceToken::Create())); |
+ EXPECT_TRUE(tracker_.RunTask(std::move(task), SequenceToken::Create())); |
EXPECT_EQ(1U, NumTasksExecuted()); |
WAIT_FOR_ASYNC_SHUTDOWN_COMPLETED(); |
@@ -326,7 +350,7 @@ TEST_P(TaskSchedulerTaskTrackerTest, WillPostBeforeShutdownRunAfterShutdown) { |
WAIT_FOR_ASYNC_SHUTDOWN_COMPLETED(); |
// The task shouldn't be allowed to run after shutdown. |
- EXPECT_FALSE(tracker_.RunTask(task.get(), SequenceToken::Create())); |
+ EXPECT_FALSE(tracker_.RunTask(std::move(task), SequenceToken::Create())); |
EXPECT_EQ(0U, NumTasksExecuted()); |
} |
} |
@@ -349,7 +373,7 @@ TEST_P(TaskSchedulerTaskTrackerTest, WillPostAndRunDuringShutdown) { |
// Run the BLOCK_SHUTDOWN task. |
EXPECT_EQ(0U, NumTasksExecuted()); |
- EXPECT_TRUE(tracker_.RunTask(task.get(), SequenceToken::Create())); |
+ EXPECT_TRUE(tracker_.RunTask(std::move(task), SequenceToken::Create())); |
EXPECT_EQ(1U, NumTasksExecuted()); |
} else { |
// It shouldn't be allowed to post a non BLOCK_SHUTDOWN task. |
@@ -361,8 +385,8 @@ TEST_P(TaskSchedulerTaskTrackerTest, WillPostAndRunDuringShutdown) { |
// Unblock shutdown by running |block_shutdown_task|. |
VERIFY_ASYNC_SHUTDOWN_IN_PROGRESS(); |
- EXPECT_TRUE( |
- tracker_.RunTask(block_shutdown_task.get(), SequenceToken::Create())); |
+ EXPECT_TRUE(tracker_.RunTask(std::move(block_shutdown_task), |
+ SequenceToken::Create())); |
EXPECT_EQ(GetParam() == TaskShutdownBehavior::BLOCK_SHUTDOWN ? 2U : 1U, |
NumTasksExecuted()); |
WAIT_FOR_ASYNC_SHUTDOWN_COMPLETED(); |
@@ -400,10 +424,10 @@ TEST_P(TaskSchedulerTaskTrackerTest, SingletonAllowed) { |
// Running the task should fail iff the task isn't allowed to use singletons. |
if (can_use_singletons) { |
- EXPECT_TRUE(tracker.RunTask(task.get(), SequenceToken::Create())); |
+ EXPECT_TRUE(tracker.RunTask(std::move(task), SequenceToken::Create())); |
} else { |
EXPECT_DCHECK_DEATH( |
- { tracker.RunTask(task.get(), SequenceToken::Create()); }); |
+ { tracker.RunTask(std::move(task), SequenceToken::Create()); }); |
} |
} |
@@ -418,7 +442,8 @@ static void RunTaskRunnerHandleVerificationTask( |
EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet()); |
EXPECT_FALSE(SequencedTaskRunnerHandle::IsSet()); |
- EXPECT_TRUE(tracker->RunTask(verify_task.get(), SequenceToken::Create())); |
+ EXPECT_TRUE( |
+ tracker->RunTask(std::move(verify_task), SequenceToken::Create())); |
// TaskRunnerHandle state is reset outside of task's scope. |
EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet()); |
@@ -498,10 +523,10 @@ TEST_P(TaskSchedulerTaskTrackerTest, FlushPendingDelayedTask) { |
} |
TEST_P(TaskSchedulerTaskTrackerTest, FlushPendingUndelayedTask) { |
- const Task undelayed_task(FROM_HERE, Bind(&DoNothing), |
- TaskTraits().WithShutdownBehavior(GetParam()), |
- TimeDelta()); |
- tracker_.WillPostTask(&undelayed_task); |
+ auto undelayed_task = base::MakeUnique<Task>( |
+ FROM_HERE, Bind(&DoNothing), |
+ TaskTraits().WithShutdownBehavior(GetParam()), TimeDelta()); |
+ tracker_.WillPostTask(undelayed_task.get()); |
// Flush() shouldn't return before the undelayed task runs. |
CallFlushAsync(); |
@@ -509,15 +534,15 @@ TEST_P(TaskSchedulerTaskTrackerTest, FlushPendingUndelayedTask) { |
VERIFY_ASYNC_FLUSH_IN_PROGRESS(); |
// Flush() should return after the undelayed task runs. |
- tracker_.RunTask(&undelayed_task, SequenceToken::Create()); |
+ tracker_.RunTask(std::move(undelayed_task), SequenceToken::Create()); |
WAIT_FOR_ASYNC_FLUSH_RETURNED(); |
} |
TEST_P(TaskSchedulerTaskTrackerTest, PostTaskDuringFlush) { |
- const Task undelayed_task(FROM_HERE, Bind(&DoNothing), |
- TaskTraits().WithShutdownBehavior(GetParam()), |
- TimeDelta()); |
- tracker_.WillPostTask(&undelayed_task); |
+ auto undelayed_task = base::MakeUnique<Task>( |
+ FROM_HERE, Bind(&DoNothing), |
+ TaskTraits().WithShutdownBehavior(GetParam()), TimeDelta()); |
+ tracker_.WillPostTask(undelayed_task.get()); |
// Flush() shouldn't return before the undelayed task runs. |
CallFlushAsync(); |
@@ -525,33 +550,33 @@ TEST_P(TaskSchedulerTaskTrackerTest, PostTaskDuringFlush) { |
VERIFY_ASYNC_FLUSH_IN_PROGRESS(); |
// Simulate posting another undelayed task. |
- const Task other_undelayed_task(FROM_HERE, Bind(&DoNothing), |
- TaskTraits().WithShutdownBehavior(GetParam()), |
- TimeDelta()); |
- tracker_.WillPostTask(&other_undelayed_task); |
+ auto other_undelayed_task = base::MakeUnique<Task>( |
+ FROM_HERE, Bind(&DoNothing), |
+ TaskTraits().WithShutdownBehavior(GetParam()), TimeDelta()); |
+ tracker_.WillPostTask(other_undelayed_task.get()); |
// Run the first undelayed task. |
- tracker_.RunTask(&undelayed_task, SequenceToken::Create()); |
+ tracker_.RunTask(std::move(undelayed_task), SequenceToken::Create()); |
// Flush() shouldn't return before the second undelayed task runs. |
PlatformThread::Sleep(TestTimeouts::tiny_timeout()); |
VERIFY_ASYNC_FLUSH_IN_PROGRESS(); |
// Flush() should return after the second undelayed task runs. |
- tracker_.RunTask(&other_undelayed_task, SequenceToken::Create()); |
+ tracker_.RunTask(std::move(other_undelayed_task), SequenceToken::Create()); |
WAIT_FOR_ASYNC_FLUSH_RETURNED(); |
} |
TEST_P(TaskSchedulerTaskTrackerTest, RunDelayedTaskDuringFlush) { |
// Simulate posting a delayed and an undelayed task. |
- const Task delayed_task(FROM_HERE, Bind(&DoNothing), |
- TaskTraits().WithShutdownBehavior(GetParam()), |
- TimeDelta::FromDays(1)); |
- tracker_.WillPostTask(&delayed_task); |
- const Task undelayed_task(FROM_HERE, Bind(&DoNothing), |
- TaskTraits().WithShutdownBehavior(GetParam()), |
- TimeDelta()); |
- tracker_.WillPostTask(&undelayed_task); |
+ auto delayed_task = base::MakeUnique<Task>( |
+ FROM_HERE, Bind(&DoNothing), |
+ TaskTraits().WithShutdownBehavior(GetParam()), TimeDelta::FromDays(1)); |
+ tracker_.WillPostTask(delayed_task.get()); |
+ auto undelayed_task = base::MakeUnique<Task>( |
+ FROM_HERE, Bind(&DoNothing), |
+ TaskTraits().WithShutdownBehavior(GetParam()), TimeDelta()); |
+ tracker_.WillPostTask(undelayed_task.get()); |
// Flush() shouldn't return before the undelayed task runs. |
CallFlushAsync(); |
@@ -559,7 +584,7 @@ TEST_P(TaskSchedulerTaskTrackerTest, RunDelayedTaskDuringFlush) { |
VERIFY_ASYNC_FLUSH_IN_PROGRESS(); |
// Run the delayed task. |
- tracker_.RunTask(&delayed_task, SequenceToken::Create()); |
+ tracker_.RunTask(std::move(delayed_task), SequenceToken::Create()); |
// Flush() shouldn't return since there is still a pending undelayed |
// task. |
@@ -567,7 +592,7 @@ TEST_P(TaskSchedulerTaskTrackerTest, RunDelayedTaskDuringFlush) { |
VERIFY_ASYNC_FLUSH_IN_PROGRESS(); |
// Run the undelayed task. |
- tracker_.RunTask(&undelayed_task, SequenceToken::Create()); |
+ tracker_.RunTask(std::move(undelayed_task), SequenceToken::Create()); |
// Flush() should now return. |
WAIT_FOR_ASYNC_FLUSH_RETURNED(); |
@@ -578,10 +603,10 @@ TEST_P(TaskSchedulerTaskTrackerTest, FlushAfterShutdown) { |
return; |
// Simulate posting a task. |
- const Task undelayed_task(FROM_HERE, Bind(&DoNothing), |
- TaskTraits().WithShutdownBehavior(GetParam()), |
- TimeDelta()); |
- tracker_.WillPostTask(&undelayed_task); |
+ auto undelayed_task = base::MakeUnique<Task>( |
+ FROM_HERE, Bind(&DoNothing), |
+ TaskTraits().WithShutdownBehavior(GetParam()), TimeDelta()); |
+ tracker_.WillPostTask(undelayed_task.get()); |
// Shutdown() should return immediately since there are no pending |
// BLOCK_SHUTDOWN tasks. |
@@ -597,10 +622,10 @@ TEST_P(TaskSchedulerTaskTrackerTest, ShutdownDuringFlush) { |
return; |
// Simulate posting a task. |
- const Task undelayed_task(FROM_HERE, Bind(&DoNothing), |
- TaskTraits().WithShutdownBehavior(GetParam()), |
- TimeDelta()); |
- tracker_.WillPostTask(&undelayed_task); |
+ auto undelayed_task = base::MakeUnique<Task>( |
+ FROM_HERE, Bind(&DoNothing), |
+ TaskTraits().WithShutdownBehavior(GetParam()), TimeDelta()); |
+ tracker_.WillPostTask(undelayed_task.get()); |
// Flush() shouldn't return before the undelayed task runs or |
// shutdown completes. |
@@ -641,36 +666,33 @@ void ExpectSequenceToken(SequenceToken sequence_token) { |
// when a Task runs. |
TEST_F(TaskSchedulerTaskTrackerTest, CurrentSequenceToken) { |
const SequenceToken sequence_token(SequenceToken::Create()); |
- Task task(FROM_HERE, Bind(&ExpectSequenceToken, sequence_token), TaskTraits(), |
- TimeDelta()); |
- tracker_.WillPostTask(&task); |
+ auto task = base::MakeUnique<Task>(FROM_HERE, |
+ Bind(&ExpectSequenceToken, sequence_token), |
+ TaskTraits(), TimeDelta()); |
+ tracker_.WillPostTask(task.get()); |
EXPECT_FALSE(SequenceToken::GetForCurrentThread().IsValid()); |
- EXPECT_TRUE(tracker_.RunTask(&task, sequence_token)); |
+ EXPECT_TRUE(tracker_.RunTask(std::move(task), sequence_token)); |
EXPECT_FALSE(SequenceToken::GetForCurrentThread().IsValid()); |
} |
TEST_F(TaskSchedulerTaskTrackerTest, LoadWillPostAndRunBeforeShutdown) { |
// Post and run tasks asynchronously. |
- std::vector<std::unique_ptr<Task>> tasks; |
std::vector<std::unique_ptr<ThreadPostingAndRunningTask>> threads; |
for (size_t i = 0; i < kLoadTestNumIterations; ++i) { |
- tasks.push_back(CreateTask(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN)); |
threads.push_back(MakeUnique<ThreadPostingAndRunningTask>( |
- &tracker_, tasks.back().get(), |
+ &tracker_, CreateTask(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN), |
ThreadPostingAndRunningTask::Action::WILL_POST_AND_RUN, true)); |
threads.back()->Start(); |
- tasks.push_back(CreateTask(TaskShutdownBehavior::SKIP_ON_SHUTDOWN)); |
threads.push_back(MakeUnique<ThreadPostingAndRunningTask>( |
- &tracker_, tasks.back().get(), |
+ &tracker_, CreateTask(TaskShutdownBehavior::SKIP_ON_SHUTDOWN), |
ThreadPostingAndRunningTask::Action::WILL_POST_AND_RUN, true)); |
threads.back()->Start(); |
- tasks.push_back(CreateTask(TaskShutdownBehavior::BLOCK_SHUTDOWN)); |
threads.push_back(MakeUnique<ThreadPostingAndRunningTask>( |
- &tracker_, tasks.back().get(), |
+ &tracker_, CreateTask(TaskShutdownBehavior::BLOCK_SHUTDOWN), |
ThreadPostingAndRunningTask::Action::WILL_POST_AND_RUN, true)); |
threads.back()->Start(); |
} |
@@ -720,9 +742,9 @@ TEST_F(TaskSchedulerTaskTrackerTest, |
// Run tasks asynchronously. |
std::vector<std::unique_ptr<ThreadPostingAndRunningTask>> run_threads; |
- for (const auto& task : tasks) { |
+ for (auto& task : tasks) { |
run_threads.push_back(MakeUnique<ThreadPostingAndRunningTask>( |
- &tracker_, task.get(), ThreadPostingAndRunningTask::Action::RUN, |
+ &tracker_, std::move(task), ThreadPostingAndRunningTask::Action::RUN, |
false)); |
run_threads.back()->Start(); |
} |
@@ -747,25 +769,21 @@ TEST_F(TaskSchedulerTaskTrackerTest, LoadWillPostAndRunDuringShutdown) { |
CallShutdownAsync(); |
// Post and run tasks asynchronously. |
- std::vector<std::unique_ptr<Task>> tasks; |
std::vector<std::unique_ptr<ThreadPostingAndRunningTask>> threads; |
for (size_t i = 0; i < kLoadTestNumIterations; ++i) { |
- tasks.push_back(CreateTask(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN)); |
threads.push_back(MakeUnique<ThreadPostingAndRunningTask>( |
- &tracker_, tasks.back().get(), |
+ &tracker_, CreateTask(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN), |
ThreadPostingAndRunningTask::Action::WILL_POST_AND_RUN, false)); |
threads.back()->Start(); |
- tasks.push_back(CreateTask(TaskShutdownBehavior::SKIP_ON_SHUTDOWN)); |
threads.push_back(MakeUnique<ThreadPostingAndRunningTask>( |
- &tracker_, tasks.back().get(), |
+ &tracker_, CreateTask(TaskShutdownBehavior::SKIP_ON_SHUTDOWN), |
ThreadPostingAndRunningTask::Action::WILL_POST_AND_RUN, false)); |
threads.back()->Start(); |
- tasks.push_back(CreateTask(TaskShutdownBehavior::BLOCK_SHUTDOWN)); |
threads.push_back(MakeUnique<ThreadPostingAndRunningTask>( |
- &tracker_, tasks.back().get(), |
+ &tracker_, CreateTask(TaskShutdownBehavior::BLOCK_SHUTDOWN), |
ThreadPostingAndRunningTask::Action::WILL_POST_AND_RUN, true)); |
threads.back()->Start(); |
} |
@@ -780,8 +798,8 @@ TEST_F(TaskSchedulerTaskTrackerTest, LoadWillPostAndRunDuringShutdown) { |
VERIFY_ASYNC_SHUTDOWN_IN_PROGRESS(); |
// Unblock shutdown by running |block_shutdown_task|. |
- EXPECT_TRUE( |
- tracker_.RunTask(block_shutdown_task.get(), SequenceToken::Create())); |
+ EXPECT_TRUE(tracker_.RunTask(std::move(block_shutdown_task), |
+ SequenceToken::Create())); |
EXPECT_EQ(kLoadTestNumIterations + 1, NumTasksExecuted()); |
WAIT_FOR_ASYNC_SHUTDOWN_COMPLETED(); |
} |