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

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

Issue 922733002: scheduler: Implement task observers (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Implemented Ross's simplification idea. Created 5 years, 10 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/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 "cc/test/test_now_source.h"
10 #include "content/renderer/scheduler/task_queue_selector.h" 10 #include "content/renderer/scheduler/task_queue_selector.h"
11 #include "testing/gmock/include/gmock/gmock.h" 11 #include "testing/gmock/include/gmock/gmock.h"
12 12
13 using testing::ElementsAre; 13 using testing::ElementsAre;
14 using testing::_;
14 15
15 namespace content { 16 namespace content {
16 namespace { 17 namespace {
17 18
18 class SelectorForTest : public TaskQueueSelector { 19 class SelectorForTest : public TaskQueueSelector {
19 public: 20 public:
20 SelectorForTest() {} 21 SelectorForTest() {}
21 22
22 void RegisterWorkQueues( 23 void RegisterWorkQueues(
23 const std::vector<const base::TaskQueue*>& work_queues) override { 24 const std::vector<const base::TaskQueue*>& work_queues) override {
(...skipping 551 matching lines...) Expand 10 before | Expand all | Expand 10 after
575 // the work batch is interrupted by the pending delayed task. 576 // the work batch is interrupted by the pending delayed task.
576 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 2u); 577 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 2u);
577 test_task_runner_->RunPendingTasks(); 578 test_task_runner_->RunPendingTasks();
578 EXPECT_THAT(run_order, ElementsAre(2)); 579 EXPECT_THAT(run_order, ElementsAre(2));
579 580
580 // Running all remaining tasks should execute both pending tasks. 581 // Running all remaining tasks should execute both pending tasks.
581 test_task_runner_->RunUntilIdle(); 582 test_task_runner_->RunUntilIdle();
582 EXPECT_THAT(run_order, ElementsAre(2, 3, 1)); 583 EXPECT_THAT(run_order, ElementsAre(2, 3, 1));
583 } 584 }
584 585
586 class MockTaskObserver : public base::MessageLoop::TaskObserver {
587 public:
588 MOCK_METHOD1(DidProcessTask, void(const base::PendingTask& task));
589 MOCK_METHOD1(WillProcessTask, void(const base::PendingTask& task));
590 };
591
592 TEST_F(TaskQueueManagerTest, TaskObserverAdding) {
593 Initialize(1u);
594 MockTaskObserver observer;
595
596 manager_->SetWorkBatchSize(2);
597 manager_->AddTaskObserver(&observer);
598
599 std::vector<int> run_order;
600 scoped_refptr<base::SingleThreadTaskRunner> runner =
601 manager_->TaskRunnerForQueue(0);
602
603 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
604 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
605
606 selector_->AppendQueueToService(0);
607 selector_->AppendQueueToService(0);
608
609 // The observer should be called once because the first and last
610 // notifications are filtered out.
rmcilroy 2015/02/23 22:41:43 These test results now look a bit strange - lookin
Sami 2015/02/24 14:39:20 Yeah, I suppose that would be clearer because gene
611 EXPECT_CALL(observer, WillProcessTask(_)).Times(1);
612 EXPECT_CALL(observer, DidProcessTask(_)).Times(1);
613 test_task_runner_->RunUntilIdle();
614 }
615
616 TEST_F(TaskQueueManagerTest, TaskObserverRemoving) {
617 Initialize(1u);
618 MockTaskObserver observer;
619 manager_->SetWorkBatchSize(2);
620 manager_->AddTaskObserver(&observer);
621 manager_->RemoveTaskObserver(&observer);
622
623 std::vector<int> run_order;
624 scoped_refptr<base::SingleThreadTaskRunner> runner =
625 manager_->TaskRunnerForQueue(0);
626
627 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
628
629 EXPECT_CALL(observer, WillProcessTask(_)).Times(0);
630 EXPECT_CALL(observer, DidProcessTask(_)).Times(0);
631
632 selector_->AppendQueueToService(0);
633 test_task_runner_->RunUntilIdle();
634 }
635
636 void RemoveObserverTask(TaskQueueManager* manager,
637 base::MessageLoop::TaskObserver* observer) {
638 manager->RemoveTaskObserver(observer);
639 }
640
641 void NoOpTask() {
642 }
643
644 TEST_F(TaskQueueManagerTest, TaskObserverRemovingInsideTask) {
645 Initialize(1u);
646 MockTaskObserver observer;
647 manager_->SetWorkBatchSize(3);
648 manager_->AddTaskObserver(&observer);
649
650 scoped_refptr<base::SingleThreadTaskRunner> runner =
651 manager_->TaskRunnerForQueue(0);
652 runner->PostTask(FROM_HERE, base::Bind(&NoOpTask));
653 runner->PostTask(FROM_HERE,
654 base::Bind(&RemoveObserverTask, manager_.get(), &observer));
655 runner->PostTask(FROM_HERE, base::Bind(&NoOpTask));
656
657 selector_->AppendQueueToService(0);
658 selector_->AppendQueueToService(0);
659 selector_->AppendQueueToService(0);
660
661 // One call to DidProcessTask from the first no-op task and once call to
662 // WillProcessTask before the RemoveObserverTask.
663 EXPECT_CALL(observer, WillProcessTask(_)).Times(1);
664 EXPECT_CALL(observer, DidProcessTask(_)).Times(1);
665 test_task_runner_->RunUntilIdle();
666 }
667
585 } // namespace 668 } // namespace
586 } // namespace content 669 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/scheduler/task_queue_manager.cc ('k') | content/renderer/scheduler/webthread_impl_for_scheduler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698