OLD | NEW |
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/renderer/scheduler/task_queue_manager.h" |
6 | 6 |
7 #include "base/test/test_simple_task_runner.h" | 7 #include "base/test/test_simple_task_runner.h" |
8 #include "base/threading/thread.h" | 8 #include "base/threading/thread.h" |
9 #include "cc/test/test_now_source.h" | |
10 #include "content/renderer/scheduler/task_queue_selector.h" | 9 #include "content/renderer/scheduler/task_queue_selector.h" |
11 #include "testing/gmock/include/gmock/gmock.h" | 10 #include "testing/gmock/include/gmock/gmock.h" |
12 | 11 |
13 using testing::ElementsAre; | 12 using testing::ElementsAre; |
14 | 13 |
15 namespace content { | 14 namespace content { |
16 namespace { | 15 namespace { |
17 | 16 |
18 class SelectorForTest : public TaskQueueSelector { | 17 class SelectorForTest : public TaskQueueSelector { |
19 public: | 18 public: |
(...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
474 runner->PostTask( | 473 runner->PostTask( |
475 FROM_HERE, base::Bind(&PostFromNestedRunloop, message_loop_.get(), runner, | 474 FROM_HERE, base::Bind(&PostFromNestedRunloop, message_loop_.get(), runner, |
476 base::Unretained(&tasks_to_post_from_nested_loop))); | 475 base::Unretained(&tasks_to_post_from_nested_loop))); |
477 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); | 476 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); |
478 | 477 |
479 message_loop_->RunUntilIdle(); | 478 message_loop_->RunUntilIdle(); |
480 | 479 |
481 EXPECT_THAT(run_order, ElementsAre(0, 2, 1)); | 480 EXPECT_THAT(run_order, ElementsAre(0, 2, 1)); |
482 } | 481 } |
483 | 482 |
484 TEST_F(TaskQueueManagerTest, WorkBatching) { | |
485 Initialize(1u); | |
486 | |
487 manager_->SetWorkBatchSize(2); | |
488 | |
489 std::vector<int> run_order; | |
490 scoped_refptr<base::SingleThreadTaskRunner> runner = | |
491 manager_->TaskRunnerForQueue(0); | |
492 | |
493 selector_->AppendQueueToService(0); | |
494 selector_->AppendQueueToService(0); | |
495 selector_->AppendQueueToService(0); | |
496 selector_->AppendQueueToService(0); | |
497 | |
498 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | |
499 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); | |
500 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); | |
501 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order)); | |
502 | |
503 // Running one task in the host message loop should cause two posted tasks to | |
504 // get executed. | |
505 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 1u); | |
506 test_task_runner_->RunPendingTasks(); | |
507 EXPECT_THAT(run_order, ElementsAre(1, 2)); | |
508 | |
509 // The second task runs the remaining two posted tasks. | |
510 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 1u); | |
511 test_task_runner_->RunPendingTasks(); | |
512 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4)); | |
513 } | |
514 | |
515 void AdvanceNowTestTask(int value, | |
516 std::vector<int>* out_result, | |
517 scoped_refptr<cc::TestNowSource> time_source, | |
518 base::TimeDelta delta) { | |
519 TestTask(value, out_result); | |
520 time_source->AdvanceNow(delta); | |
521 } | |
522 | |
523 TEST_F(TaskQueueManagerTest, InterruptWorkBatchForDelayedTask) { | |
524 scoped_refptr<cc::TestNowSource> clock(cc::TestNowSource::Create()); | |
525 Initialize(1u); | |
526 | |
527 manager_->SetWorkBatchSize(2); | |
528 manager_->SetTimeSourceForTesting(clock); | |
529 | |
530 std::vector<int> run_order; | |
531 scoped_refptr<base::SingleThreadTaskRunner> runner = | |
532 manager_->TaskRunnerForQueue(0); | |
533 | |
534 selector_->AppendQueueToService(0); | |
535 selector_->AppendQueueToService(0); | |
536 selector_->AppendQueueToService(0); | |
537 | |
538 base::TimeDelta delta(base::TimeDelta::FromMilliseconds(10)); | |
539 runner->PostTask( | |
540 FROM_HERE, base::Bind(&AdvanceNowTestTask, 2, &run_order, clock, delta)); | |
541 runner->PostTask( | |
542 FROM_HERE, base::Bind(&AdvanceNowTestTask, 3, &run_order, clock, delta)); | |
543 | |
544 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(5)); | |
545 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), | |
546 delay); | |
547 | |
548 // At this point we have two posted tasks: one for DoWork and one of the | |
549 // delayed task. Only the first non-delayed task should get executed because | |
550 // the work batch is interrupted by the pending delayed task. | |
551 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 2u); | |
552 test_task_runner_->RunPendingTasks(); | |
553 EXPECT_THAT(run_order, ElementsAre(2)); | |
554 | |
555 // Running all remaining tasks should execute both pending tasks. | |
556 test_task_runner_->RunUntilIdle(); | |
557 EXPECT_THAT(run_order, ElementsAre(2, 3, 1)); | |
558 } | |
559 | |
560 } // namespace | 483 } // namespace |
561 } // namespace content | 484 } // namespace content |
OLD | NEW |