Index: base/task_scheduler/scheduler_worker_thread_unittest.cc |
diff --git a/base/task_scheduler/scheduler_worker_thread_unittest.cc b/base/task_scheduler/scheduler_worker_thread_unittest.cc |
index 0131dcf0d7b07f9989ebf46d7247fd9b247fb29c..a3df98ea54f8ba0009c0b563a393eeda2cd6f3d1 100644 |
--- a/base/task_scheduler/scheduler_worker_thread_unittest.cc |
+++ b/base/task_scheduler/scheduler_worker_thread_unittest.cc |
@@ -27,16 +27,17 @@ namespace { |
const size_t kNumSequencesPerTest = 150; |
// The test parameter is the number of Tasks per Sequence returned by GetWork(). |
-class TaskSchedulerWorkerThreadTest : public testing::TestWithParam<size_t>, |
- public SchedulerWorkerThread::Delegate { |
+class TaskSchedulerWorkerThreadTest : public testing::TestWithParam<size_t> { |
protected: |
TaskSchedulerWorkerThreadTest() |
: main_entry_called_(true, false), |
num_get_work_cv_(lock_.CreateConditionVariable()) {} |
void SetUp() override { |
- worker_thread_ = SchedulerWorkerThread::CreateSchedulerWorkerThread( |
- ThreadPriority::NORMAL, this, &task_tracker_); |
+ worker_thread_ = SchedulerWorkerThread::CreateWorkerThread( |
+ ThreadPriority::NORMAL, |
+ WrapUnique(new SchedulerWorkerThreadDelegateImpl(this)), |
gab
2016/04/22 19:30:29
This compiles without a fwd-decl of SchedulerWorke
fdoray
2016/04/22 22:46:46
Yes. We can use any type defined in the class in t
|
+ &task_tracker_); |
ASSERT_TRUE(worker_thread_); |
main_entry_called_.Wait(); |
} |
@@ -83,74 +84,86 @@ class TaskSchedulerWorkerThreadTest : public testing::TestWithParam<size_t>, |
std::unique_ptr<SchedulerWorkerThread> worker_thread_; |
private: |
- // SchedulerWorkerThread::Delegate: |
- void OnMainEntry() override { |
- // Without this |auto_lock|, OnMainEntry() could be called twice without |
- // generating an error. |
- AutoSchedulerLock auto_lock(lock_); |
- EXPECT_FALSE(main_entry_called_.IsSignaled()); |
- main_entry_called_.Signal(); |
- } |
- |
- scoped_refptr<Sequence> GetWork( |
- SchedulerWorkerThread* worker_thread) override { |
- EXPECT_EQ(worker_thread_.get(), worker_thread); |
- |
- { |
- AutoSchedulerLock auto_lock(lock_); |
- |
- // Increment the number of times that this method has been called. |
- ++num_get_work_; |
- num_get_work_cv_->Signal(); |
- |
- // Verify that this method isn't called more times than expected. |
- EXPECT_LE(num_get_work_, max_get_work_); |
- |
- // Check if a Sequence should be returned. |
- if (num_sequences_to_create_ == 0) |
- return nullptr; |
- --num_sequences_to_create_; |
+ class SchedulerWorkerThreadDelegateImpl |
gab
2016/04/22 19:30:29
Name this differently than main impl, e.g. Schedul
danakj
2016/04/22 20:16:33
nit: not a fan of "test" in class names. Suggest f
robliao
2016/04/22 20:30:48
There is a reasonable precedent in Chrome to name
fdoray
2016/04/22 22:46:46
Done. Renamed to TestSchedulerWorkerThreadDelegate
|
+ : public SchedulerWorkerThread::Delegate { |
+ public: |
+ SchedulerWorkerThreadDelegateImpl(TaskSchedulerWorkerThreadTest* outer) |
+ : outer_(outer) {} |
+ |
+ // SchedulerWorkerThread::Delegate: |
+ void OnMainEntry() override { |
+ // Without this |auto_lock|, OnMainEntry() could be called twice without |
robliao
2016/04/22 20:30:48
Nit: Without synchronization
fdoray
2016/04/22 22:46:46
Done.
|
+ // generating an error. |
+ AutoSchedulerLock auto_lock(outer_->lock_); |
+ EXPECT_FALSE(outer_->main_entry_called_.IsSignaled()); |
+ outer_->main_entry_called_.Signal(); |
} |
- // Create a Sequence with TasksPerSequence() Tasks. |
- scoped_refptr<Sequence> sequence(new Sequence); |
- for (size_t i = 0; i < TasksPerSequence(); ++i) { |
- std::unique_ptr<Task> task(new Task( |
- FROM_HERE, Bind(&TaskSchedulerWorkerThreadTest::RunTaskCallback, |
- Unretained(this)), |
- TaskTraits(), TimeTicks())); |
- EXPECT_TRUE(task_tracker_.WillPostTask(task.get())); |
- sequence->PushTask(std::move(task)); |
+ scoped_refptr<Sequence> GetWork( |
+ SchedulerWorkerThread* worker_thread) override { |
+ EXPECT_EQ(outer_->worker_thread_.get(), worker_thread); |
+ |
+ { |
+ AutoSchedulerLock auto_lock(outer_->lock_); |
+ |
+ // Increment the number of times that this method has been called. |
+ ++outer_->num_get_work_; |
+ outer_->num_get_work_cv_->Signal(); |
+ |
+ // Verify that this method isn't called more times than expected. |
+ EXPECT_LE(outer_->num_get_work_, outer_->max_get_work_); |
+ |
+ // Check if a Sequence should be returned. |
+ if (outer_->num_sequences_to_create_ == 0) |
+ return nullptr; |
+ --outer_->num_sequences_to_create_; |
+ } |
+ |
+ // Create a Sequence with TasksPerSequence() Tasks. |
+ scoped_refptr<Sequence> sequence(new Sequence); |
+ for (size_t i = 0; i < outer_->TasksPerSequence(); ++i) { |
+ std::unique_ptr<Task> task(new Task( |
+ FROM_HERE, Bind(&TaskSchedulerWorkerThreadTest::RunTaskCallback, |
+ Unretained(outer_)), |
+ TaskTraits(), TimeTicks())); |
+ EXPECT_TRUE(outer_->task_tracker_.WillPostTask(task.get())); |
+ sequence->PushTask(std::move(task)); |
+ } |
+ |
+ { |
+ // Add the Sequence to the vector of created Sequences. |
+ AutoSchedulerLock auto_lock(outer_->lock_); |
+ outer_->created_sequences_.push_back(sequence); |
+ } |
+ |
+ return sequence; |
} |
- { |
- // Add the Sequence to the vector of created Sequences. |
- AutoSchedulerLock auto_lock(lock_); |
- created_sequences_.push_back(sequence); |
+ // This override verifies that |sequence| contains the expected number of |
+ // Tasks and adds it to |enqueued_sequences_|. Unlike a normal |
+ // EnqueueSequence |
+ // implementation, it doesn't reinsert |sequence| into a queue for further |
+ // execution. |
+ void EnqueueSequence(scoped_refptr<Sequence> sequence) override { |
+ EXPECT_GT(outer_->TasksPerSequence(), 1U); |
+ |
+ // Verify that |sequence| contains TasksPerSequence() - 1 Tasks. |
+ for (size_t i = 0; i < outer_->TasksPerSequence() - 1; ++i) { |
+ EXPECT_TRUE(sequence->PeekTask()); |
+ sequence->PopTask(); |
+ } |
+ EXPECT_FALSE(sequence->PeekTask()); |
+ |
+ // Add |sequence| to |enqueued_sequences_|. |
+ AutoSchedulerLock auto_lock(outer_->lock_); |
+ outer_->enqueued_sequences_.push_back(std::move(sequence)); |
+ EXPECT_LE(outer_->enqueued_sequences_.size(), |
+ outer_->created_sequences_.size()); |
} |
- return sequence; |
- } |
- |
- // This override verifies that |sequence| contains the expected number of |
- // Tasks and adds it to |enqueued_sequences_|. Unlike a normal EnqueueSequence |
- // implementation, it doesn't reinsert |sequence| into a queue for further |
- // execution. |
- void EnqueueSequence(scoped_refptr<Sequence> sequence) override { |
- EXPECT_GT(TasksPerSequence(), 1U); |
- |
- // Verify that |sequence| contains TasksPerSequence() - 1 Tasks. |
- for (size_t i = 0; i < TasksPerSequence() - 1; ++i) { |
- EXPECT_TRUE(sequence->PeekTask()); |
- sequence->PopTask(); |
- } |
- EXPECT_FALSE(sequence->PeekTask()); |
- |
- // Add |sequence| to |enqueued_sequences_|. |
- AutoSchedulerLock auto_lock(lock_); |
- enqueued_sequences_.push_back(std::move(sequence)); |
- EXPECT_LE(enqueued_sequences_.size(), created_sequences_.size()); |
- } |
+ private: |
+ TaskSchedulerWorkerThreadTest* outer_; |
+ }; |
void RunTaskCallback() { |
AutoSchedulerLock auto_lock(lock_); |