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

Side by Side Diff: content/child/scheduler/task_queue_manager_unittest.cc

Issue 1025323003: Introduce a SchedulerHelper in content/child/scheduler (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 5 years, 8 months 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "content/renderer/scheduler/task_queue_manager.h" 5 #include "content/child/scheduler/task_queue_manager.h"
6 6
7 #include "base/threading/thread.h" 7 #include "base/threading/thread.h"
8 #include "cc/test/ordered_simple_task_runner.h" 8 #include "cc/test/ordered_simple_task_runner.h"
9 #include "cc/test/test_now_source.h" 9 #include "cc/test/test_now_source.h"
10 #include "content/renderer/scheduler/nestable_task_runner_for_test.h" 10 #include "content/child/scheduler/nestable_task_runner_for_test.h"
11 #include "content/renderer/scheduler/renderer_scheduler_message_loop_delegate.h" 11 #include "content/child/scheduler/scheduler_message_loop_delegate.h"
12 #include "content/renderer/scheduler/task_queue_selector.h" 12 #include "content/child/scheduler/task_queue_selector.h"
13 #include "testing/gmock/include/gmock/gmock.h" 13 #include "testing/gmock/include/gmock/gmock.h"
14 14
15 using testing::ElementsAre; 15 using testing::ElementsAre;
16 using testing::_; 16 using testing::_;
17 17
18 namespace content { 18 namespace content {
19 namespace { 19 namespace {
20 20
21 class SelectorForTest : public TaskQueueSelector { 21 class SelectorForTest : public TaskQueueSelector {
22 public: 22 public:
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 Explicit, 104 Explicit,
105 }; 105 };
106 106
107 void Initialize(size_t num_queues, SelectorType type) { 107 void Initialize(size_t num_queues, SelectorType type) {
108 now_src_ = cc::TestNowSource::Create(1000); 108 now_src_ = cc::TestNowSource::Create(1000);
109 test_task_runner_ = 109 test_task_runner_ =
110 make_scoped_refptr(new cc::OrderedSimpleTaskRunner(now_src_, false)); 110 make_scoped_refptr(new cc::OrderedSimpleTaskRunner(now_src_, false));
111 selector_ = make_scoped_ptr(createSelectorForTest(type)); 111 selector_ = make_scoped_ptr(createSelectorForTest(type));
112 manager_ = make_scoped_ptr(new TaskQueueManager( 112 manager_ = make_scoped_ptr(new TaskQueueManager(
113 num_queues, NestableTaskRunnerForTest::Create(test_task_runner_.get()), 113 num_queues, NestableTaskRunnerForTest::Create(test_task_runner_.get()),
114 selector_.get())); 114 selector_.get(), "test.scheduler"));
115 manager_->SetTimeSourceForTesting(now_src_); 115 manager_->SetTimeSourceForTesting(now_src_);
116 116
117 EXPECT_EQ(num_queues, selector_->work_queues().size()); 117 EXPECT_EQ(num_queues, selector_->work_queues().size());
118 } 118 }
119 119
120 void InitializeWithRealMessageLoop(size_t num_queues, SelectorType type) { 120 void InitializeWithRealMessageLoop(size_t num_queues, SelectorType type) {
121 message_loop_.reset(new base::MessageLoop()); 121 message_loop_.reset(new base::MessageLoop());
122 selector_ = make_scoped_ptr(createSelectorForTest(type)); 122 selector_ = make_scoped_ptr(createSelectorForTest(type));
123 manager_ = make_scoped_ptr(new TaskQueueManager( 123 manager_ = make_scoped_ptr(new TaskQueueManager(
124 num_queues, 124 num_queues, SchedulerMessageLoopDelegate::Create(message_loop_.get()),
125 RendererSchedulerMessageLoopDelegate::Create(message_loop_.get()), 125 selector_.get(), "test.scheduler"));
126 selector_.get()));
127 EXPECT_EQ(num_queues, selector_->work_queues().size()); 126 EXPECT_EQ(num_queues, selector_->work_queues().size());
128 } 127 }
129 128
130 SelectorForTest* createSelectorForTest(SelectorType type) { 129 SelectorForTest* createSelectorForTest(SelectorType type) {
131 switch (type) { 130 switch (type) {
132 case SelectorType::Automatic: 131 case SelectorType::Automatic:
133 return new AutomaticSelectorForTest(); 132 return new AutomaticSelectorForTest();
134 133
135 case SelectorType::Explicit: 134 case SelectorType::Explicit:
136 return new ExplicitSelectorForTest(); 135 return new ExplicitSelectorForTest();
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
281 280
282 std::vector<std::pair<base::Closure, bool>> tasks_to_post_from_nested_loop; 281 std::vector<std::pair<base::Closure, bool>> tasks_to_post_from_nested_loop;
283 tasks_to_post_from_nested_loop.push_back( 282 tasks_to_post_from_nested_loop.push_back(
284 std::make_pair(base::Bind(&TestTask, 3, &run_order), false)); 283 std::make_pair(base::Bind(&TestTask, 3, &run_order), false));
285 tasks_to_post_from_nested_loop.push_back( 284 tasks_to_post_from_nested_loop.push_back(
286 std::make_pair(base::Bind(&TestTask, 4, &run_order), true)); 285 std::make_pair(base::Bind(&TestTask, 4, &run_order), true));
287 tasks_to_post_from_nested_loop.push_back( 286 tasks_to_post_from_nested_loop.push_back(
288 std::make_pair(base::Bind(&TestTask, 5, &run_order), true)); 287 std::make_pair(base::Bind(&TestTask, 5, &run_order), true));
289 288
290 runner->PostTask( 289 runner->PostTask(
291 FROM_HERE, 290 FROM_HERE, base::Bind(&PostFromNestedRunloop, message_loop_.get(), runner,
292 base::Bind(&PostFromNestedRunloop, message_loop_.get(), runner, 291 base::Unretained(&tasks_to_post_from_nested_loop)));
293 base::Unretained(&tasks_to_post_from_nested_loop)));
294 292
295 message_loop_->RunUntilIdle(); 293 message_loop_->RunUntilIdle();
296 // Note we expect task 3 to run last because it's non-nestable. 294 // Note we expect task 3 to run last because it's non-nestable.
297 EXPECT_THAT(run_order, ElementsAre(1, 2, 4, 5, 3)); 295 EXPECT_THAT(run_order, ElementsAre(1, 2, 4, 5, 3));
298 } 296 }
299 297
300 TEST_F(TaskQueueManagerTest, QueuePolling) { 298 TEST_F(TaskQueueManagerTest, QueuePolling) {
301 Initialize(1u, SelectorType::Automatic); 299 Initialize(1u, SelectorType::Automatic);
302 300
303 std::vector<int> run_order; 301 std::vector<int> run_order;
304 scoped_refptr<base::SingleThreadTaskRunner> runner = 302 scoped_refptr<base::SingleThreadTaskRunner> runner =
305 manager_->TaskRunnerForQueue(0); 303 manager_->TaskRunnerForQueue(0);
306 304
307 EXPECT_TRUE(manager_->IsQueueEmpty(0)); 305 EXPECT_TRUE(manager_->IsQueueEmpty(0));
308 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 306 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
309 EXPECT_FALSE(manager_->IsQueueEmpty(0)); 307 EXPECT_FALSE(manager_->IsQueueEmpty(0));
310 308
311 test_task_runner_->RunUntilIdle(); 309 test_task_runner_->RunUntilIdle();
312 EXPECT_TRUE(manager_->IsQueueEmpty(0)); 310 EXPECT_TRUE(manager_->IsQueueEmpty(0));
313 } 311 }
314 312
315 TEST_F(TaskQueueManagerTest, DelayedTaskPosting) { 313 TEST_F(TaskQueueManagerTest, DelayedTaskPosting) {
316 Initialize(1u, SelectorType::Automatic); 314 Initialize(1u, SelectorType::Automatic);
317 315
318 std::vector<int> run_order; 316 std::vector<int> run_order;
319 scoped_refptr<base::SingleThreadTaskRunner> runner = 317 scoped_refptr<base::SingleThreadTaskRunner> runner =
320 manager_->TaskRunnerForQueue(0); 318 manager_->TaskRunnerForQueue(0);
321 319
322 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); 320 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
323 runner->PostDelayedTask( 321 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
324 FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay); 322 delay);
325 EXPECT_EQ(delay, test_task_runner_->DelayToNextTaskTime()); 323 EXPECT_EQ(delay, test_task_runner_->DelayToNextTaskTime());
326 EXPECT_TRUE(manager_->IsQueueEmpty(0)); 324 EXPECT_TRUE(manager_->IsQueueEmpty(0));
327 EXPECT_TRUE(run_order.empty()); 325 EXPECT_TRUE(run_order.empty());
328 326
329 // The task doesn't run before the delay has completed. 327 // The task doesn't run before the delay has completed.
330 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(9)); 328 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(9));
331 EXPECT_TRUE(run_order.empty()); 329 EXPECT_TRUE(run_order.empty());
332 330
333 // After the delay has completed, the task runs normally. 331 // After the delay has completed, the task runs normally.
334 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(1)); 332 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(1));
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
517 Initialize(1u, SelectorType::Automatic); 515 Initialize(1u, SelectorType::Automatic);
518 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); 516 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
519 517
520 std::vector<int> run_order; 518 std::vector<int> run_order;
521 scoped_refptr<base::SingleThreadTaskRunner> runner = 519 scoped_refptr<base::SingleThreadTaskRunner> runner =
522 manager_->TaskRunnerForQueue(0); 520 manager_->TaskRunnerForQueue(0);
523 521
524 // Posting a delayed task when pumping will apply the delay, but won't cause 522 // Posting a delayed task when pumping will apply the delay, but won't cause
525 // work to executed afterwards. 523 // work to executed afterwards.
526 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); 524 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
527 runner->PostDelayedTask( 525 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
528 FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay); 526 delay);
529 527
530 // After pumping but before the delay period has expired, task does not run. 528 // After pumping but before the delay period has expired, task does not run.
531 manager_->PumpQueue(0); 529 manager_->PumpQueue(0);
532 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5)); 530 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5));
533 EXPECT_TRUE(run_order.empty()); 531 EXPECT_TRUE(run_order.empty());
534 532
535 // Once the delay has expired, pumping causes the task to run. 533 // Once the delay has expired, pumping causes the task to run.
536 now_src_->AdvanceNow(base::TimeDelta::FromMilliseconds(5)); 534 now_src_->AdvanceNow(base::TimeDelta::FromMilliseconds(5));
537 manager_->PumpQueue(0); 535 manager_->PumpQueue(0);
538 EXPECT_TRUE(test_task_runner_->HasPendingTasks()); 536 EXPECT_TRUE(test_task_runner_->HasPendingTasks());
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
661 FROM_HERE, base::Bind(&PostTaskToRunner, runner, &run_order)); 659 FROM_HERE, base::Bind(&PostTaskToRunner, runner, &run_order));
662 thread.Stop(); 660 thread.Stop();
663 661
664 message_loop_->RunUntilIdle(); 662 message_loop_->RunUntilIdle();
665 EXPECT_THAT(run_order, ElementsAre(1)); 663 EXPECT_THAT(run_order, ElementsAre(1));
666 } 664 }
667 665
668 void RePostingTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner, 666 void RePostingTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner,
669 int* run_count) { 667 int* run_count) {
670 (*run_count)++; 668 (*run_count)++;
671 runner->PostTask( 669 runner->PostTask(FROM_HERE, Bind(&RePostingTestTask,
672 FROM_HERE, 670 base::Unretained(runner.get()), run_count));
673 Bind(&RePostingTestTask, base::Unretained(runner.get()), run_count));
674 } 671 }
675 672
676 TEST_F(TaskQueueManagerTest, DoWorkCantPostItselfMultipleTimes) { 673 TEST_F(TaskQueueManagerTest, DoWorkCantPostItselfMultipleTimes) {
677 Initialize(1u, SelectorType::Automatic); 674 Initialize(1u, SelectorType::Automatic);
678 scoped_refptr<base::SingleThreadTaskRunner> runner = 675 scoped_refptr<base::SingleThreadTaskRunner> runner =
679 manager_->TaskRunnerForQueue(0); 676 manager_->TaskRunnerForQueue(0);
680 677
681 int run_count = 0; 678 int run_count = 0;
682 runner->PostTask(FROM_HERE, 679 runner->PostTask(FROM_HERE,
683 base::Bind(&RePostingTestTask, runner, &run_count)); 680 base::Bind(&RePostingTestTask, runner, &run_count));
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
822 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; 819 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)};
823 820
824 selector_->AppendQueueToService(1); 821 selector_->AppendQueueToService(1);
825 selector_->AppendQueueToService(1); 822 selector_->AppendQueueToService(1);
826 selector_->AppendQueueToService(0); 823 selector_->AppendQueueToService(0);
827 824
828 // Check that a task which posts a task to an auto pump after wakeup queue 825 // Check that a task which posts a task to an auto pump after wakeup queue
829 // doesn't cause the queue to wake up. 826 // doesn't cause the queue to wake up.
830 base::Closure after_wakeup_task = base::Bind(&TestTask, 1, &run_order); 827 base::Closure after_wakeup_task = base::Bind(&TestTask, 1, &run_order);
831 runners[1]->PostTask( 828 runners[1]->PostTask(
832 FROM_HERE, 829 FROM_HERE, base::Bind(&TestPostingTask, runners[0], after_wakeup_task));
833 base::Bind(&TestPostingTask, runners[0], after_wakeup_task));
834 test_task_runner_->RunUntilIdle(); 830 test_task_runner_->RunUntilIdle();
835 EXPECT_TRUE(run_order.empty()); 831 EXPECT_TRUE(run_order.empty());
836 832
837 // Wake up the queue. 833 // Wake up the queue.
838 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); 834 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
839 test_task_runner_->RunUntilIdle(); 835 test_task_runner_->RunUntilIdle();
840 EXPECT_THAT(run_order, ElementsAre(2, 1)); 836 EXPECT_THAT(run_order, ElementsAre(2, 1));
841 } 837 }
842 838
843 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupFromMultipleTasks) { 839 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupFromMultipleTasks) {
844 Initialize(2u, SelectorType::Explicit); 840 Initialize(2u, SelectorType::Explicit);
845 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); 841 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP);
846 842
847 std::vector<int> run_order; 843 std::vector<int> run_order;
848 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { 844 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = {
849 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; 845 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)};
850 846
851 selector_->AppendQueueToService(1); 847 selector_->AppendQueueToService(1);
852 selector_->AppendQueueToService(1); 848 selector_->AppendQueueToService(1);
853 selector_->AppendQueueToService(1); 849 selector_->AppendQueueToService(1);
854 selector_->AppendQueueToService(0); 850 selector_->AppendQueueToService(0);
855 selector_->AppendQueueToService(0); 851 selector_->AppendQueueToService(0);
856 852
857 // Check that a task which posts a task to an auto pump after wakeup queue 853 // Check that a task which posts a task to an auto pump after wakeup queue
858 // doesn't cause the queue to wake up. 854 // doesn't cause the queue to wake up.
859 base::Closure after_wakeup_task_1 = base::Bind(&TestTask, 1, &run_order); 855 base::Closure after_wakeup_task_1 = base::Bind(&TestTask, 1, &run_order);
860 base::Closure after_wakeup_task_2 = base::Bind(&TestTask, 2, &run_order); 856 base::Closure after_wakeup_task_2 = base::Bind(&TestTask, 2, &run_order);
861 runners[1]->PostTask( 857 runners[1]->PostTask(
862 FROM_HERE, 858 FROM_HERE, base::Bind(&TestPostingTask, runners[0], after_wakeup_task_1));
863 base::Bind(&TestPostingTask, runners[0], after_wakeup_task_1));
864 runners[1]->PostTask( 859 runners[1]->PostTask(
865 FROM_HERE, 860 FROM_HERE, base::Bind(&TestPostingTask, runners[0], after_wakeup_task_2));
866 base::Bind(&TestPostingTask, runners[0], after_wakeup_task_2));
867 test_task_runner_->RunUntilIdle(); 861 test_task_runner_->RunUntilIdle();
868 EXPECT_TRUE(run_order.empty()); 862 EXPECT_TRUE(run_order.empty());
869 863
870 // Wake up the queue. 864 // Wake up the queue.
871 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); 865 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
872 test_task_runner_->RunUntilIdle(); 866 test_task_runner_->RunUntilIdle();
873 EXPECT_THAT(run_order, ElementsAre(3, 1, 2)); 867 EXPECT_THAT(run_order, ElementsAre(3, 1, 2));
874 } 868 }
875 869
876 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupBecomesQuiescent) { 870 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupBecomesQuiescent) {
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
1037 runners[0]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay1); 1031 runners[0]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay1);
1038 runners[1]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay2); 1032 runners[1]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay2);
1039 runners[2]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay3); 1033 runners[2]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay3);
1040 1034
1041 EXPECT_EQ(now_src_->Now() + delay2, 1035 EXPECT_EQ(now_src_->Now() + delay2,
1042 manager_->NextPendingDelayedTaskRunTime()); 1036 manager_->NextPendingDelayedTaskRunTime());
1043 } 1037 }
1044 1038
1045 } // namespace 1039 } // namespace
1046 } // namespace content 1040 } // namespace content
1047
OLDNEW
« no previous file with comments | « content/child/scheduler/task_queue_manager_perftest.cc ('k') | content/child/scheduler/task_queue_selector.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698