| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/scheduler/base/task_queue_selector.h" | 5 #include "components/scheduler/base/task_queue_selector.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
| 9 #include "base/pending_task.h" | 9 #include "base/pending_task.h" |
| 10 #include "components/scheduler/base/task_queue_impl.h" | 10 #include "components/scheduler/base/task_queue_impl.h" |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 | 26 |
| 27 MOCK_METHOD1(OnTaskQueueEnabled, void(internal::TaskQueueImpl*)); | 27 MOCK_METHOD1(OnTaskQueueEnabled, void(internal::TaskQueueImpl*)); |
| 28 | 28 |
| 29 private: | 29 private: |
| 30 DISALLOW_COPY_AND_ASSIGN(MockObserver); | 30 DISALLOW_COPY_AND_ASSIGN(MockObserver); |
| 31 }; | 31 }; |
| 32 | 32 |
| 33 class TaskQueueSelectorForTest : public TaskQueueSelector { | 33 class TaskQueueSelectorForTest : public TaskQueueSelector { |
| 34 public: | 34 public: |
| 35 using TaskQueueSelector::ChooseOldestWithPriority; | 35 using TaskQueueSelector::ChooseOldestWithPriority; |
| 36 using TaskQueueSelector::SetForceSelectImmediateForTest; | 36 using TaskQueueSelector::SetImmediateStarvationCountForTest; |
| 37 }; | 37 }; |
| 38 | 38 |
| 39 class TaskQueueSelectorTest : public testing::Test { | 39 class TaskQueueSelectorTest : public testing::Test { |
| 40 public: | 40 public: |
| 41 TaskQueueSelectorTest() | 41 TaskQueueSelectorTest() |
| 42 : test_closure_(base::Bind(&TaskQueueSelectorTest::TestFunction)) {} | 42 : test_closure_(base::Bind(&TaskQueueSelectorTest::TestFunction)) {} |
| 43 ~TaskQueueSelectorTest() override {} | 43 ~TaskQueueSelectorTest() override {} |
| 44 | 44 |
| 45 void PushTasks(const size_t queue_indices[], size_t num_tasks) { | 45 void PushTasks(const size_t queue_indices[], size_t num_tasks) { |
| 46 std::set<size_t> changed_queue_set; | 46 std::set<size_t> changed_queue_set; |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 277 size_t queue_order[] = {0, 1}; | 277 size_t queue_order[] = {0, 1}; |
| 278 PushTasks(queue_order, 2); | 278 PushTasks(queue_order, 2); |
| 279 | 279 |
| 280 EXPECT_FALSE(selector_.EnabledWorkQueuesEmpty()); | 280 EXPECT_FALSE(selector_.EnabledWorkQueuesEmpty()); |
| 281 PopTasks(); | 281 PopTasks(); |
| 282 EXPECT_TRUE(selector_.EnabledWorkQueuesEmpty()); | 282 EXPECT_TRUE(selector_.EnabledWorkQueuesEmpty()); |
| 283 } | 283 } |
| 284 | 284 |
| 285 TEST_F(TaskQueueSelectorTest, ChooseOldestWithPriority_Empty) { | 285 TEST_F(TaskQueueSelectorTest, ChooseOldestWithPriority_Empty) { |
| 286 WorkQueue* chosen_work_queue = nullptr; | 286 WorkQueue* chosen_work_queue = nullptr; |
| 287 bool chose_delayed_over_immediate = false; |
| 287 EXPECT_FALSE(selector_.ChooseOldestWithPriority(TaskQueue::NORMAL_PRIORITY, | 288 EXPECT_FALSE(selector_.ChooseOldestWithPriority(TaskQueue::NORMAL_PRIORITY, |
| 289 &chose_delayed_over_immediate, |
| 288 &chosen_work_queue)); | 290 &chosen_work_queue)); |
| 291 EXPECT_FALSE(chose_delayed_over_immediate); |
| 289 } | 292 } |
| 290 | 293 |
| 291 TEST_F(TaskQueueSelectorTest, ChooseOldestWithPriority_OnlyDelayed) { | 294 TEST_F(TaskQueueSelectorTest, ChooseOldestWithPriority_OnlyDelayed) { |
| 292 task_queues_[0]->delayed_work_queue()->PushTaskForTest(TaskQueueImpl::Task( | 295 task_queues_[0]->delayed_work_queue()->PushTaskForTest(TaskQueueImpl::Task( |
| 293 FROM_HERE, test_closure_, base::TimeTicks(), 0, true, 0)); | 296 FROM_HERE, test_closure_, base::TimeTicks(), 0, true, 0)); |
| 294 selector_.delayed_task_queue_sets()->OnPushQueue( | 297 selector_.delayed_task_queue_sets()->OnPushQueue( |
| 295 task_queues_[0]->delayed_work_queue()); | 298 task_queues_[0]->delayed_work_queue()); |
| 296 | 299 |
| 297 WorkQueue* chosen_work_queue = nullptr; | 300 WorkQueue* chosen_work_queue = nullptr; |
| 301 bool chose_delayed_over_immediate = false; |
| 298 EXPECT_TRUE(selector_.ChooseOldestWithPriority(TaskQueue::NORMAL_PRIORITY, | 302 EXPECT_TRUE(selector_.ChooseOldestWithPriority(TaskQueue::NORMAL_PRIORITY, |
| 303 &chose_delayed_over_immediate, |
| 299 &chosen_work_queue)); | 304 &chosen_work_queue)); |
| 300 EXPECT_EQ(chosen_work_queue, task_queues_[0]->delayed_work_queue()); | 305 EXPECT_EQ(chosen_work_queue, task_queues_[0]->delayed_work_queue()); |
| 306 EXPECT_FALSE(chose_delayed_over_immediate); |
| 301 } | 307 } |
| 302 | 308 |
| 303 TEST_F(TaskQueueSelectorTest, ChooseOldestWithPriority_OnlyImmediate) { | 309 TEST_F(TaskQueueSelectorTest, ChooseOldestWithPriority_OnlyImmediate) { |
| 304 task_queues_[0]->immediate_work_queue()->PushTaskForTest(TaskQueueImpl::Task( | 310 task_queues_[0]->immediate_work_queue()->PushTaskForTest(TaskQueueImpl::Task( |
| 305 FROM_HERE, test_closure_, base::TimeTicks(), 0, true, 0)); | 311 FROM_HERE, test_closure_, base::TimeTicks(), 0, true, 0)); |
| 306 selector_.immediate_task_queue_sets()->OnPushQueue( | 312 selector_.immediate_task_queue_sets()->OnPushQueue( |
| 307 task_queues_[0]->immediate_work_queue()); | 313 task_queues_[0]->immediate_work_queue()); |
| 308 | 314 |
| 309 WorkQueue* chosen_work_queue = nullptr; | 315 WorkQueue* chosen_work_queue = nullptr; |
| 316 bool chose_delayed_over_immediate; |
| 310 EXPECT_TRUE(selector_.ChooseOldestWithPriority(TaskQueue::NORMAL_PRIORITY, | 317 EXPECT_TRUE(selector_.ChooseOldestWithPriority(TaskQueue::NORMAL_PRIORITY, |
| 318 &chose_delayed_over_immediate, |
| 311 &chosen_work_queue)); | 319 &chosen_work_queue)); |
| 312 EXPECT_EQ(chosen_work_queue, task_queues_[0]->immediate_work_queue()); | 320 EXPECT_EQ(chosen_work_queue, task_queues_[0]->immediate_work_queue()); |
| 321 EXPECT_FALSE(chose_delayed_over_immediate); |
| 313 } | 322 } |
| 314 | 323 |
| 315 struct ChooseOldestWithPriorityTestParam { | 324 struct ChooseOldestWithPriorityTestParam { |
| 316 int delayed_task_enqueue_order; | 325 int delayed_task_enqueue_order; |
| 317 int immediate_task_enqueue_order; | 326 int immediate_task_enqueue_order; |
| 318 bool force_select_immediate; | 327 int immediate_starvation_count; |
| 319 const char* expected_work_queue_name; | 328 const char* expected_work_queue_name; |
| 329 bool expected_did_starve_immediate_queue; |
| 320 }; | 330 }; |
| 321 | 331 |
| 322 static const ChooseOldestWithPriorityTestParam | 332 static const ChooseOldestWithPriorityTestParam |
| 323 kChooseOldestWithPriorityTestCases[] = { | 333 kChooseOldestWithPriorityTestCases[] = { |
| 324 {1, 2, false, "delayed"}, | 334 {1, 2, 0, "delayed", true}, |
| 325 {1, 2, true, "immediate"}, | 335 {1, 2, 1, "delayed", true}, |
| 326 {2, 1, false, "immediate"}, | 336 {1, 2, 2, "delayed", true}, |
| 327 {2, 1, true, "immediate"}, | 337 {1, 2, 3, "delayed", true}, |
| 338 {1, 2, 4, "immediate", false}, |
| 339 {2, 1, 4, "immediate", false}, |
| 340 {2, 1, 4, "immediate", false}, |
| 328 }; | 341 }; |
| 329 | 342 |
| 330 class ChooseOldestWithPriorityTest | 343 class ChooseOldestWithPriorityTest |
| 331 : public TaskQueueSelectorTest, | 344 : public TaskQueueSelectorTest, |
| 332 public testing::WithParamInterface<ChooseOldestWithPriorityTestParam> {}; | 345 public testing::WithParamInterface<ChooseOldestWithPriorityTestParam> {}; |
| 333 | 346 |
| 334 TEST_P(ChooseOldestWithPriorityTest, RoundRobinTest) { | 347 TEST_P(ChooseOldestWithPriorityTest, RoundRobinTest) { |
| 335 task_queues_[0]->immediate_work_queue()->PushTaskForTest( | 348 task_queues_[0]->immediate_work_queue()->PushTaskForTest( |
| 336 TaskQueueImpl::Task(FROM_HERE, test_closure_, base::TimeTicks(), | 349 TaskQueueImpl::Task(FROM_HERE, test_closure_, base::TimeTicks(), |
| 337 GetParam().immediate_task_enqueue_order, true, | 350 GetParam().immediate_task_enqueue_order, true, |
| 338 GetParam().immediate_task_enqueue_order)); | 351 GetParam().immediate_task_enqueue_order)); |
| 339 selector_.immediate_task_queue_sets()->OnPushQueue( | 352 selector_.immediate_task_queue_sets()->OnPushQueue( |
| 340 task_queues_[0]->immediate_work_queue()); | 353 task_queues_[0]->immediate_work_queue()); |
| 341 | 354 |
| 342 task_queues_[0]->delayed_work_queue()->PushTaskForTest( | 355 task_queues_[0]->delayed_work_queue()->PushTaskForTest( |
| 343 TaskQueueImpl::Task(FROM_HERE, test_closure_, base::TimeTicks(), | 356 TaskQueueImpl::Task(FROM_HERE, test_closure_, base::TimeTicks(), |
| 344 GetParam().delayed_task_enqueue_order, true, | 357 GetParam().delayed_task_enqueue_order, true, |
| 345 GetParam().delayed_task_enqueue_order)); | 358 GetParam().delayed_task_enqueue_order)); |
| 346 selector_.delayed_task_queue_sets()->OnPushQueue( | 359 selector_.delayed_task_queue_sets()->OnPushQueue( |
| 347 task_queues_[0]->delayed_work_queue()); | 360 task_queues_[0]->delayed_work_queue()); |
| 348 | 361 |
| 349 selector_.SetForceSelectImmediateForTest(GetParam().force_select_immediate); | 362 selector_.SetImmediateStarvationCountForTest( |
| 363 GetParam().immediate_starvation_count); |
| 350 | 364 |
| 351 WorkQueue* chosen_work_queue = nullptr; | 365 WorkQueue* chosen_work_queue = nullptr; |
| 366 bool chose_delayed_over_immediate; |
| 352 EXPECT_TRUE(selector_.ChooseOldestWithPriority(TaskQueue::NORMAL_PRIORITY, | 367 EXPECT_TRUE(selector_.ChooseOldestWithPriority(TaskQueue::NORMAL_PRIORITY, |
| 368 &chose_delayed_over_immediate, |
| 353 &chosen_work_queue)); | 369 &chosen_work_queue)); |
| 354 EXPECT_EQ(chosen_work_queue->task_queue(), task_queues_[0].get()); | 370 EXPECT_EQ(chosen_work_queue->task_queue(), task_queues_[0].get()); |
| 355 EXPECT_STREQ(chosen_work_queue->name(), GetParam().expected_work_queue_name); | 371 EXPECT_STREQ(chosen_work_queue->name(), GetParam().expected_work_queue_name); |
| 372 EXPECT_EQ(chose_delayed_over_immediate, |
| 373 GetParam().expected_did_starve_immediate_queue); |
| 356 } | 374 } |
| 357 | 375 |
| 358 INSTANTIATE_TEST_CASE_P(ChooseOldestWithPriorityTest, | 376 INSTANTIATE_TEST_CASE_P(ChooseOldestWithPriorityTest, |
| 359 ChooseOldestWithPriorityTest, | 377 ChooseOldestWithPriorityTest, |
| 360 testing::ValuesIn(kChooseOldestWithPriorityTestCases)); | 378 testing::ValuesIn(kChooseOldestWithPriorityTestCases)); |
| 361 | 379 |
| 362 } // namespace internal | 380 } // namespace internal |
| 363 } // namespace scheduler | 381 } // namespace scheduler |
| OLD | NEW |