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" | |
9 #include "content/renderer/scheduler/task_queue_selector.h" | 10 #include "content/renderer/scheduler/task_queue_selector.h" |
10 #include "testing/gmock/include/gmock/gmock.h" | 11 #include "testing/gmock/include/gmock/gmock.h" |
11 | 12 |
12 using testing::ElementsAre; | 13 using testing::ElementsAre; |
13 | 14 |
14 namespace content { | 15 namespace content { |
15 namespace { | 16 namespace { |
16 | 17 |
17 class SelectorForTest : public TaskQueueSelector { | 18 class SelectorForTest : public TaskQueueSelector { |
18 public: | 19 public: |
(...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
473 runner->PostTask( | 474 runner->PostTask( |
474 FROM_HERE, base::Bind(&PostFromNestedRunloop, message_loop_.get(), runner, | 475 FROM_HERE, base::Bind(&PostFromNestedRunloop, message_loop_.get(), runner, |
475 base::Unretained(&tasks_to_post_from_nested_loop))); | 476 base::Unretained(&tasks_to_post_from_nested_loop))); |
476 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); | 477 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); |
477 | 478 |
478 message_loop_->RunUntilIdle(); | 479 message_loop_->RunUntilIdle(); |
479 | 480 |
480 EXPECT_THAT(run_order, ElementsAre(0, 2, 1)); | 481 EXPECT_THAT(run_order, ElementsAre(0, 2, 1)); |
481 } | 482 } |
482 | 483 |
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 namespace { | |
rmcilroy
2015/01/21 12:18:26
Do you need the anonymous namespace? (You don't u
Sami
2015/01/21 14:31:16
Ah, thanks, this is all in an anonymous namespace
| |
516 void AdvanceNow(int value, | |
rmcilroy
2015/01/21 12:18:26
nit - AdvanceNowTestTask
Sami
2015/01/21 14:31:16
Done.
| |
517 std::vector<int>* out_result, | |
518 scoped_refptr<cc::TestNowSource> time_source, | |
519 base::TimeDelta delta) { | |
520 TestTask(value, out_result); | |
521 time_source->AdvanceNow(delta); | |
522 } | |
523 } // namespace | |
524 | |
525 TEST_F(TaskQueueManagerTest, InterruptWorkBatchForDelayedTask) { | |
526 scoped_refptr<cc::TestNowSource> clock(cc::TestNowSource::Create()); | |
527 Initialize(1u); | |
528 | |
529 manager_->SetWorkBatchSize(2); | |
530 manager_->SetTimeSourceForTesting(clock); | |
531 | |
532 std::vector<int> run_order; | |
533 scoped_refptr<base::SingleThreadTaskRunner> runner = | |
534 manager_->TaskRunnerForQueue(0); | |
535 | |
536 selector_->AppendQueueToService(0); | |
537 selector_->AppendQueueToService(0); | |
538 selector_->AppendQueueToService(0); | |
539 | |
540 base::TimeDelta delta(base::TimeDelta::FromMilliseconds(10)); | |
541 runner->PostTask(FROM_HERE, | |
542 base::Bind(&AdvanceNow, 2, &run_order, clock, delta)); | |
543 runner->PostTask(FROM_HERE, | |
544 base::Bind(&AdvanceNow, 3, &run_order, clock, delta)); | |
545 | |
546 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(5)); | |
547 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), | |
548 delay); | |
549 | |
550 // At this point we have two posted tasks: one for DoWork and one of the | |
551 // delayed task. Only the first non-delayed task should get executed because | |
552 // the work batch is interrupted by the pending delayed task. | |
553 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 2u); | |
554 test_task_runner_->RunPendingTasks(); | |
555 EXPECT_THAT(run_order, ElementsAre(2)); | |
556 | |
557 // Running all remaining tasks should execute both pending tasks. | |
558 test_task_runner_->RunUntilIdle(); | |
559 EXPECT_THAT(run_order, ElementsAre(2, 3, 1)); | |
560 } | |
561 | |
483 } // namespace | 562 } // namespace |
484 } // namespace content | 563 } // namespace content |
OLD | NEW |