Index: base/task_scheduler/scheduler_worker_unittest.cc |
diff --git a/base/task_scheduler/scheduler_worker_unittest.cc b/base/task_scheduler/scheduler_worker_unittest.cc |
index 0d29bcd16c5bd46215e41eb2e9004fbe6db0267c..22847580e328d163ef93b3d0d33adebcc3f91156 100644 |
--- a/base/task_scheduler/scheduler_worker_unittest.cc |
+++ b/base/task_scheduler/scheduler_worker_unittest.cc |
@@ -41,8 +41,7 @@ class SchedulerWorkerDefaultDelegate : public SchedulerWorker::Delegate { |
SchedulerWorkerDefaultDelegate() = default; |
// SchedulerWorker::Delegate: |
- void OnMainEntry(SchedulerWorker* worker, |
- const TimeDelta& detach_duration) override {} |
+ void OnMainEntry(SchedulerWorker* worker) override {} |
scoped_refptr<Sequence> GetWork(SchedulerWorker* worker) override { |
return nullptr; |
} |
@@ -55,6 +54,7 @@ class SchedulerWorkerDefaultDelegate : public SchedulerWorker::Delegate { |
} |
TimeDelta GetSleepTimeout() override { return TimeDelta::Max(); } |
bool CanDetach(SchedulerWorker* worker) override { return false; } |
+ void OnDetach() override { ADD_FAILURE() << "Unexpected call to OnDetach()"; } |
private: |
DISALLOW_COPY_AND_ASSIGN(SchedulerWorkerDefaultDelegate); |
@@ -131,8 +131,7 @@ class TaskSchedulerWorkerTest : public testing::TestWithParam<size_t> { |
} |
// SchedulerWorker::Delegate: |
- void OnMainEntry(SchedulerWorker* worker, |
- const TimeDelta& detach_duration) override { |
+ void OnMainEntry(SchedulerWorker* worker) override { |
outer_->worker_set_.Wait(); |
EXPECT_EQ(outer_->worker_.get(), worker); |
EXPECT_FALSE(IsCallToDidRunTaskWithPriorityExpected()); |
@@ -363,15 +362,16 @@ class ControllableDetachDelegate : public SchedulerWorkerDefaultDelegate { |
work_processed_(WaitableEvent::ResetPolicy::MANUAL, |
WaitableEvent::InitialState::NOT_SIGNALED), |
detach_requested_(WaitableEvent::ResetPolicy::MANUAL, |
- WaitableEvent::InitialState::NOT_SIGNALED) { |
+ WaitableEvent::InitialState::NOT_SIGNALED), |
+ detached_(WaitableEvent::ResetPolicy::MANUAL, |
+ WaitableEvent::InitialState::NOT_SIGNALED) { |
EXPECT_TRUE(task_tracker_); |
} |
~ControllableDetachDelegate() override = default; |
// SchedulerWorker::Delegate: |
- MOCK_METHOD2(OnMainEntry, |
- void(SchedulerWorker* worker, const TimeDelta& detach_duration)); |
+ MOCK_METHOD1(OnMainEntry, void(SchedulerWorker* worker)); |
scoped_refptr<Sequence> GetWork(SchedulerWorker* worker) |
override { |
@@ -398,6 +398,12 @@ class ControllableDetachDelegate : public SchedulerWorkerDefaultDelegate { |
return can_detach_; |
} |
+ void OnDetach() override { |
+ EXPECT_TRUE(can_detach_); |
+ EXPECT_TRUE(detach_requested_.IsSignaled()); |
+ detached_.Signal(); |
+ } |
+ |
void WaitForWorkToRun() { |
work_processed_.Wait(); |
} |
@@ -406,6 +412,8 @@ class ControllableDetachDelegate : public SchedulerWorkerDefaultDelegate { |
detach_requested_.Wait(); |
} |
+ void WaitForDetach() { detached_.Wait(); } |
+ |
void ResetState() { |
work_requested_ = false; |
work_processed_.Reset(); |
@@ -420,6 +428,7 @@ class ControllableDetachDelegate : public SchedulerWorkerDefaultDelegate { |
bool can_detach_ = false; |
WaitableEvent work_processed_; |
WaitableEvent detach_requested_; |
+ WaitableEvent detached_; |
DISALLOW_COPY_AND_ASSIGN(ControllableDetachDelegate); |
}; |
@@ -432,7 +441,7 @@ TEST(TaskSchedulerWorkerTest, WorkerDetaches) { |
ControllableDetachDelegate* delegate = |
new StrictMock<ControllableDetachDelegate>(&task_tracker); |
delegate->set_can_detach(true); |
- EXPECT_CALL(*delegate, OnMainEntry(_, TimeDelta::Max())); |
+ EXPECT_CALL(*delegate, OnMainEntry(_)); |
std::unique_ptr<SchedulerWorker> worker = |
SchedulerWorker::Create( |
ThreadPriority::NORMAL, WrapUnique(delegate), &task_tracker, |
@@ -441,8 +450,7 @@ TEST(TaskSchedulerWorkerTest, WorkerDetaches) { |
delegate->WaitForWorkToRun(); |
Mock::VerifyAndClear(delegate); |
delegate->WaitForDetachRequest(); |
- // Sleep to give a chance for the detach to happen. A yield is too short. |
- PlatformThread::Sleep(TimeDelta::FromMilliseconds(50)); |
+ delegate->WaitForDetach(); |
ASSERT_FALSE(worker->ThreadAliveForTesting()); |
} |
@@ -452,7 +460,7 @@ TEST(TaskSchedulerWorkerTest, WorkerDetachesAndWakes) { |
ControllableDetachDelegate* delegate = |
new StrictMock<ControllableDetachDelegate>(&task_tracker); |
delegate->set_can_detach(true); |
- EXPECT_CALL(*delegate, OnMainEntry(_, TimeDelta::Max())); |
+ EXPECT_CALL(*delegate, OnMainEntry(_)); |
std::unique_ptr<SchedulerWorker> worker = |
SchedulerWorker::Create( |
ThreadPriority::NORMAL, WrapUnique(delegate), &task_tracker, |
@@ -461,20 +469,19 @@ TEST(TaskSchedulerWorkerTest, WorkerDetachesAndWakes) { |
delegate->WaitForWorkToRun(); |
Mock::VerifyAndClear(delegate); |
delegate->WaitForDetachRequest(); |
- // Sleep to give a chance for the detach to happen. A yield is too short. |
- PlatformThread::Sleep(TimeDelta::FromMilliseconds(50)); |
+ delegate->WaitForDetach(); |
ASSERT_FALSE(worker->ThreadAliveForTesting()); |
delegate->ResetState(); |
delegate->set_can_detach(false); |
- // When SchedulerWorker recreates its thread, expect OnMainEntry() to be |
- // called with a detach duration which is not TimeDelta::Max(). |
- EXPECT_CALL(*delegate, OnMainEntry(worker.get(), Ne(TimeDelta::Max()))); |
+ // Expect OnMainEntry() to be called when SchedulerWorker recreates its |
+ // thread. |
+ EXPECT_CALL(*delegate, OnMainEntry(worker.get())); |
worker->WakeUp(); |
delegate->WaitForWorkToRun(); |
Mock::VerifyAndClear(delegate); |
delegate->WaitForDetachRequest(); |
- PlatformThread::Sleep(TimeDelta::FromMilliseconds(50)); |
+ delegate->WaitForDetach(); |
ASSERT_TRUE(worker->ThreadAliveForTesting()); |
worker->JoinForTesting(); |
} |
@@ -489,7 +496,7 @@ TEST(TaskSchedulerWorkerTest, CreateDetached) { |
ThreadPriority::NORMAL, WrapUnique(delegate), &task_tracker, |
SchedulerWorker::InitialState::DETACHED); |
ASSERT_FALSE(worker->ThreadAliveForTesting()); |
- EXPECT_CALL(*delegate, OnMainEntry(worker.get(), TimeDelta::Max())); |
+ EXPECT_CALL(*delegate, OnMainEntry(worker.get())); |
worker->WakeUp(); |
delegate->WaitForWorkToRun(); |
Mock::VerifyAndClear(delegate); |
@@ -517,10 +524,7 @@ class ExpectThreadPriorityDelegate : public SchedulerWorkerDefaultDelegate { |
} |
// SchedulerWorker::Delegate: |
- void OnMainEntry(SchedulerWorker* worker, |
- const TimeDelta& detach_duration) override { |
- VerifyThreadPriority(); |
- } |
+ void OnMainEntry(SchedulerWorker* worker) override { VerifyThreadPriority(); } |
scoped_refptr<Sequence> GetWork(SchedulerWorker* worker) override { |
VerifyThreadPriority(); |
priority_verified_in_get_work_event_.Signal(); |