Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(231)

Side by Side Diff: components/scheduler/base/task_queue_selector_unittest.cc

Issue 1507093004: Adopt a less severe anti-starvation policy for immediate tasks (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove skip for editing/spelling/spelling-huge-text-sync.html Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698