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 "components/scheduler/child/task_queue_manager.h" | 5 #include "components/scheduler/base/task_queue_manager.h" |
6 | 6 |
7 #include "base/location.h" | 7 #include "base/location.h" |
8 #include "base/run_loop.h" | 8 #include "base/run_loop.h" |
9 #include "base/single_thread_task_runner.h" | 9 #include "base/single_thread_task_runner.h" |
10 #include "base/test/simple_test_tick_clock.h" | 10 #include "base/test/simple_test_tick_clock.h" |
11 #include "base/threading/thread.h" | 11 #include "base/threading/thread.h" |
12 #include "cc/test/ordered_simple_task_runner.h" | 12 #include "cc/test/ordered_simple_task_runner.h" |
13 #include "components/scheduler/child/nestable_task_runner_for_test.h" | 13 #include "components/scheduler/base/nestable_task_runner_for_test.h" |
14 #include "components/scheduler/child/scheduler_task_runner_delegate_impl.h" | 14 #include "components/scheduler/base/task_queue_impl.h" |
15 #include "components/scheduler/child/task_queue_impl.h" | 15 #include "components/scheduler/base/task_queue_selector.h" |
16 #include "components/scheduler/child/task_queue_selector.h" | 16 #include "components/scheduler/base/task_queue_sets.h" |
17 #include "components/scheduler/child/task_queue_sets.h" | 17 #include "components/scheduler/base/test_always_fail_time_source.h" |
18 #include "components/scheduler/child/test_time_source.h" | 18 #include "components/scheduler/base/test_time_source.h" |
19 #include "components/scheduler/test/test_always_fail_time_source.h" | |
20 #include "testing/gmock/include/gmock/gmock.h" | 19 #include "testing/gmock/include/gmock/gmock.h" |
21 | 20 |
22 using testing::ElementsAre; | 21 using testing::ElementsAre; |
23 using testing::_; | 22 using testing::_; |
24 | 23 |
25 namespace scheduler { | 24 namespace scheduler { |
26 | 25 |
| 26 class MessageLoopTaskRunner : public NestableTaskRunnerForTest { |
| 27 public: |
| 28 static scoped_refptr<MessageLoopTaskRunner> Create() { |
| 29 return make_scoped_refptr(new MessageLoopTaskRunner()); |
| 30 } |
| 31 |
| 32 // NestableTaskRunner implementation. |
| 33 bool IsNested() const override { |
| 34 return base::MessageLoop::current()->IsNested(); |
| 35 } |
| 36 |
| 37 private: |
| 38 MessageLoopTaskRunner() |
| 39 : NestableTaskRunnerForTest(base::MessageLoop::current()->task_runner()) { |
| 40 } |
| 41 ~MessageLoopTaskRunner() override {} |
| 42 }; |
| 43 |
27 class TaskQueueManagerTest : public testing::Test { | 44 class TaskQueueManagerTest : public testing::Test { |
28 public: | 45 public: |
29 void DeleteTaskQueueManager() { manager_.reset(); } | 46 void DeleteTaskQueueManager() { manager_.reset(); } |
30 | 47 |
31 protected: | 48 protected: |
32 void Initialize(size_t num_queues) { | 49 void Initialize(size_t num_queues) { |
33 now_src_.reset(new base::SimpleTestTickClock()); | 50 now_src_.reset(new base::SimpleTestTickClock()); |
34 now_src_->Advance(base::TimeDelta::FromMicroseconds(1000)); | 51 now_src_->Advance(base::TimeDelta::FromMicroseconds(1000)); |
35 test_task_runner_ = make_scoped_refptr( | 52 test_task_runner_ = make_scoped_refptr( |
36 new cc::OrderedSimpleTaskRunner(now_src_.get(), false)); | 53 new cc::OrderedSimpleTaskRunner(now_src_.get(), false)); |
37 main_task_runner_ = | 54 main_task_runner_ = |
38 NestableTaskRunnerForTest::Create(test_task_runner_.get()); | 55 NestableTaskRunnerForTest::Create(test_task_runner_.get()); |
39 manager_ = make_scoped_ptr(new TaskQueueManager( | 56 manager_ = make_scoped_ptr(new TaskQueueManager( |
40 main_task_runner_, "test.scheduler", "test.scheduler.debug")); | 57 main_task_runner_, "test.scheduler", "test.scheduler.debug")); |
41 manager_->SetTimeSourceForTesting( | 58 manager_->SetTimeSourceForTesting( |
42 make_scoped_ptr(new TestTimeSource(now_src_.get()))); | 59 make_scoped_ptr(new TestTimeSource(now_src_.get()))); |
43 | 60 |
44 for (size_t i = 0; i < num_queues; i++) | 61 for (size_t i = 0; i < num_queues; i++) |
45 runners_.push_back(manager_->NewTaskQueue(TaskQueue::Spec("test_queue"))); | 62 runners_.push_back(manager_->NewTaskQueue(TaskQueue::Spec("test_queue"))); |
46 } | 63 } |
47 | 64 |
48 void InitializeWithRealMessageLoop(size_t num_queues) { | 65 void InitializeWithRealMessageLoop(size_t num_queues) { |
49 message_loop_.reset(new base::MessageLoop()); | 66 message_loop_.reset(new base::MessageLoop()); |
50 manager_ = make_scoped_ptr(new TaskQueueManager( | 67 manager_ = make_scoped_ptr( |
51 SchedulerTaskRunnerDelegateImpl::Create(message_loop_.get()), | 68 new TaskQueueManager(MessageLoopTaskRunner::Create(), "test.scheduler", |
52 "test.scheduler", "test.scheduler.debug")); | 69 "test.scheduler.debug")); |
53 | 70 |
54 for (size_t i = 0; i < num_queues; i++) | 71 for (size_t i = 0; i < num_queues; i++) |
55 runners_.push_back(manager_->NewTaskQueue(TaskQueue::Spec("test_queue"))); | 72 runners_.push_back(manager_->NewTaskQueue(TaskQueue::Spec("test_queue"))); |
56 } | 73 } |
57 | 74 |
58 scoped_ptr<base::MessageLoop> message_loop_; | 75 scoped_ptr<base::MessageLoop> message_loop_; |
59 scoped_ptr<base::SimpleTestTickClock> now_src_; | 76 scoped_ptr<base::SimpleTestTickClock> now_src_; |
60 scoped_refptr<NestableTaskRunnerForTest> main_task_runner_; | 77 scoped_refptr<NestableTaskRunnerForTest> main_task_runner_; |
61 scoped_refptr<cc::OrderedSimpleTaskRunner> test_task_runner_; | 78 scoped_refptr<cc::OrderedSimpleTaskRunner> test_task_runner_; |
62 scoped_ptr<TaskQueueManager> manager_; | 79 scoped_ptr<TaskQueueManager> manager_; |
63 std::vector<scoped_refptr<internal::TaskQueueImpl>> runners_; | 80 std::vector<scoped_refptr<internal::TaskQueueImpl>> runners_; |
64 }; | 81 }; |
65 | 82 |
66 void PostFromNestedRunloop(base::MessageLoop* message_loop, | 83 void PostFromNestedRunloop(base::MessageLoop* message_loop, |
67 base::SingleThreadTaskRunner* runner, | 84 base::SingleThreadTaskRunner* runner, |
68 std::vector<std::pair<base::Closure, bool>>* tasks) { | 85 std::vector<std::pair<base::Closure, bool>>* tasks) { |
69 base::MessageLoop::ScopedNestableTaskAllower allow(message_loop); | 86 base::MessageLoop::ScopedNestableTaskAllower allow(message_loop); |
70 for (std::pair<base::Closure, bool>& pair : *tasks) { | 87 for (std::pair<base::Closure, bool>& pair : *tasks) { |
71 if (pair.second) { | 88 if (pair.second) { |
72 runner->PostTask(FROM_HERE, pair.first); | 89 runner->PostTask(FROM_HERE, pair.first); |
73 } else { | 90 } else { |
74 runner->PostNonNestableTask(FROM_HERE, pair.first); | 91 runner->PostNonNestableTask(FROM_HERE, pair.first); |
75 } | 92 } |
76 } | 93 } |
77 message_loop->RunUntilIdle(); | 94 message_loop->RunUntilIdle(); |
78 } | 95 } |
79 | 96 |
80 void NullTask() { | 97 void NullTask() {} |
81 } | |
82 | 98 |
83 void TestTask(int value, std::vector<int>* out_result) { | 99 void TestTask(int value, std::vector<int>* out_result) { |
84 out_result->push_back(value); | 100 out_result->push_back(value); |
85 } | 101 } |
86 | 102 |
87 TEST_F(TaskQueueManagerTest, SingleQueuePosting) { | 103 TEST_F(TaskQueueManagerTest, SingleQueuePosting) { |
88 Initialize(1u); | 104 Initialize(1u); |
89 | 105 |
90 std::vector<int> run_order; | 106 std::vector<int> run_order; |
91 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 107 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
(...skipping 12 matching lines...) Expand all Loading... |
104 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); | 120 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); |
105 runners_[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); | 121 runners_[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); |
106 runners_[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order)); | 122 runners_[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order)); |
107 runners_[2]->PostTask(FROM_HERE, base::Bind(&TestTask, 5, &run_order)); | 123 runners_[2]->PostTask(FROM_HERE, base::Bind(&TestTask, 5, &run_order)); |
108 runners_[2]->PostTask(FROM_HERE, base::Bind(&TestTask, 6, &run_order)); | 124 runners_[2]->PostTask(FROM_HERE, base::Bind(&TestTask, 6, &run_order)); |
109 | 125 |
110 test_task_runner_->RunUntilIdle(); | 126 test_task_runner_->RunUntilIdle(); |
111 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4, 5, 6)); | 127 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4, 5, 6)); |
112 } | 128 } |
113 | 129 |
114 void NopTask() { | 130 void NopTask() {} |
115 } | |
116 | 131 |
117 TEST_F(TaskQueueManagerTest, NowNotCalledWhenThereAreNoDelayedTasks) { | 132 TEST_F(TaskQueueManagerTest, NowNotCalledWhenThereAreNoDelayedTasks) { |
118 Initialize(3u); | 133 Initialize(3u); |
119 | 134 |
120 manager_->SetTimeSourceForTesting( | 135 manager_->SetTimeSourceForTesting( |
121 make_scoped_ptr(new TestAlwaysFailTimeSource())); | 136 make_scoped_ptr(new TestAlwaysFailTimeSource())); |
122 | 137 |
123 runners_[0]->PostTask(FROM_HERE, base::Bind(&NopTask)); | 138 runners_[0]->PostTask(FROM_HERE, base::Bind(&NopTask)); |
124 runners_[0]->PostTask(FROM_HERE, base::Bind(&NopTask)); | 139 runners_[0]->PostTask(FROM_HERE, base::Bind(&NopTask)); |
125 runners_[1]->PostTask(FROM_HERE, base::Bind(&NopTask)); | 140 runners_[1]->PostTask(FROM_HERE, base::Bind(&NopTask)); |
(...skipping 1159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1285 scoped_refptr<internal::TaskQueueImpl> task_queue = | 1300 scoped_refptr<internal::TaskQueueImpl> task_queue = |
1286 manager_->NewTaskQueue(TaskQueue::Spec("test_queue")); | 1301 manager_->NewTaskQueue(TaskQueue::Spec("test_queue")); |
1287 | 1302 |
1288 EXPECT_CALL(observer, OnUnregisterTaskQueue(_)).Times(1); | 1303 EXPECT_CALL(observer, OnUnregisterTaskQueue(_)).Times(1); |
1289 task_queue->UnregisterTaskQueue(); | 1304 task_queue->UnregisterTaskQueue(); |
1290 | 1305 |
1291 manager_->SetObserver(nullptr); | 1306 manager_->SetObserver(nullptr); |
1292 } | 1307 } |
1293 | 1308 |
1294 } // namespace scheduler | 1309 } // namespace scheduler |
OLD | NEW |