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 |