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

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: Added the delegate Created 5 years, 9 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 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
515 Initialize(1u, SelectorType::Automatic); 513 Initialize(1u, SelectorType::Automatic);
516 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); 514 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
517 515
518 std::vector<int> run_order; 516 std::vector<int> run_order;
519 scoped_refptr<base::SingleThreadTaskRunner> runner = 517 scoped_refptr<base::SingleThreadTaskRunner> runner =
520 manager_->TaskRunnerForQueue(0); 518 manager_->TaskRunnerForQueue(0);
521 519
522 // Posting a delayed task when pumping will apply the delay, but won't cause 520 // Posting a delayed task when pumping will apply the delay, but won't cause
523 // work to executed afterwards. 521 // work to executed afterwards.
524 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); 522 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
525 runner->PostDelayedTask( 523 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
526 FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay); 524 delay);
527 525
528 // After pumping but before the delay period has expired, task does not run. 526 // After pumping but before the delay period has expired, task does not run.
529 manager_->PumpQueue(0); 527 manager_->PumpQueue(0);
530 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5)); 528 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5));
531 EXPECT_TRUE(run_order.empty()); 529 EXPECT_TRUE(run_order.empty());
532 530
533 // Once the delay has expired, pumping causes the task to run. 531 // Once the delay has expired, pumping causes the task to run.
534 now_src_->AdvanceNow(base::TimeDelta::FromMilliseconds(5)); 532 now_src_->AdvanceNow(base::TimeDelta::FromMilliseconds(5));
535 manager_->PumpQueue(0); 533 manager_->PumpQueue(0);
536 EXPECT_TRUE(test_task_runner_->HasPendingTasks()); 534 EXPECT_TRUE(test_task_runner_->HasPendingTasks());
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
659 FROM_HERE, base::Bind(&PostTaskToRunner, runner, &run_order)); 657 FROM_HERE, base::Bind(&PostTaskToRunner, runner, &run_order));
660 thread.Stop(); 658 thread.Stop();
661 659
662 message_loop_->RunUntilIdle(); 660 message_loop_->RunUntilIdle();
663 EXPECT_THAT(run_order, ElementsAre(1)); 661 EXPECT_THAT(run_order, ElementsAre(1));
664 } 662 }
665 663
666 void RePostingTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner, 664 void RePostingTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner,
667 int* run_count) { 665 int* run_count) {
668 (*run_count)++; 666 (*run_count)++;
669 runner->PostTask( 667 runner->PostTask(FROM_HERE, Bind(&RePostingTestTask,
670 FROM_HERE, 668 base::Unretained(runner.get()), run_count));
671 Bind(&RePostingTestTask, base::Unretained(runner.get()), run_count));
672 } 669 }
673 670
674 TEST_F(TaskQueueManagerTest, DoWorkCantPostItselfMultipleTimes) { 671 TEST_F(TaskQueueManagerTest, DoWorkCantPostItselfMultipleTimes) {
675 Initialize(1u, SelectorType::Automatic); 672 Initialize(1u, SelectorType::Automatic);
676 scoped_refptr<base::SingleThreadTaskRunner> runner = 673 scoped_refptr<base::SingleThreadTaskRunner> runner =
677 manager_->TaskRunnerForQueue(0); 674 manager_->TaskRunnerForQueue(0);
678 675
679 int run_count = 0; 676 int run_count = 0;
680 runner->PostTask(FROM_HERE, 677 runner->PostTask(FROM_HERE,
681 base::Bind(&RePostingTestTask, runner, &run_count)); 678 base::Bind(&RePostingTestTask, runner, &run_count));
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
820 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; 817 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)};
821 818
822 selector_->AppendQueueToService(1); 819 selector_->AppendQueueToService(1);
823 selector_->AppendQueueToService(1); 820 selector_->AppendQueueToService(1);
824 selector_->AppendQueueToService(0); 821 selector_->AppendQueueToService(0);
825 822
826 // Check that a task which posts a task to an auto pump after wakeup queue 823 // Check that a task which posts a task to an auto pump after wakeup queue
827 // doesn't cause the queue to wake up. 824 // doesn't cause the queue to wake up.
828 base::Closure after_wakeup_task = base::Bind(&TestTask, 1, &run_order); 825 base::Closure after_wakeup_task = base::Bind(&TestTask, 1, &run_order);
829 runners[1]->PostTask( 826 runners[1]->PostTask(
830 FROM_HERE, 827 FROM_HERE, base::Bind(&TestPostingTask, runners[0], after_wakeup_task));
831 base::Bind(&TestPostingTask, runners[0], after_wakeup_task));
832 test_task_runner_->RunUntilIdle(); 828 test_task_runner_->RunUntilIdle();
833 EXPECT_TRUE(run_order.empty()); 829 EXPECT_TRUE(run_order.empty());
834 830
835 // Wake up the queue. 831 // Wake up the queue.
836 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); 832 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
837 test_task_runner_->RunUntilIdle(); 833 test_task_runner_->RunUntilIdle();
838 EXPECT_THAT(run_order, ElementsAre(2, 1)); 834 EXPECT_THAT(run_order, ElementsAre(2, 1));
839 } 835 }
840 836
841 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupFromMultipleTasks) { 837 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupFromMultipleTasks) {
842 Initialize(2u, SelectorType::Explicit); 838 Initialize(2u, SelectorType::Explicit);
843 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); 839 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP);
844 840
845 std::vector<int> run_order; 841 std::vector<int> run_order;
846 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { 842 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = {
847 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; 843 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)};
848 844
849 selector_->AppendQueueToService(1); 845 selector_->AppendQueueToService(1);
850 selector_->AppendQueueToService(1); 846 selector_->AppendQueueToService(1);
851 selector_->AppendQueueToService(1); 847 selector_->AppendQueueToService(1);
852 selector_->AppendQueueToService(0); 848 selector_->AppendQueueToService(0);
853 selector_->AppendQueueToService(0); 849 selector_->AppendQueueToService(0);
854 850
855 // Check that a task which posts a task to an auto pump after wakeup queue 851 // Check that a task which posts a task to an auto pump after wakeup queue
856 // doesn't cause the queue to wake up. 852 // doesn't cause the queue to wake up.
857 base::Closure after_wakeup_task_1 = base::Bind(&TestTask, 1, &run_order); 853 base::Closure after_wakeup_task_1 = base::Bind(&TestTask, 1, &run_order);
858 base::Closure after_wakeup_task_2 = base::Bind(&TestTask, 2, &run_order); 854 base::Closure after_wakeup_task_2 = base::Bind(&TestTask, 2, &run_order);
859 runners[1]->PostTask( 855 runners[1]->PostTask(
860 FROM_HERE, 856 FROM_HERE, base::Bind(&TestPostingTask, runners[0], after_wakeup_task_1));
861 base::Bind(&TestPostingTask, runners[0], after_wakeup_task_1));
862 runners[1]->PostTask( 857 runners[1]->PostTask(
863 FROM_HERE, 858 FROM_HERE, base::Bind(&TestPostingTask, runners[0], after_wakeup_task_2));
864 base::Bind(&TestPostingTask, runners[0], after_wakeup_task_2));
865 test_task_runner_->RunUntilIdle(); 859 test_task_runner_->RunUntilIdle();
866 EXPECT_TRUE(run_order.empty()); 860 EXPECT_TRUE(run_order.empty());
867 861
868 // Wake up the queue. 862 // Wake up the queue.
869 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); 863 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
870 test_task_runner_->RunUntilIdle(); 864 test_task_runner_->RunUntilIdle();
871 EXPECT_THAT(run_order, ElementsAre(3, 1, 2)); 865 EXPECT_THAT(run_order, ElementsAre(3, 1, 2));
872 } 866 }
873 867
874 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupBecomesQuiescent) { 868 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupBecomesQuiescent) {
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
1035 runners[0]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay1); 1029 runners[0]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay1);
1036 runners[1]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay2); 1030 runners[1]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay2);
1037 runners[2]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay3); 1031 runners[2]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay3);
1038 1032
1039 EXPECT_EQ(now_src_->Now() + delay2, 1033 EXPECT_EQ(now_src_->Now() + delay2,
1040 manager_->NextPendingDelayedTaskRunTime()); 1034 manager_->NextPendingDelayedTaskRunTime());
1041 } 1035 }
1042 1036
1043 } // namespace 1037 } // namespace
1044 } // namespace content 1038 } // namespace content
1045
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698