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

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: Build fix. 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/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 624 matching lines...) Expand 10 before | Expand all | Expand 10 after
648 test_task_runner_->RunUntilIdle(); 649 test_task_runner_->RunUntilIdle();
649 // This still shouldn't wake TQM as manual queue was not pumped. 650 // This still shouldn't wake TQM as manual queue was not pumped.
650 EXPECT_TRUE(run_order.empty()); 651 EXPECT_TRUE(run_order.empty());
651 652
652 manager_->PumpQueue(1); 653 manager_->PumpQueue(1);
653 test_task_runner_->RunUntilIdle(); 654 test_task_runner_->RunUntilIdle();
654 // Executing a task on an auto pumped queue should wake the TQM. 655 // Executing a task on an auto pumped queue should wake the TQM.
655 EXPECT_THAT(run_order, ElementsAre(2, 1)); 656 EXPECT_THAT(run_order, ElementsAre(2, 1));
656 } 657 }
657 658
659 class MockTaskObserver : public base::MessageLoop::TaskObserver {
660 public:
661 MOCK_METHOD1(DidProcessTask, void(const base::PendingTask& task));
662 MOCK_METHOD1(WillProcessTask, void(const base::PendingTask& task));
663 };
664
665 TEST_F(TaskQueueManagerTest, TaskObserverAdding) {
666 InitializeWithRealMessageLoop(1u);
667 MockTaskObserver observer;
668
669 manager_->SetWorkBatchSize(2);
670 manager_->AddTaskObserver(&observer);
671
672 std::vector<int> run_order;
673 scoped_refptr<base::SingleThreadTaskRunner> runner =
674 manager_->TaskRunnerForQueue(0);
675
676 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
677 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
678
679 selector_->AppendQueueToService(0);
680 selector_->AppendQueueToService(0);
681
682 // Two pairs of callbacks for the tasks above plus another one for the
683 // DoWork() posted by the task queue manager.
684 EXPECT_CALL(observer, WillProcessTask(_)).Times(3);
685 EXPECT_CALL(observer, DidProcessTask(_)).Times(3);
686 message_loop_->RunUntilIdle();
687 }
688
689 TEST_F(TaskQueueManagerTest, TaskObserverRemoving) {
690 InitializeWithRealMessageLoop(1u);
691 MockTaskObserver observer;
692 manager_->SetWorkBatchSize(2);
693 manager_->AddTaskObserver(&observer);
694 manager_->RemoveTaskObserver(&observer);
695
696 std::vector<int> run_order;
697 scoped_refptr<base::SingleThreadTaskRunner> runner =
698 manager_->TaskRunnerForQueue(0);
699
700 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
701
702 EXPECT_CALL(observer, WillProcessTask(_)).Times(0);
703 EXPECT_CALL(observer, DidProcessTask(_)).Times(0);
704
705 selector_->AppendQueueToService(0);
706 message_loop_->RunUntilIdle();
707 }
708
709 void RemoveObserverTask(TaskQueueManager* manager,
710 base::MessageLoop::TaskObserver* observer) {
711 manager->RemoveTaskObserver(observer);
712 }
713
714 TEST_F(TaskQueueManagerTest, TaskObserverRemovingInsideTask) {
715 InitializeWithRealMessageLoop(1u);
716 MockTaskObserver observer;
717 manager_->SetWorkBatchSize(3);
718 manager_->AddTaskObserver(&observer);
719
720 scoped_refptr<base::SingleThreadTaskRunner> runner =
721 manager_->TaskRunnerForQueue(0);
722 runner->PostTask(FROM_HERE,
723 base::Bind(&RemoveObserverTask, manager_.get(), &observer));
724
725 selector_->AppendQueueToService(0);
726
727 EXPECT_CALL(observer, WillProcessTask(_)).Times(1);
728 EXPECT_CALL(observer, DidProcessTask(_)).Times(0);
729 message_loop_->RunUntilIdle();
730 }
731
658 } // namespace 732 } // namespace
659 } // namespace content 733 } // namespace content
660 734
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