| 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" | |
| 8 #include "base/threading/thread.h" | 7 #include "base/threading/thread.h" |
| 8 #include "cc/test/ordered_simple_task_runner.h" |
| 9 #include "cc/test/test_now_source.h" | 9 #include "cc/test/test_now_source.h" |
| 10 #include "content/renderer/scheduler/nestable_task_runner_for_test.h" | 10 #include "content/renderer/scheduler/nestable_task_runner_for_test.h" |
| 11 #include "content/renderer/scheduler/renderer_scheduler_message_loop_delegate.h" | 11 #include "content/renderer/scheduler/renderer_scheduler_message_loop_delegate.h" |
| 12 #include "content/renderer/scheduler/task_queue_selector.h" | 12 #include "content/renderer/scheduler/task_queue_selector.h" |
| 13 #include "testing/gmock/include/gmock/gmock.h" | 13 #include "testing/gmock/include/gmock/gmock.h" |
| 14 | 14 |
| 15 using testing::ElementsAre; | 15 using testing::ElementsAre; |
| 16 using testing::_; | 16 using testing::_; |
| 17 | 17 |
| 18 namespace content { | 18 namespace content { |
| 19 namespace { | 19 namespace { |
| 20 | 20 |
| 21 class SelectorForTest : public TaskQueueSelector { | 21 class SelectorForTest : public TaskQueueSelector { |
| 22 public: | 22 public: |
| 23 SelectorForTest() {} | 23 ~SelectorForTest() override {} |
| 24 |
| 25 virtual void AppendQueueToService(size_t queue_index) = 0; |
| 26 |
| 27 virtual const std::vector<const base::TaskQueue*>& work_queues() = 0; |
| 28 |
| 29 void AsValueInto(base::trace_event::TracedValue* state) const override {} |
| 30 }; |
| 31 |
| 32 // Always selects queue 0. |
| 33 class AutomaticSelectorForTest : public SelectorForTest { |
| 34 public: |
| 35 AutomaticSelectorForTest() {} |
| 36 ~AutomaticSelectorForTest() override {} |
| 24 | 37 |
| 25 void RegisterWorkQueues( | 38 void RegisterWorkQueues( |
| 26 const std::vector<const base::TaskQueue*>& work_queues) override { | 39 const std::vector<const base::TaskQueue*>& work_queues) override { |
| 40 work_queues_ = work_queues; |
| 41 } |
| 42 |
| 43 bool SelectWorkQueueToService(size_t* out_queue_index) override { |
| 44 for (size_t i = 0; i < work_queues_.size(); i++) { |
| 45 if (!work_queues_[i]->empty()) { |
| 46 *out_queue_index = i; |
| 47 return true; |
| 48 } |
| 49 } |
| 50 return false; |
| 51 } |
| 52 |
| 53 void AppendQueueToService(size_t queue_index) override { |
| 54 DCHECK(false) << "Not supported"; |
| 55 } |
| 56 |
| 57 const std::vector<const base::TaskQueue*>& work_queues() override { |
| 58 return work_queues_; |
| 59 } |
| 60 |
| 61 private: |
| 62 std::vector<const base::TaskQueue*> work_queues_; |
| 63 |
| 64 DISALLOW_COPY_AND_ASSIGN(AutomaticSelectorForTest); |
| 65 }; |
| 66 |
| 67 class ExplicitSelectorForTest : public SelectorForTest { |
| 68 public: |
| 69 ExplicitSelectorForTest() {} |
| 70 ~ExplicitSelectorForTest() override {} |
| 71 |
| 72 void RegisterWorkQueues( |
| 73 const std::vector<const base::TaskQueue*>& work_queues) override { |
| 27 work_queues_ = work_queues; | 74 work_queues_ = work_queues; |
| 28 } | 75 } |
| 29 | 76 |
| 30 bool SelectWorkQueueToService(size_t* out_queue_index) override { | 77 bool SelectWorkQueueToService(size_t* out_queue_index) override { |
| 31 if (queues_to_service_.empty()) | 78 if (queues_to_service_.empty()) |
| 32 return false; | 79 return false; |
| 33 *out_queue_index = queues_to_service_.front(); | 80 *out_queue_index = queues_to_service_.front(); |
| 34 queues_to_service_.pop_front(); | 81 queues_to_service_.pop_front(); |
| 35 return true; | 82 return true; |
| 36 } | 83 } |
| 37 | 84 |
| 38 void AppendQueueToService(size_t queue_index) { | 85 void AppendQueueToService(size_t queue_index) override { |
| 39 queues_to_service_.push_back(queue_index); | 86 queues_to_service_.push_back(queue_index); |
| 40 } | 87 } |
| 41 | 88 |
| 42 const std::vector<const base::TaskQueue*>& work_queues() { | 89 const std::vector<const base::TaskQueue*>& work_queues() override { |
| 43 return work_queues_; | 90 return work_queues_; |
| 44 } | 91 } |
| 45 | 92 |
| 46 void AsValueInto(base::trace_event::TracedValue* state) const override { | |
| 47 } | |
| 48 | |
| 49 private: | 93 private: |
| 50 std::deque<size_t> queues_to_service_; | 94 std::deque<size_t> queues_to_service_; |
| 51 std::vector<const base::TaskQueue*> work_queues_; | 95 std::vector<const base::TaskQueue*> work_queues_; |
| 52 | 96 |
| 53 DISALLOW_COPY_AND_ASSIGN(SelectorForTest); | 97 DISALLOW_COPY_AND_ASSIGN(ExplicitSelectorForTest); |
| 54 }; | 98 }; |
| 55 | 99 |
| 56 class TaskQueueManagerTest : public testing::Test { | 100 class TaskQueueManagerTest : public testing::Test { |
| 57 protected: | 101 protected: |
| 58 void Initialize(size_t num_queues) { | 102 enum class SelectorType { |
| 59 test_task_runner_ = make_scoped_refptr(new base::TestSimpleTaskRunner()); | 103 Automatic, |
| 60 selector_ = make_scoped_ptr(new SelectorForTest); | 104 Explicit, |
| 105 }; |
| 106 |
| 107 void Initialize(size_t num_queues, SelectorType type) { |
| 108 now_src_ = cc::TestNowSource::Create(1000); |
| 109 test_task_runner_ = |
| 110 make_scoped_refptr(new cc::OrderedSimpleTaskRunner(now_src_, false)); |
| 111 selector_ = make_scoped_ptr(createSelectorForTest(type)); |
| 61 manager_ = make_scoped_ptr(new TaskQueueManager( | 112 manager_ = make_scoped_ptr(new TaskQueueManager( |
| 62 num_queues, NestableTaskRunnerForTest::Create(test_task_runner_.get()), | 113 num_queues, NestableTaskRunnerForTest::Create(test_task_runner_.get()), |
| 63 selector_.get())); | 114 selector_.get())); |
| 115 manager_->SetTimeSourceForTesting(now_src_); |
| 116 |
| 64 EXPECT_EQ(num_queues, selector_->work_queues().size()); | 117 EXPECT_EQ(num_queues, selector_->work_queues().size()); |
| 65 } | 118 } |
| 66 | 119 |
| 67 void InitializeWithRealMessageLoop(size_t num_queues) { | 120 void InitializeWithRealMessageLoop(size_t num_queues, SelectorType type) { |
| 68 message_loop_.reset(new base::MessageLoop()); | 121 message_loop_.reset(new base::MessageLoop()); |
| 69 selector_ = make_scoped_ptr(new SelectorForTest); | 122 selector_ = make_scoped_ptr(createSelectorForTest(type)); |
| 70 manager_ = make_scoped_ptr(new TaskQueueManager( | 123 manager_ = make_scoped_ptr(new TaskQueueManager( |
| 71 num_queues, | 124 num_queues, |
| 72 RendererSchedulerMessageLoopDelegate::Create(message_loop_.get()), | 125 RendererSchedulerMessageLoopDelegate::Create(message_loop_.get()), |
| 73 selector_.get())); | 126 selector_.get())); |
| 74 EXPECT_EQ(num_queues, selector_->work_queues().size()); | 127 EXPECT_EQ(num_queues, selector_->work_queues().size()); |
| 75 } | 128 } |
| 76 | 129 |
| 77 scoped_refptr<base::TestSimpleTaskRunner> test_task_runner_; | 130 SelectorForTest* createSelectorForTest(SelectorType type) { |
| 131 switch (type) { |
| 132 case SelectorType::Automatic: |
| 133 return new AutomaticSelectorForTest(); |
| 134 |
| 135 case SelectorType::Explicit: |
| 136 return new ExplicitSelectorForTest(); |
| 137 } |
| 138 |
| 139 return nullptr; |
| 140 } |
| 141 |
| 142 scoped_refptr<cc::TestNowSource> now_src_; |
| 143 scoped_refptr<cc::OrderedSimpleTaskRunner> test_task_runner_; |
| 78 scoped_ptr<SelectorForTest> selector_; | 144 scoped_ptr<SelectorForTest> selector_; |
| 79 scoped_ptr<TaskQueueManager> manager_; | 145 scoped_ptr<TaskQueueManager> manager_; |
| 80 scoped_ptr<base::MessageLoop> message_loop_; | 146 scoped_ptr<base::MessageLoop> message_loop_; |
| 81 }; | 147 }; |
| 82 | 148 |
| 83 void PostFromNestedRunloop(base::MessageLoop* message_loop, | 149 void PostFromNestedRunloop(base::MessageLoop* message_loop, |
| 84 base::SingleThreadTaskRunner* runner, | 150 base::SingleThreadTaskRunner* runner, |
| 85 std::vector<std::pair<base::Closure, bool>>* tasks) { | 151 std::vector<std::pair<base::Closure, bool>>* tasks) { |
| 86 base::MessageLoop::ScopedNestableTaskAllower allow(message_loop); | 152 base::MessageLoop::ScopedNestableTaskAllower allow(message_loop); |
| 87 for (std::pair<base::Closure, bool>& pair : *tasks) { | 153 for (std::pair<base::Closure, bool>& pair : *tasks) { |
| 88 if (pair.second) { | 154 if (pair.second) { |
| 89 runner->PostTask(FROM_HERE, pair.first); | 155 runner->PostTask(FROM_HERE, pair.first); |
| 90 } else { | 156 } else { |
| 91 runner->PostNonNestableTask(FROM_HERE, pair.first); | 157 runner->PostNonNestableTask(FROM_HERE, pair.first); |
| 92 } | 158 } |
| 93 } | 159 } |
| 94 message_loop->RunUntilIdle(); | 160 message_loop->RunUntilIdle(); |
| 95 } | 161 } |
| 96 | 162 |
| 97 void TestTask(int value, std::vector<int>* out_result) { | 163 void TestTask(int value, std::vector<int>* out_result) { |
| 98 out_result->push_back(value); | 164 out_result->push_back(value); |
| 99 } | 165 } |
| 100 | 166 |
| 101 TEST_F(TaskQueueManagerTest, SingleQueuePosting) { | 167 TEST_F(TaskQueueManagerTest, SingleQueuePosting) { |
| 102 Initialize(1u); | 168 Initialize(1u, SelectorType::Automatic); |
| 103 | 169 |
| 104 std::vector<int> run_order; | 170 std::vector<int> run_order; |
| 105 scoped_refptr<base::SingleThreadTaskRunner> runner = | 171 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 106 manager_->TaskRunnerForQueue(0); | 172 manager_->TaskRunnerForQueue(0); |
| 107 | 173 |
| 108 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 174 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
| 109 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); | 175 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); |
| 110 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); | 176 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); |
| 111 | 177 |
| 112 selector_->AppendQueueToService(0); | |
| 113 selector_->AppendQueueToService(0); | |
| 114 selector_->AppendQueueToService(0); | |
| 115 | |
| 116 test_task_runner_->RunUntilIdle(); | 178 test_task_runner_->RunUntilIdle(); |
| 117 EXPECT_THAT(run_order, ElementsAre(1, 2, 3)); | 179 EXPECT_THAT(run_order, ElementsAre(1, 2, 3)); |
| 118 } | 180 } |
| 119 | 181 |
| 120 TEST_F(TaskQueueManagerTest, MultiQueuePosting) { | 182 TEST_F(TaskQueueManagerTest, MultiQueuePosting) { |
| 121 Initialize(3u); | 183 Initialize(3u, SelectorType::Explicit); |
| 122 | 184 |
| 123 std::vector<int> run_order; | 185 std::vector<int> run_order; |
| 124 scoped_refptr<base::SingleThreadTaskRunner> runners[3] = { | 186 scoped_refptr<base::SingleThreadTaskRunner> runners[3] = { |
| 125 manager_->TaskRunnerForQueue(0), | 187 manager_->TaskRunnerForQueue(0), |
| 126 manager_->TaskRunnerForQueue(1), | 188 manager_->TaskRunnerForQueue(1), |
| 127 manager_->TaskRunnerForQueue(2)}; | 189 manager_->TaskRunnerForQueue(2)}; |
| 128 | 190 |
| 129 selector_->AppendQueueToService(0); | 191 selector_->AppendQueueToService(0); |
| 130 selector_->AppendQueueToService(1); | 192 selector_->AppendQueueToService(1); |
| 131 selector_->AppendQueueToService(2); | 193 selector_->AppendQueueToService(2); |
| 132 selector_->AppendQueueToService(0); | 194 selector_->AppendQueueToService(0); |
| 133 selector_->AppendQueueToService(1); | 195 selector_->AppendQueueToService(1); |
| 134 selector_->AppendQueueToService(2); | 196 selector_->AppendQueueToService(2); |
| 135 | 197 |
| 136 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 198 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
| 137 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); | 199 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); |
| 138 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); | 200 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); |
| 139 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order)); | 201 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order)); |
| 140 runners[2]->PostTask(FROM_HERE, base::Bind(&TestTask, 5, &run_order)); | 202 runners[2]->PostTask(FROM_HERE, base::Bind(&TestTask, 5, &run_order)); |
| 141 runners[2]->PostTask(FROM_HERE, base::Bind(&TestTask, 6, &run_order)); | 203 runners[2]->PostTask(FROM_HERE, base::Bind(&TestTask, 6, &run_order)); |
| 142 | 204 |
| 143 test_task_runner_->RunUntilIdle(); | 205 test_task_runner_->RunUntilIdle(); |
| 144 EXPECT_THAT(run_order, ElementsAre(1, 3, 5, 2, 4, 6)); | 206 EXPECT_THAT(run_order, ElementsAre(1, 3, 5, 2, 4, 6)); |
| 145 } | 207 } |
| 146 | 208 |
| 209 void NopTask() { |
| 210 } |
| 211 |
| 212 TEST_F(TaskQueueManagerTest, NowNotCalledWhenThereAreNoDelayedTasks) { |
| 213 Initialize(3u, SelectorType::Explicit); |
| 214 |
| 215 scoped_refptr<cc::TestNowSource> now_src = cc::TestNowSource::Create(1000); |
| 216 manager_->SetTimeSourceForTesting(now_src); |
| 217 |
| 218 scoped_refptr<base::SingleThreadTaskRunner> runners[3] = { |
| 219 manager_->TaskRunnerForQueue(0), |
| 220 manager_->TaskRunnerForQueue(1), |
| 221 manager_->TaskRunnerForQueue(2)}; |
| 222 |
| 223 selector_->AppendQueueToService(0); |
| 224 selector_->AppendQueueToService(1); |
| 225 selector_->AppendQueueToService(2); |
| 226 selector_->AppendQueueToService(0); |
| 227 selector_->AppendQueueToService(1); |
| 228 selector_->AppendQueueToService(2); |
| 229 |
| 230 runners[0]->PostTask(FROM_HERE, base::Bind(&NopTask)); |
| 231 runners[0]->PostTask(FROM_HERE, base::Bind(&NopTask)); |
| 232 runners[1]->PostTask(FROM_HERE, base::Bind(&NopTask)); |
| 233 runners[1]->PostTask(FROM_HERE, base::Bind(&NopTask)); |
| 234 runners[2]->PostTask(FROM_HERE, base::Bind(&NopTask)); |
| 235 runners[2]->PostTask(FROM_HERE, base::Bind(&NopTask)); |
| 236 |
| 237 test_task_runner_->RunUntilIdle(); |
| 238 |
| 239 EXPECT_EQ(0, now_src->NumNowCalls()); |
| 240 } |
| 241 |
| 147 TEST_F(TaskQueueManagerTest, NonNestableTaskPosting) { | 242 TEST_F(TaskQueueManagerTest, NonNestableTaskPosting) { |
| 148 InitializeWithRealMessageLoop(1u); | 243 InitializeWithRealMessageLoop(1u, SelectorType::Automatic); |
| 149 | 244 |
| 150 std::vector<int> run_order; | 245 std::vector<int> run_order; |
| 151 scoped_refptr<base::SingleThreadTaskRunner> runner = | 246 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 152 manager_->TaskRunnerForQueue(0); | 247 manager_->TaskRunnerForQueue(0); |
| 153 | 248 |
| 154 selector_->AppendQueueToService(0); | |
| 155 | |
| 156 runner->PostNonNestableTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 249 runner->PostNonNestableTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
| 157 | 250 |
| 158 message_loop_->RunUntilIdle(); | 251 message_loop_->RunUntilIdle(); |
| 159 EXPECT_THAT(run_order, ElementsAre(1)); | 252 EXPECT_THAT(run_order, ElementsAre(1)); |
| 160 } | 253 } |
| 161 | 254 |
| 162 TEST_F(TaskQueueManagerTest, NonNestableTaskExecutesInExpectedOrder) { | 255 TEST_F(TaskQueueManagerTest, NonNestableTaskExecutesInExpectedOrder) { |
| 163 InitializeWithRealMessageLoop(1u); | 256 InitializeWithRealMessageLoop(1u, SelectorType::Automatic); |
| 164 | 257 |
| 165 std::vector<int> run_order; | 258 std::vector<int> run_order; |
| 166 scoped_refptr<base::SingleThreadTaskRunner> runner = | 259 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 167 manager_->TaskRunnerForQueue(0); | 260 manager_->TaskRunnerForQueue(0); |
| 168 | 261 |
| 169 selector_->AppendQueueToService(0); | |
| 170 selector_->AppendQueueToService(0); | |
| 171 selector_->AppendQueueToService(0); | |
| 172 selector_->AppendQueueToService(0); | |
| 173 selector_->AppendQueueToService(0); | |
| 174 | |
| 175 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 262 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
| 176 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); | 263 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); |
| 177 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); | 264 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); |
| 178 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order)); | 265 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order)); |
| 179 runner->PostNonNestableTask(FROM_HERE, base::Bind(&TestTask, 5, &run_order)); | 266 runner->PostNonNestableTask(FROM_HERE, base::Bind(&TestTask, 5, &run_order)); |
| 180 | 267 |
| 181 message_loop_->RunUntilIdle(); | 268 message_loop_->RunUntilIdle(); |
| 182 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4, 5)); | 269 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4, 5)); |
| 183 } | 270 } |
| 184 | 271 |
| 185 TEST_F(TaskQueueManagerTest, NonNestableTaskDoesntExecuteInNestedLoop) { | 272 TEST_F(TaskQueueManagerTest, NonNestableTaskDoesntExecuteInNestedLoop) { |
| 186 InitializeWithRealMessageLoop(1u); | 273 InitializeWithRealMessageLoop(1u, SelectorType::Automatic); |
| 187 | 274 |
| 188 std::vector<int> run_order; | 275 std::vector<int> run_order; |
| 189 scoped_refptr<base::SingleThreadTaskRunner> runner = | 276 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 190 manager_->TaskRunnerForQueue(0); | 277 manager_->TaskRunnerForQueue(0); |
| 191 | 278 |
| 192 selector_->AppendQueueToService(0); | |
| 193 selector_->AppendQueueToService(0); | |
| 194 selector_->AppendQueueToService(0); | |
| 195 selector_->AppendQueueToService(0); | |
| 196 selector_->AppendQueueToService(0); | |
| 197 selector_->AppendQueueToService(0); | |
| 198 | |
| 199 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 279 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
| 200 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); | 280 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); |
| 201 | 281 |
| 202 std::vector<std::pair<base::Closure, bool>> tasks_to_post_from_nested_loop; | 282 std::vector<std::pair<base::Closure, bool>> tasks_to_post_from_nested_loop; |
| 203 tasks_to_post_from_nested_loop.push_back( | 283 tasks_to_post_from_nested_loop.push_back( |
| 204 std::make_pair(base::Bind(&TestTask, 3, &run_order), false)); | 284 std::make_pair(base::Bind(&TestTask, 3, &run_order), false)); |
| 205 tasks_to_post_from_nested_loop.push_back( | 285 tasks_to_post_from_nested_loop.push_back( |
| 206 std::make_pair(base::Bind(&TestTask, 4, &run_order), true)); | 286 std::make_pair(base::Bind(&TestTask, 4, &run_order), true)); |
| 207 tasks_to_post_from_nested_loop.push_back( | 287 tasks_to_post_from_nested_loop.push_back( |
| 208 std::make_pair(base::Bind(&TestTask, 5, &run_order), true)); | 288 std::make_pair(base::Bind(&TestTask, 5, &run_order), true)); |
| 209 | 289 |
| 210 runner->PostTask( | 290 runner->PostTask( |
| 211 FROM_HERE, | 291 FROM_HERE, |
| 212 base::Bind(&PostFromNestedRunloop, message_loop_.get(), runner, | 292 base::Bind(&PostFromNestedRunloop, message_loop_.get(), runner, |
| 213 base::Unretained(&tasks_to_post_from_nested_loop))); | 293 base::Unretained(&tasks_to_post_from_nested_loop))); |
| 214 | 294 |
| 215 message_loop_->RunUntilIdle(); | 295 message_loop_->RunUntilIdle(); |
| 216 // Note we expect task 3 to run last because it's non-nestable. | 296 // Note we expect task 3 to run last because it's non-nestable. |
| 217 EXPECT_THAT(run_order, ElementsAre(1, 2, 4, 5, 3)); | 297 EXPECT_THAT(run_order, ElementsAre(1, 2, 4, 5, 3)); |
| 218 } | 298 } |
| 219 | 299 |
| 220 TEST_F(TaskQueueManagerTest, QueuePolling) { | 300 TEST_F(TaskQueueManagerTest, QueuePolling) { |
| 221 Initialize(1u); | 301 Initialize(1u, SelectorType::Automatic); |
| 222 | 302 |
| 223 std::vector<int> run_order; | 303 std::vector<int> run_order; |
| 224 scoped_refptr<base::SingleThreadTaskRunner> runner = | 304 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 225 manager_->TaskRunnerForQueue(0); | 305 manager_->TaskRunnerForQueue(0); |
| 226 | 306 |
| 227 EXPECT_TRUE(manager_->IsQueueEmpty(0)); | 307 EXPECT_TRUE(manager_->IsQueueEmpty(0)); |
| 228 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 308 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
| 229 EXPECT_FALSE(manager_->IsQueueEmpty(0)); | 309 EXPECT_FALSE(manager_->IsQueueEmpty(0)); |
| 230 | 310 |
| 231 selector_->AppendQueueToService(0); | |
| 232 test_task_runner_->RunUntilIdle(); | 311 test_task_runner_->RunUntilIdle(); |
| 233 EXPECT_TRUE(manager_->IsQueueEmpty(0)); | 312 EXPECT_TRUE(manager_->IsQueueEmpty(0)); |
| 234 } | 313 } |
| 235 | 314 |
| 236 TEST_F(TaskQueueManagerTest, DelayedTaskPosting) { | 315 TEST_F(TaskQueueManagerTest, DelayedTaskPosting) { |
| 237 Initialize(1u); | 316 Initialize(1u, SelectorType::Automatic); |
| 238 | 317 |
| 239 std::vector<int> run_order; | 318 std::vector<int> run_order; |
| 240 scoped_refptr<base::SingleThreadTaskRunner> runner = | 319 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 241 manager_->TaskRunnerForQueue(0); | 320 manager_->TaskRunnerForQueue(0); |
| 242 | 321 |
| 243 selector_->AppendQueueToService(0); | |
| 244 | |
| 245 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); | 322 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); |
| 246 runner->PostDelayedTask( | 323 runner->PostDelayedTask( |
| 247 FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay); | 324 FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay); |
| 248 EXPECT_EQ(delay, test_task_runner_->NextPendingTaskDelay()); | 325 EXPECT_EQ(delay, test_task_runner_->DelayToNextTaskTime()); |
| 249 EXPECT_TRUE(manager_->IsQueueEmpty(0)); | 326 EXPECT_TRUE(manager_->IsQueueEmpty(0)); |
| 250 EXPECT_TRUE(run_order.empty()); | 327 EXPECT_TRUE(run_order.empty()); |
| 251 | 328 |
| 252 // The task is inserted to the incoming queue only after the delay. | 329 // The task doesn't run before the delay has completed. |
| 253 test_task_runner_->RunPendingTasks(); | 330 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(9)); |
| 254 EXPECT_FALSE(manager_->IsQueueEmpty(0)); | |
| 255 EXPECT_TRUE(run_order.empty()); | 331 EXPECT_TRUE(run_order.empty()); |
| 256 | 332 |
| 257 // After the delay the task runs normally. | 333 // After the delay has completed, the task runs normally. |
| 258 selector_->AppendQueueToService(0); | 334 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(1)); |
| 259 test_task_runner_->RunUntilIdle(); | |
| 260 EXPECT_THAT(run_order, ElementsAre(1)); | 335 EXPECT_THAT(run_order, ElementsAre(1)); |
| 261 } | 336 } |
| 262 | 337 |
| 263 TEST_F(TaskQueueManagerTest, DelayedTaskDoesNotStayDelayed) { | 338 TEST_F(TaskQueueManagerTest, DelayedTaskPosting_MultipleTasks_DecendingOrder) { |
| 264 Initialize(1u); | 339 Initialize(1u, SelectorType::Automatic); |
| 265 | 340 |
| 266 std::vector<int> run_order; | 341 std::vector<int> run_order; |
| 267 scoped_refptr<base::SingleThreadTaskRunner> runner = | 342 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 268 manager_->TaskRunnerForQueue(0); | 343 manager_->TaskRunnerForQueue(0); |
| 269 | 344 |
| 270 selector_->AppendQueueToService(0); | 345 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), |
| 346 base::TimeDelta::FromMilliseconds(10)); |
| 347 |
| 348 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order), |
| 349 base::TimeDelta::FromMilliseconds(8)); |
| 350 |
| 351 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order), |
| 352 base::TimeDelta::FromMilliseconds(5)); |
| 353 |
| 354 EXPECT_EQ(base::TimeDelta::FromMilliseconds(5), |
| 355 test_task_runner_->DelayToNextTaskTime()); |
| 356 |
| 357 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5)); |
| 358 EXPECT_THAT(run_order, ElementsAre(3)); |
| 359 EXPECT_EQ(base::TimeDelta::FromMilliseconds(3), |
| 360 test_task_runner_->DelayToNextTaskTime()); |
| 361 |
| 362 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(3)); |
| 363 EXPECT_THAT(run_order, ElementsAre(3, 2)); |
| 364 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2), |
| 365 test_task_runner_->DelayToNextTaskTime()); |
| 366 |
| 367 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(2)); |
| 368 EXPECT_THAT(run_order, ElementsAre(3, 2, 1)); |
| 369 } |
| 370 |
| 371 TEST_F(TaskQueueManagerTest, DelayedTaskPosting_MultipleTasks_AscendingOrder) { |
| 372 Initialize(1u, SelectorType::Automatic); |
| 373 |
| 374 std::vector<int> run_order; |
| 375 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 376 manager_->TaskRunnerForQueue(0); |
| 377 |
| 378 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), |
| 379 base::TimeDelta::FromMilliseconds(1)); |
| 380 |
| 381 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order), |
| 382 base::TimeDelta::FromMilliseconds(5)); |
| 383 |
| 384 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order), |
| 385 base::TimeDelta::FromMilliseconds(10)); |
| 386 |
| 387 EXPECT_EQ(base::TimeDelta::FromMilliseconds(1), |
| 388 test_task_runner_->DelayToNextTaskTime()); |
| 389 |
| 390 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(1)); |
| 391 EXPECT_THAT(run_order, ElementsAre(1)); |
| 392 EXPECT_EQ(base::TimeDelta::FromMilliseconds(4), |
| 393 test_task_runner_->DelayToNextTaskTime()); |
| 394 |
| 395 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(4)); |
| 396 EXPECT_THAT(run_order, ElementsAre(1, 2)); |
| 397 EXPECT_EQ(base::TimeDelta::FromMilliseconds(5), |
| 398 test_task_runner_->DelayToNextTaskTime()); |
| 399 |
| 400 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5)); |
| 401 EXPECT_THAT(run_order, ElementsAre(1, 2, 3)); |
| 402 } |
| 403 |
| 404 TEST_F(TaskQueueManagerTest, PostDelayedTask_SharesUnderlyingDelayedTasks) { |
| 405 Initialize(1u, SelectorType::Automatic); |
| 406 |
| 407 std::vector<int> run_order; |
| 408 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 409 manager_->TaskRunnerForQueue(0); |
| 271 | 410 |
| 272 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); | 411 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); |
| 273 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), | 412 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), |
| 274 delay); | 413 delay); |
| 275 test_task_runner_->RunPendingTasks(); | 414 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order), |
| 415 delay); |
| 416 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order), |
| 417 delay); |
| 276 | 418 |
| 277 // Reload the work queue so we see the next pending task. It should no longer | 419 EXPECT_EQ(1u, test_task_runner_->NumPendingTasks()); |
| 278 // be marked as delayed. | 420 } |
| 279 manager_->PumpQueue(0); | |
| 280 EXPECT_TRUE(selector_->work_queues()[0]->front().delayed_run_time.is_null()); | |
| 281 | 421 |
| 282 // Let the task run normally. | 422 class TestObject { |
| 283 selector_->AppendQueueToService(0); | 423 public: |
| 284 test_task_runner_->RunUntilIdle(); | 424 ~TestObject() { destructor_count_++; } |
| 285 EXPECT_THAT(run_order, ElementsAre(1)); | 425 |
| 426 void Run() { FAIL() << "TestObject::Run should not be called"; } |
| 427 |
| 428 static int destructor_count_; |
| 429 }; |
| 430 |
| 431 int TestObject::destructor_count_ = 0; |
| 432 |
| 433 TEST_F(TaskQueueManagerTest, PendingDelayedTasksRemovedOnShutdown) { |
| 434 Initialize(1u, SelectorType::Automatic); |
| 435 |
| 436 TestObject::destructor_count_ = 0; |
| 437 |
| 438 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 439 manager_->TaskRunnerForQueue(0); |
| 440 |
| 441 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); |
| 442 runner->PostDelayedTask( |
| 443 FROM_HERE, base::Bind(&TestObject::Run, base::Owned(new TestObject())), |
| 444 delay); |
| 445 |
| 446 manager_.reset(); |
| 447 |
| 448 EXPECT_EQ(1, TestObject::destructor_count_); |
| 286 } | 449 } |
| 287 | 450 |
| 288 TEST_F(TaskQueueManagerTest, ManualPumping) { | 451 TEST_F(TaskQueueManagerTest, ManualPumping) { |
| 289 Initialize(1u); | 452 Initialize(1u, SelectorType::Automatic); |
| 290 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); | 453 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); |
| 291 | 454 |
| 292 std::vector<int> run_order; | 455 std::vector<int> run_order; |
| 293 scoped_refptr<base::SingleThreadTaskRunner> runner = | 456 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 294 manager_->TaskRunnerForQueue(0); | 457 manager_->TaskRunnerForQueue(0); |
| 295 | 458 |
| 296 // Posting a task when pumping is disabled doesn't result in work getting | 459 // Posting a task when pumping is disabled doesn't result in work getting |
| 297 // posted. | 460 // posted. |
| 298 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 461 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
| 299 EXPECT_FALSE(test_task_runner_->HasPendingTask()); | 462 EXPECT_FALSE(test_task_runner_->HasPendingTasks()); |
| 300 | 463 |
| 301 // However polling still works. | 464 // However polling still works. |
| 302 EXPECT_FALSE(manager_->IsQueueEmpty(0)); | 465 EXPECT_FALSE(manager_->IsQueueEmpty(0)); |
| 303 | 466 |
| 304 // After pumping the task runs normally. | 467 // After pumping the task runs normally. |
| 305 manager_->PumpQueue(0); | 468 manager_->PumpQueue(0); |
| 306 EXPECT_TRUE(test_task_runner_->HasPendingTask()); | 469 EXPECT_TRUE(test_task_runner_->HasPendingTasks()); |
| 307 selector_->AppendQueueToService(0); | |
| 308 test_task_runner_->RunUntilIdle(); | 470 test_task_runner_->RunUntilIdle(); |
| 309 EXPECT_THAT(run_order, ElementsAre(1)); | 471 EXPECT_THAT(run_order, ElementsAre(1)); |
| 310 } | 472 } |
| 311 | 473 |
| 312 TEST_F(TaskQueueManagerTest, ManualPumpingToggle) { | 474 TEST_F(TaskQueueManagerTest, ManualPumpingToggle) { |
| 313 Initialize(1u); | 475 Initialize(1u, SelectorType::Automatic); |
| 314 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); | 476 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); |
| 315 | 477 |
| 316 std::vector<int> run_order; | 478 std::vector<int> run_order; |
| 317 scoped_refptr<base::SingleThreadTaskRunner> runner = | 479 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 318 manager_->TaskRunnerForQueue(0); | 480 manager_->TaskRunnerForQueue(0); |
| 319 | 481 |
| 320 // Posting a task when pumping is disabled doesn't result in work getting | 482 // Posting a task when pumping is disabled doesn't result in work getting |
| 321 // posted. | 483 // posted. |
| 322 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 484 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
| 323 EXPECT_FALSE(test_task_runner_->HasPendingTask()); | 485 EXPECT_FALSE(test_task_runner_->HasPendingTasks()); |
| 324 | 486 |
| 325 // When pumping is enabled the task runs normally. | 487 // When pumping is enabled the task runs normally. |
| 326 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AUTO); | 488 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AUTO); |
| 327 EXPECT_TRUE(test_task_runner_->HasPendingTask()); | 489 EXPECT_TRUE(test_task_runner_->HasPendingTasks()); |
| 328 selector_->AppendQueueToService(0); | |
| 329 test_task_runner_->RunUntilIdle(); | 490 test_task_runner_->RunUntilIdle(); |
| 330 EXPECT_THAT(run_order, ElementsAre(1)); | 491 EXPECT_THAT(run_order, ElementsAre(1)); |
| 331 } | 492 } |
| 332 | 493 |
| 333 TEST_F(TaskQueueManagerTest, DenyRunning) { | 494 TEST_F(TaskQueueManagerTest, DenyRunning) { |
| 334 Initialize(1u); | 495 Initialize(1u, SelectorType::Explicit); |
| 335 | 496 |
| 336 std::vector<int> run_order; | 497 std::vector<int> run_order; |
| 337 scoped_refptr<base::SingleThreadTaskRunner> runner = | 498 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 338 manager_->TaskRunnerForQueue(0); | 499 manager_->TaskRunnerForQueue(0); |
| 339 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 500 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
| 340 | 501 |
| 341 // Since we haven't appended a work queue to be selected, the task doesn't | 502 // Since we haven't appended a work queue to be selected, the task doesn't |
| 342 // run. | 503 // run. |
| 343 test_task_runner_->RunUntilIdle(); | 504 test_task_runner_->RunUntilIdle(); |
| 344 EXPECT_TRUE(run_order.empty()); | 505 EXPECT_TRUE(run_order.empty()); |
| 345 | 506 |
| 346 // Pumping the queue again with a selected work queue runs the task. | 507 // Pumping the queue again with a selected work queue runs the task. |
| 347 manager_->PumpQueue(0); | 508 manager_->PumpQueue(0); |
| 348 selector_->AppendQueueToService(0); | 509 selector_->AppendQueueToService(0); |
| 349 test_task_runner_->RunUntilIdle(); | 510 test_task_runner_->RunUntilIdle(); |
| 350 EXPECT_THAT(run_order, ElementsAre(1)); | 511 EXPECT_THAT(run_order, ElementsAre(1)); |
| 351 } | 512 } |
| 352 | 513 |
| 353 TEST_F(TaskQueueManagerTest, ManualPumpingWithDelayedTask) { | 514 TEST_F(TaskQueueManagerTest, ManualPumpingWithDelayedTask) { |
| 354 Initialize(1u); | 515 Initialize(1u, SelectorType::Automatic); |
| 355 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); | 516 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); |
| 356 | 517 |
| 357 std::vector<int> run_order; | 518 std::vector<int> run_order; |
| 358 scoped_refptr<base::SingleThreadTaskRunner> runner = | 519 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 359 manager_->TaskRunnerForQueue(0); | 520 manager_->TaskRunnerForQueue(0); |
| 360 | 521 |
| 361 // Posting a delayed task when pumping will apply the delay, but won't cause | 522 // Posting a delayed task when pumping will apply the delay, but won't cause |
| 362 // work to executed afterwards. | 523 // work to executed afterwards. |
| 363 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); | 524 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); |
| 364 runner->PostDelayedTask( | 525 runner->PostDelayedTask( |
| 365 FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay); | 526 FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay); |
| 527 |
| 528 // After pumping but before the delay period has expired, task does not run. |
| 529 manager_->PumpQueue(0); |
| 530 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5)); |
| 531 EXPECT_TRUE(run_order.empty()); |
| 532 |
| 533 // Once the delay has expired, pumping causes the task to run. |
| 534 now_src_->AdvanceNow(base::TimeDelta::FromMilliseconds(5)); |
| 535 manager_->PumpQueue(0); |
| 536 EXPECT_TRUE(test_task_runner_->HasPendingTasks()); |
| 537 test_task_runner_->RunPendingTasks(); |
| 538 EXPECT_THAT(run_order, ElementsAre(1)); |
| 539 } |
| 540 |
| 541 TEST_F(TaskQueueManagerTest, ManualPumpingWithMultipleDelayedTasks) { |
| 542 Initialize(1u, SelectorType::Automatic); |
| 543 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); |
| 544 |
| 545 std::vector<int> run_order; |
| 546 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 547 manager_->TaskRunnerForQueue(0); |
| 548 |
| 549 // Posting a delayed task when pumping will apply the delay, but won't cause |
| 550 // work to executed afterwards. |
| 551 base::TimeDelta delay1(base::TimeDelta::FromMilliseconds(1)); |
| 552 base::TimeDelta delay2(base::TimeDelta::FromMilliseconds(10)); |
| 553 base::TimeDelta delay3(base::TimeDelta::FromMilliseconds(20)); |
| 554 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), |
| 555 delay1); |
| 556 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order), |
| 557 delay2); |
| 558 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order), |
| 559 delay3); |
| 560 |
| 561 now_src_->AdvanceNow(base::TimeDelta::FromMilliseconds(15)); |
| 366 test_task_runner_->RunUntilIdle(); | 562 test_task_runner_->RunUntilIdle(); |
| 367 EXPECT_TRUE(run_order.empty()); | 563 EXPECT_TRUE(run_order.empty()); |
| 368 | 564 |
| 369 // After pumping the task runs normally. | 565 // Once the delay has expired, pumping causes the task to run. |
| 370 manager_->PumpQueue(0); | 566 manager_->PumpQueue(0); |
| 371 EXPECT_TRUE(test_task_runner_->HasPendingTask()); | |
| 372 selector_->AppendQueueToService(0); | |
| 373 test_task_runner_->RunUntilIdle(); | 567 test_task_runner_->RunUntilIdle(); |
| 374 EXPECT_THAT(run_order, ElementsAre(1)); | 568 EXPECT_THAT(run_order, ElementsAre(1, 2)); |
| 569 } |
| 570 |
| 571 TEST_F(TaskQueueManagerTest, DelayedTasksDontAutoRunWithManualPumping) { |
| 572 Initialize(1u, SelectorType::Automatic); |
| 573 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); |
| 574 |
| 575 std::vector<int> run_order; |
| 576 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 577 manager_->TaskRunnerForQueue(0); |
| 578 |
| 579 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); |
| 580 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), |
| 581 delay); |
| 582 |
| 583 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(10)); |
| 584 EXPECT_TRUE(run_order.empty()); |
| 375 } | 585 } |
| 376 | 586 |
| 377 TEST_F(TaskQueueManagerTest, ManualPumpingWithNonEmptyWorkQueue) { | 587 TEST_F(TaskQueueManagerTest, ManualPumpingWithNonEmptyWorkQueue) { |
| 378 Initialize(1u); | 588 Initialize(1u, SelectorType::Automatic); |
| 379 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); | 589 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); |
| 380 | 590 |
| 381 std::vector<int> run_order; | 591 std::vector<int> run_order; |
| 382 scoped_refptr<base::SingleThreadTaskRunner> runner = | 592 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 383 manager_->TaskRunnerForQueue(0); | 593 manager_->TaskRunnerForQueue(0); |
| 384 | 594 |
| 385 // Posting two tasks and pumping twice should result in two tasks in the work | 595 // Posting two tasks and pumping twice should result in two tasks in the work |
| 386 // queue. | 596 // queue. |
| 387 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 597 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
| 388 manager_->PumpQueue(0); | 598 manager_->PumpQueue(0); |
| 389 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); | 599 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); |
| 390 manager_->PumpQueue(0); | 600 manager_->PumpQueue(0); |
| 391 | 601 |
| 392 EXPECT_EQ(2u, selector_->work_queues()[0]->size()); | 602 EXPECT_EQ(2u, selector_->work_queues()[0]->size()); |
| 393 } | 603 } |
| 394 | 604 |
| 395 void ReentrantTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner, | 605 void ReentrantTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner, |
| 396 int countdown, | 606 int countdown, |
| 397 std::vector<int>* out_result) { | 607 std::vector<int>* out_result) { |
| 398 out_result->push_back(countdown); | 608 out_result->push_back(countdown); |
| 399 if (--countdown) { | 609 if (--countdown) { |
| 400 runner->PostTask(FROM_HERE, | 610 runner->PostTask(FROM_HERE, |
| 401 Bind(&ReentrantTestTask, runner, countdown, out_result)); | 611 Bind(&ReentrantTestTask, runner, countdown, out_result)); |
| 402 } | 612 } |
| 403 } | 613 } |
| 404 | 614 |
| 405 TEST_F(TaskQueueManagerTest, ReentrantPosting) { | 615 TEST_F(TaskQueueManagerTest, ReentrantPosting) { |
| 406 Initialize(1u); | 616 Initialize(1u, SelectorType::Automatic); |
| 407 | 617 |
| 408 std::vector<int> run_order; | 618 std::vector<int> run_order; |
| 409 scoped_refptr<base::SingleThreadTaskRunner> runner = | 619 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 410 manager_->TaskRunnerForQueue(0); | 620 manager_->TaskRunnerForQueue(0); |
| 411 | 621 |
| 412 runner->PostTask(FROM_HERE, Bind(&ReentrantTestTask, runner, 3, &run_order)); | 622 runner->PostTask(FROM_HERE, Bind(&ReentrantTestTask, runner, 3, &run_order)); |
| 413 | 623 |
| 414 selector_->AppendQueueToService(0); | |
| 415 selector_->AppendQueueToService(0); | |
| 416 selector_->AppendQueueToService(0); | |
| 417 | |
| 418 test_task_runner_->RunUntilIdle(); | 624 test_task_runner_->RunUntilIdle(); |
| 419 EXPECT_THAT(run_order, ElementsAre(3, 2, 1)); | 625 EXPECT_THAT(run_order, ElementsAre(3, 2, 1)); |
| 420 } | 626 } |
| 421 | 627 |
| 422 TEST_F(TaskQueueManagerTest, NoTasksAfterShutdown) { | 628 TEST_F(TaskQueueManagerTest, NoTasksAfterShutdown) { |
| 423 Initialize(1u); | 629 Initialize(1u, SelectorType::Automatic); |
| 424 | 630 |
| 425 std::vector<int> run_order; | 631 std::vector<int> run_order; |
| 426 scoped_refptr<base::SingleThreadTaskRunner> runner = | 632 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 427 manager_->TaskRunnerForQueue(0); | 633 manager_->TaskRunnerForQueue(0); |
| 428 | 634 |
| 429 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 635 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
| 430 manager_.reset(); | 636 manager_.reset(); |
| 431 selector_.reset(); | 637 selector_.reset(); |
| 432 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 638 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
| 433 | 639 |
| 434 test_task_runner_->RunUntilIdle(); | 640 test_task_runner_->RunUntilIdle(); |
| 435 EXPECT_TRUE(run_order.empty()); | 641 EXPECT_TRUE(run_order.empty()); |
| 436 } | 642 } |
| 437 | 643 |
| 438 void PostTaskToRunner(scoped_refptr<base::SingleThreadTaskRunner> runner, | 644 void PostTaskToRunner(scoped_refptr<base::SingleThreadTaskRunner> runner, |
| 439 std::vector<int>* run_order) { | 645 std::vector<int>* run_order) { |
| 440 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, run_order)); | 646 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, run_order)); |
| 441 } | 647 } |
| 442 | 648 |
| 443 TEST_F(TaskQueueManagerTest, PostFromThread) { | 649 TEST_F(TaskQueueManagerTest, PostFromThread) { |
| 444 InitializeWithRealMessageLoop(1u); | 650 InitializeWithRealMessageLoop(1u, SelectorType::Automatic); |
| 445 | 651 |
| 446 std::vector<int> run_order; | 652 std::vector<int> run_order; |
| 447 scoped_refptr<base::SingleThreadTaskRunner> runner = | 653 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 448 manager_->TaskRunnerForQueue(0); | 654 manager_->TaskRunnerForQueue(0); |
| 449 | 655 |
| 450 base::Thread thread("TestThread"); | 656 base::Thread thread("TestThread"); |
| 451 thread.Start(); | 657 thread.Start(); |
| 452 thread.message_loop()->PostTask( | 658 thread.message_loop()->PostTask( |
| 453 FROM_HERE, base::Bind(&PostTaskToRunner, runner, &run_order)); | 659 FROM_HERE, base::Bind(&PostTaskToRunner, runner, &run_order)); |
| 454 thread.Stop(); | 660 thread.Stop(); |
| 455 | 661 |
| 456 selector_->AppendQueueToService(0); | |
| 457 message_loop_->RunUntilIdle(); | 662 message_loop_->RunUntilIdle(); |
| 458 EXPECT_THAT(run_order, ElementsAre(1)); | 663 EXPECT_THAT(run_order, ElementsAre(1)); |
| 459 } | 664 } |
| 460 | 665 |
| 461 void RePostingTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner, | 666 void RePostingTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner, |
| 462 int* run_count) { | 667 int* run_count) { |
| 463 (*run_count)++; | 668 (*run_count)++; |
| 464 runner->PostTask( | 669 runner->PostTask( |
| 465 FROM_HERE, | 670 FROM_HERE, |
| 466 Bind(&RePostingTestTask, base::Unretained(runner.get()), run_count)); | 671 Bind(&RePostingTestTask, base::Unretained(runner.get()), run_count)); |
| 467 } | 672 } |
| 468 | 673 |
| 469 TEST_F(TaskQueueManagerTest, DoWorkCantPostItselfMultipleTimes) { | 674 TEST_F(TaskQueueManagerTest, DoWorkCantPostItselfMultipleTimes) { |
| 470 Initialize(1u); | 675 Initialize(1u, SelectorType::Automatic); |
| 471 scoped_refptr<base::SingleThreadTaskRunner> runner = | 676 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 472 manager_->TaskRunnerForQueue(0); | 677 manager_->TaskRunnerForQueue(0); |
| 473 | 678 |
| 474 int run_count = 0; | 679 int run_count = 0; |
| 475 runner->PostTask(FROM_HERE, | 680 runner->PostTask(FROM_HERE, |
| 476 base::Bind(&RePostingTestTask, runner, &run_count)); | 681 base::Bind(&RePostingTestTask, runner, &run_count)); |
| 477 | 682 |
| 478 selector_->AppendQueueToService(0); | |
| 479 selector_->AppendQueueToService(0); | |
| 480 selector_->AppendQueueToService(0); | |
| 481 | |
| 482 test_task_runner_->RunPendingTasks(); | 683 test_task_runner_->RunPendingTasks(); |
| 483 // NOTE without the executing_task_ check in MaybePostDoWorkOnMainRunner there | 684 // NOTE without the executing_task_ check in MaybePostDoWorkOnMainRunner there |
| 484 // will be two tasks here. | 685 // will be two tasks here. |
| 485 EXPECT_EQ(1u, test_task_runner_->GetPendingTasks().size()); | 686 EXPECT_EQ(1u, test_task_runner_->NumPendingTasks()); |
| 486 EXPECT_EQ(1, run_count); | 687 EXPECT_EQ(1, run_count); |
| 487 } | 688 } |
| 488 | 689 |
| 489 TEST_F(TaskQueueManagerTest, PostFromNestedRunloop) { | 690 TEST_F(TaskQueueManagerTest, PostFromNestedRunloop) { |
| 490 InitializeWithRealMessageLoop(1u); | 691 InitializeWithRealMessageLoop(1u, SelectorType::Automatic); |
| 491 | |
| 492 selector_->AppendQueueToService(0); | |
| 493 selector_->AppendQueueToService(0); | |
| 494 selector_->AppendQueueToService(0); | |
| 495 selector_->AppendQueueToService(0); | |
| 496 | 692 |
| 497 std::vector<int> run_order; | 693 std::vector<int> run_order; |
| 498 scoped_refptr<base::SingleThreadTaskRunner> runner = | 694 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 499 manager_->TaskRunnerForQueue(0); | 695 manager_->TaskRunnerForQueue(0); |
| 500 | 696 |
| 501 std::vector<std::pair<base::Closure, bool>> tasks_to_post_from_nested_loop; | 697 std::vector<std::pair<base::Closure, bool>> tasks_to_post_from_nested_loop; |
| 502 tasks_to_post_from_nested_loop.push_back( | 698 tasks_to_post_from_nested_loop.push_back( |
| 503 std::make_pair(base::Bind(&TestTask, 1, &run_order), true)); | 699 std::make_pair(base::Bind(&TestTask, 1, &run_order), true)); |
| 504 | 700 |
| 505 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 0, &run_order)); | 701 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 0, &run_order)); |
| 506 runner->PostTask( | 702 runner->PostTask( |
| 507 FROM_HERE, base::Bind(&PostFromNestedRunloop, message_loop_.get(), runner, | 703 FROM_HERE, base::Bind(&PostFromNestedRunloop, message_loop_.get(), runner, |
| 508 base::Unretained(&tasks_to_post_from_nested_loop))); | 704 base::Unretained(&tasks_to_post_from_nested_loop))); |
| 509 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); | 705 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); |
| 510 | 706 |
| 511 message_loop_->RunUntilIdle(); | 707 message_loop_->RunUntilIdle(); |
| 512 | 708 |
| 513 EXPECT_THAT(run_order, ElementsAre(0, 2, 1)); | 709 EXPECT_THAT(run_order, ElementsAre(0, 2, 1)); |
| 514 } | 710 } |
| 515 | 711 |
| 516 TEST_F(TaskQueueManagerTest, WorkBatching) { | 712 TEST_F(TaskQueueManagerTest, WorkBatching) { |
| 517 Initialize(1u); | 713 Initialize(1u, SelectorType::Automatic); |
| 518 | 714 |
| 519 manager_->SetWorkBatchSize(2); | 715 manager_->SetWorkBatchSize(2); |
| 520 | 716 |
| 521 std::vector<int> run_order; | 717 std::vector<int> run_order; |
| 522 scoped_refptr<base::SingleThreadTaskRunner> runner = | 718 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 523 manager_->TaskRunnerForQueue(0); | 719 manager_->TaskRunnerForQueue(0); |
| 524 | 720 |
| 525 selector_->AppendQueueToService(0); | |
| 526 selector_->AppendQueueToService(0); | |
| 527 selector_->AppendQueueToService(0); | |
| 528 selector_->AppendQueueToService(0); | |
| 529 | |
| 530 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 721 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
| 531 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); | 722 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); |
| 532 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); | 723 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); |
| 533 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order)); | 724 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order)); |
| 534 | 725 |
| 535 // Running one task in the host message loop should cause two posted tasks to | 726 // Running one task in the host message loop should cause two posted tasks to |
| 536 // get executed. | 727 // get executed. |
| 537 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 1u); | 728 EXPECT_EQ(test_task_runner_->NumPendingTasks(), 1u); |
| 538 test_task_runner_->RunPendingTasks(); | 729 test_task_runner_->RunPendingTasks(); |
| 539 EXPECT_THAT(run_order, ElementsAre(1, 2)); | 730 EXPECT_THAT(run_order, ElementsAre(1, 2)); |
| 540 | 731 |
| 541 // The second task runs the remaining two posted tasks. | 732 // The second task runs the remaining two posted tasks. |
| 542 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 1u); | 733 EXPECT_EQ(test_task_runner_->NumPendingTasks(), 1u); |
| 543 test_task_runner_->RunPendingTasks(); | 734 test_task_runner_->RunPendingTasks(); |
| 544 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4)); | 735 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4)); |
| 545 } | 736 } |
| 546 | 737 |
| 547 void AdvanceNowTestTask(int value, | |
| 548 std::vector<int>* out_result, | |
| 549 scoped_refptr<cc::TestNowSource> time_source, | |
| 550 base::TimeDelta delta) { | |
| 551 TestTask(value, out_result); | |
| 552 time_source->AdvanceNow(delta); | |
| 553 } | |
| 554 | |
| 555 TEST_F(TaskQueueManagerTest, InterruptWorkBatchForDelayedTask) { | |
| 556 scoped_refptr<cc::TestNowSource> clock(cc::TestNowSource::Create()); | |
| 557 Initialize(1u); | |
| 558 | |
| 559 manager_->SetWorkBatchSize(2); | |
| 560 manager_->SetTimeSourceForTesting(clock); | |
| 561 | |
| 562 std::vector<int> run_order; | |
| 563 scoped_refptr<base::SingleThreadTaskRunner> runner = | |
| 564 manager_->TaskRunnerForQueue(0); | |
| 565 | |
| 566 selector_->AppendQueueToService(0); | |
| 567 selector_->AppendQueueToService(0); | |
| 568 selector_->AppendQueueToService(0); | |
| 569 | |
| 570 base::TimeDelta delta(base::TimeDelta::FromMilliseconds(10)); | |
| 571 runner->PostTask( | |
| 572 FROM_HERE, base::Bind(&AdvanceNowTestTask, 2, &run_order, clock, delta)); | |
| 573 runner->PostTask( | |
| 574 FROM_HERE, base::Bind(&AdvanceNowTestTask, 3, &run_order, clock, delta)); | |
| 575 | |
| 576 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(5)); | |
| 577 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), | |
| 578 delay); | |
| 579 | |
| 580 // At this point we have two posted tasks: one for DoWork and one of the | |
| 581 // delayed task. Only the first non-delayed task should get executed because | |
| 582 // the work batch is interrupted by the pending delayed task. | |
| 583 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 2u); | |
| 584 test_task_runner_->RunPendingTasks(); | |
| 585 EXPECT_THAT(run_order, ElementsAre(2)); | |
| 586 | |
| 587 // Running all remaining tasks should execute both pending tasks. | |
| 588 test_task_runner_->RunUntilIdle(); | |
| 589 EXPECT_THAT(run_order, ElementsAre(2, 3, 1)); | |
| 590 } | |
| 591 | |
| 592 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeup) { | 738 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeup) { |
| 593 Initialize(2u); | 739 Initialize(2u, SelectorType::Explicit); |
| 594 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); | 740 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); |
| 595 | 741 |
| 596 std::vector<int> run_order; | 742 std::vector<int> run_order; |
| 597 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { | 743 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { |
| 598 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; | 744 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; |
| 599 | 745 |
| 600 selector_->AppendQueueToService(1); | 746 selector_->AppendQueueToService(1); |
| 601 selector_->AppendQueueToService(0); | 747 selector_->AppendQueueToService(0); |
| 602 selector_->AppendQueueToService(0); | 748 selector_->AppendQueueToService(0); |
| 603 | 749 |
| 604 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 750 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
| 605 test_task_runner_->RunUntilIdle(); | 751 test_task_runner_->RunUntilIdle(); |
| 606 EXPECT_TRUE(run_order.empty()); // Shouldn't run - no other task to wake TQM. | 752 EXPECT_TRUE(run_order.empty()); // Shouldn't run - no other task to wake TQM. |
| 607 | 753 |
| 608 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); | 754 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); |
| 609 test_task_runner_->RunUntilIdle(); | 755 test_task_runner_->RunUntilIdle(); |
| 610 EXPECT_TRUE(run_order.empty()); // Still shouldn't wake TQM. | 756 EXPECT_TRUE(run_order.empty()); // Still shouldn't wake TQM. |
| 611 | 757 |
| 612 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); | 758 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); |
| 613 test_task_runner_->RunUntilIdle(); | 759 test_task_runner_->RunUntilIdle(); |
| 614 // Executing a task on an auto pumped queue should wake the TQM. | 760 // Executing a task on an auto pumped queue should wake the TQM. |
| 615 EXPECT_THAT(run_order, ElementsAre(3, 1, 2)); | 761 EXPECT_THAT(run_order, ElementsAre(3, 1, 2)); |
| 616 } | 762 } |
| 617 | 763 |
| 618 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupWhenAlreadyAwake) { | 764 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupWhenAlreadyAwake) { |
| 619 Initialize(2u); | 765 Initialize(2u, SelectorType::Explicit); |
| 620 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); | 766 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); |
| 621 | 767 |
| 622 std::vector<int> run_order; | 768 std::vector<int> run_order; |
| 623 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { | 769 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { |
| 624 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; | 770 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; |
| 625 | 771 |
| 626 selector_->AppendQueueToService(1); | 772 selector_->AppendQueueToService(1); |
| 627 selector_->AppendQueueToService(0); | 773 selector_->AppendQueueToService(0); |
| 628 | 774 |
| 629 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 775 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
| 630 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); | 776 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); |
| 631 test_task_runner_->RunUntilIdle(); | 777 test_task_runner_->RunUntilIdle(); |
| 632 EXPECT_THAT(run_order, ElementsAre(2, 1)); // TQM was already awake. | 778 EXPECT_THAT(run_order, ElementsAre(2, 1)); // TQM was already awake. |
| 633 } | 779 } |
| 634 | 780 |
| 635 TEST_F(TaskQueueManagerTest, | 781 TEST_F(TaskQueueManagerTest, |
| 636 AutoPumpAfterWakeupTriggeredByManuallyPumpedQueue) { | 782 AutoPumpAfterWakeupTriggeredByManuallyPumpedQueue) { |
| 637 Initialize(2u); | 783 Initialize(2u, SelectorType::Explicit); |
| 638 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); | 784 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); |
| 639 manager_->SetPumpPolicy(1, TaskQueueManager::PumpPolicy::MANUAL); | 785 manager_->SetPumpPolicy(1, TaskQueueManager::PumpPolicy::MANUAL); |
| 640 | 786 |
| 641 std::vector<int> run_order; | 787 std::vector<int> run_order; |
| 642 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { | 788 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { |
| 643 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; | 789 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; |
| 644 | 790 |
| 645 selector_->AppendQueueToService(1); | 791 selector_->AppendQueueToService(1); |
| 646 selector_->AppendQueueToService(0); | 792 selector_->AppendQueueToService(0); |
| 647 | 793 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 659 // Executing a task on an auto pumped queue should wake the TQM. | 805 // Executing a task on an auto pumped queue should wake the TQM. |
| 660 EXPECT_THAT(run_order, ElementsAre(2, 1)); | 806 EXPECT_THAT(run_order, ElementsAre(2, 1)); |
| 661 } | 807 } |
| 662 | 808 |
| 663 void TestPostingTask(scoped_refptr<base::SingleThreadTaskRunner> task_runner, | 809 void TestPostingTask(scoped_refptr<base::SingleThreadTaskRunner> task_runner, |
| 664 base::Closure task) { | 810 base::Closure task) { |
| 665 task_runner->PostTask(FROM_HERE, task); | 811 task_runner->PostTask(FROM_HERE, task); |
| 666 } | 812 } |
| 667 | 813 |
| 668 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupFromTask) { | 814 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupFromTask) { |
| 669 Initialize(2u); | 815 Initialize(2u, SelectorType::Explicit); |
| 670 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); | 816 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); |
| 671 | 817 |
| 672 std::vector<int> run_order; | 818 std::vector<int> run_order; |
| 673 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { | 819 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { |
| 674 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; | 820 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; |
| 675 | 821 |
| 676 selector_->AppendQueueToService(1); | 822 selector_->AppendQueueToService(1); |
| 677 selector_->AppendQueueToService(1); | 823 selector_->AppendQueueToService(1); |
| 678 selector_->AppendQueueToService(0); | 824 selector_->AppendQueueToService(0); |
| 679 | 825 |
| 680 // Check that a task which posts a task to an auto pump after wakeup queue | 826 // Check that a task which posts a task to an auto pump after wakeup queue |
| 681 // doesn't cause the queue to wake up. | 827 // doesn't cause the queue to wake up. |
| 682 base::Closure after_wakeup_task = base::Bind(&TestTask, 1, &run_order); | 828 base::Closure after_wakeup_task = base::Bind(&TestTask, 1, &run_order); |
| 683 runners[1]->PostTask( | 829 runners[1]->PostTask( |
| 684 FROM_HERE, | 830 FROM_HERE, |
| 685 base::Bind(&TestPostingTask, runners[0], after_wakeup_task)); | 831 base::Bind(&TestPostingTask, runners[0], after_wakeup_task)); |
| 686 test_task_runner_->RunUntilIdle(); | 832 test_task_runner_->RunUntilIdle(); |
| 687 EXPECT_TRUE(run_order.empty()); | 833 EXPECT_TRUE(run_order.empty()); |
| 688 | 834 |
| 689 // Wake up the queue. | 835 // Wake up the queue. |
| 690 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); | 836 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); |
| 691 test_task_runner_->RunUntilIdle(); | 837 test_task_runner_->RunUntilIdle(); |
| 692 EXPECT_THAT(run_order, ElementsAre(2, 1)); | 838 EXPECT_THAT(run_order, ElementsAre(2, 1)); |
| 693 } | 839 } |
| 694 | 840 |
| 695 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupFromMultipleTasks) { | 841 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupFromMultipleTasks) { |
| 696 Initialize(2u); | 842 Initialize(2u, SelectorType::Explicit); |
| 697 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); | 843 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); |
| 698 | 844 |
| 699 std::vector<int> run_order; | 845 std::vector<int> run_order; |
| 700 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { | 846 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { |
| 701 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; | 847 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; |
| 702 | 848 |
| 703 selector_->AppendQueueToService(1); | 849 selector_->AppendQueueToService(1); |
| 704 selector_->AppendQueueToService(1); | 850 selector_->AppendQueueToService(1); |
| 705 selector_->AppendQueueToService(1); | 851 selector_->AppendQueueToService(1); |
| 706 selector_->AppendQueueToService(0); | 852 selector_->AppendQueueToService(0); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 718 base::Bind(&TestPostingTask, runners[0], after_wakeup_task_2)); | 864 base::Bind(&TestPostingTask, runners[0], after_wakeup_task_2)); |
| 719 test_task_runner_->RunUntilIdle(); | 865 test_task_runner_->RunUntilIdle(); |
| 720 EXPECT_TRUE(run_order.empty()); | 866 EXPECT_TRUE(run_order.empty()); |
| 721 | 867 |
| 722 // Wake up the queue. | 868 // Wake up the queue. |
| 723 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); | 869 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); |
| 724 test_task_runner_->RunUntilIdle(); | 870 test_task_runner_->RunUntilIdle(); |
| 725 EXPECT_THAT(run_order, ElementsAre(3, 1, 2)); | 871 EXPECT_THAT(run_order, ElementsAre(3, 1, 2)); |
| 726 } | 872 } |
| 727 | 873 |
| 728 void NullTestTask() { | |
| 729 } | |
| 730 | |
| 731 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupBecomesQuiescent) { | 874 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupBecomesQuiescent) { |
| 732 Initialize(2u); | 875 Initialize(2u, SelectorType::Explicit); |
| 733 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); | 876 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); |
| 734 | 877 |
| 735 int run_count = 0; | 878 int run_count = 0; |
| 736 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { | 879 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { |
| 737 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; | 880 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; |
| 738 | 881 |
| 739 selector_->AppendQueueToService(1); | 882 selector_->AppendQueueToService(1); |
| 740 selector_->AppendQueueToService(0); | 883 selector_->AppendQueueToService(0); |
| 741 selector_->AppendQueueToService(0); | 884 selector_->AppendQueueToService(0); |
| 742 // Append extra service queue '0' entries to the selector otherwise test will | 885 // Append extra service queue '0' entries to the selector otherwise test will |
| 743 // finish even if the RePostingTestTask woke each other up. | 886 // finish even if the RePostingTestTask woke each other up. |
| 744 selector_->AppendQueueToService(0); | 887 selector_->AppendQueueToService(0); |
| 745 selector_->AppendQueueToService(0); | 888 selector_->AppendQueueToService(0); |
| 746 | 889 |
| 747 // Check that if multiple tasks reposts themselves onto a pump-after-wakeup | 890 // Check that if multiple tasks reposts themselves onto a pump-after-wakeup |
| 748 // queue they don't wake each other and will eventually stop when no other | 891 // queue they don't wake each other and will eventually stop when no other |
| 749 // tasks execute. | 892 // tasks execute. |
| 750 runners[0]->PostTask(FROM_HERE, | 893 runners[0]->PostTask(FROM_HERE, |
| 751 base::Bind(&RePostingTestTask, runners[0], &run_count)); | 894 base::Bind(&RePostingTestTask, runners[0], &run_count)); |
| 752 runners[0]->PostTask(FROM_HERE, | 895 runners[0]->PostTask(FROM_HERE, |
| 753 base::Bind(&RePostingTestTask, runners[0], &run_count)); | 896 base::Bind(&RePostingTestTask, runners[0], &run_count)); |
| 754 runners[1]->PostTask(FROM_HERE, base::Bind(&NullTestTask)); | 897 runners[1]->PostTask(FROM_HERE, base::Bind(&NopTask)); |
| 755 test_task_runner_->RunUntilIdle(); | 898 test_task_runner_->RunUntilIdle(); |
| 756 // The reposting tasks posted to the after wakeup queue shouldn't have woken | 899 // The reposting tasks posted to the after wakeup queue shouldn't have woken |
| 757 // each other up. | 900 // each other up. |
| 758 EXPECT_EQ(2, run_count); | 901 EXPECT_EQ(2, run_count); |
| 759 } | 902 } |
| 760 | 903 |
| 761 class MockTaskObserver : public base::MessageLoop::TaskObserver { | 904 class MockTaskObserver : public base::MessageLoop::TaskObserver { |
| 762 public: | 905 public: |
| 763 MOCK_METHOD1(DidProcessTask, void(const base::PendingTask& task)); | 906 MOCK_METHOD1(DidProcessTask, void(const base::PendingTask& task)); |
| 764 MOCK_METHOD1(WillProcessTask, void(const base::PendingTask& task)); | 907 MOCK_METHOD1(WillProcessTask, void(const base::PendingTask& task)); |
| 765 }; | 908 }; |
| 766 | 909 |
| 767 TEST_F(TaskQueueManagerTest, TaskObserverAdding) { | 910 TEST_F(TaskQueueManagerTest, TaskObserverAdding) { |
| 768 InitializeWithRealMessageLoop(1u); | 911 InitializeWithRealMessageLoop(1u, SelectorType::Automatic); |
| 769 MockTaskObserver observer; | 912 MockTaskObserver observer; |
| 770 | 913 |
| 771 manager_->SetWorkBatchSize(2); | 914 manager_->SetWorkBatchSize(2); |
| 772 manager_->AddTaskObserver(&observer); | 915 manager_->AddTaskObserver(&observer); |
| 773 | 916 |
| 774 std::vector<int> run_order; | 917 std::vector<int> run_order; |
| 775 scoped_refptr<base::SingleThreadTaskRunner> runner = | 918 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 776 manager_->TaskRunnerForQueue(0); | 919 manager_->TaskRunnerForQueue(0); |
| 777 | 920 |
| 778 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 921 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
| 779 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); | 922 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); |
| 780 | 923 |
| 781 selector_->AppendQueueToService(0); | |
| 782 selector_->AppendQueueToService(0); | |
| 783 | |
| 784 // Two pairs of callbacks for the tasks above plus another one for the | 924 // Two pairs of callbacks for the tasks above plus another one for the |
| 785 // DoWork() posted by the task queue manager. | 925 // DoWork() posted by the task queue manager. |
| 786 EXPECT_CALL(observer, WillProcessTask(_)).Times(3); | 926 EXPECT_CALL(observer, WillProcessTask(_)).Times(3); |
| 787 EXPECT_CALL(observer, DidProcessTask(_)).Times(3); | 927 EXPECT_CALL(observer, DidProcessTask(_)).Times(3); |
| 788 message_loop_->RunUntilIdle(); | 928 message_loop_->RunUntilIdle(); |
| 789 } | 929 } |
| 790 | 930 |
| 791 TEST_F(TaskQueueManagerTest, TaskObserverRemoving) { | 931 TEST_F(TaskQueueManagerTest, TaskObserverRemoving) { |
| 792 InitializeWithRealMessageLoop(1u); | 932 InitializeWithRealMessageLoop(1u, SelectorType::Automatic); |
| 793 MockTaskObserver observer; | 933 MockTaskObserver observer; |
| 794 manager_->SetWorkBatchSize(2); | 934 manager_->SetWorkBatchSize(2); |
| 795 manager_->AddTaskObserver(&observer); | 935 manager_->AddTaskObserver(&observer); |
| 796 manager_->RemoveTaskObserver(&observer); | 936 manager_->RemoveTaskObserver(&observer); |
| 797 | 937 |
| 798 std::vector<int> run_order; | 938 std::vector<int> run_order; |
| 799 scoped_refptr<base::SingleThreadTaskRunner> runner = | 939 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 800 manager_->TaskRunnerForQueue(0); | 940 manager_->TaskRunnerForQueue(0); |
| 801 | 941 |
| 802 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 942 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
| 803 | 943 |
| 804 EXPECT_CALL(observer, WillProcessTask(_)).Times(0); | 944 EXPECT_CALL(observer, WillProcessTask(_)).Times(0); |
| 805 EXPECT_CALL(observer, DidProcessTask(_)).Times(0); | 945 EXPECT_CALL(observer, DidProcessTask(_)).Times(0); |
| 806 | 946 |
| 807 selector_->AppendQueueToService(0); | |
| 808 message_loop_->RunUntilIdle(); | 947 message_loop_->RunUntilIdle(); |
| 809 } | 948 } |
| 810 | 949 |
| 811 void RemoveObserverTask(TaskQueueManager* manager, | 950 void RemoveObserverTask(TaskQueueManager* manager, |
| 812 base::MessageLoop::TaskObserver* observer) { | 951 base::MessageLoop::TaskObserver* observer) { |
| 813 manager->RemoveTaskObserver(observer); | 952 manager->RemoveTaskObserver(observer); |
| 814 } | 953 } |
| 815 | 954 |
| 816 TEST_F(TaskQueueManagerTest, TaskObserverRemovingInsideTask) { | 955 TEST_F(TaskQueueManagerTest, TaskObserverRemovingInsideTask) { |
| 817 InitializeWithRealMessageLoop(1u); | 956 InitializeWithRealMessageLoop(1u, SelectorType::Automatic); |
| 818 MockTaskObserver observer; | 957 MockTaskObserver observer; |
| 819 manager_->SetWorkBatchSize(3); | 958 manager_->SetWorkBatchSize(3); |
| 820 manager_->AddTaskObserver(&observer); | 959 manager_->AddTaskObserver(&observer); |
| 821 | 960 |
| 822 scoped_refptr<base::SingleThreadTaskRunner> runner = | 961 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 823 manager_->TaskRunnerForQueue(0); | 962 manager_->TaskRunnerForQueue(0); |
| 824 runner->PostTask(FROM_HERE, | 963 runner->PostTask(FROM_HERE, |
| 825 base::Bind(&RemoveObserverTask, manager_.get(), &observer)); | 964 base::Bind(&RemoveObserverTask, manager_.get(), &observer)); |
| 826 | 965 |
| 827 selector_->AppendQueueToService(0); | |
| 828 | |
| 829 EXPECT_CALL(observer, WillProcessTask(_)).Times(1); | 966 EXPECT_CALL(observer, WillProcessTask(_)).Times(1); |
| 830 EXPECT_CALL(observer, DidProcessTask(_)).Times(0); | 967 EXPECT_CALL(observer, DidProcessTask(_)).Times(0); |
| 831 message_loop_->RunUntilIdle(); | 968 message_loop_->RunUntilIdle(); |
| 832 } | 969 } |
| 833 | 970 |
| 834 TEST_F(TaskQueueManagerTest, ThreadCheckAfterTermination) { | 971 TEST_F(TaskQueueManagerTest, ThreadCheckAfterTermination) { |
| 835 Initialize(1); | 972 Initialize(1u, SelectorType::Automatic); |
| 836 scoped_refptr<base::SingleThreadTaskRunner> runner = | 973 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 837 manager_->TaskRunnerForQueue(0); | 974 manager_->TaskRunnerForQueue(0); |
| 838 EXPECT_TRUE(runner->RunsTasksOnCurrentThread()); | 975 EXPECT_TRUE(runner->RunsTasksOnCurrentThread()); |
| 839 manager_.reset(); | 976 manager_.reset(); |
| 840 EXPECT_TRUE(runner->RunsTasksOnCurrentThread()); | 977 EXPECT_TRUE(runner->RunsTasksOnCurrentThread()); |
| 841 } | 978 } |
| 842 | 979 |
| 843 TEST_F(TaskQueueManagerTest, NextPendingDelayedTaskRunTime) { | 980 TEST_F(TaskQueueManagerTest, NextPendingDelayedTaskRunTime) { |
| 844 scoped_refptr<cc::TestNowSource> clock(cc::TestNowSource::Create()); | 981 scoped_refptr<cc::TestNowSource> clock(cc::TestNowSource::Create()); |
| 845 Initialize(2u); | 982 Initialize(2u, SelectorType::Explicit); |
| 846 manager_->SetTimeSourceForTesting(clock); | 983 manager_->SetTimeSourceForTesting(clock); |
| 847 | 984 |
| 848 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { | 985 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { |
| 849 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; | 986 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; |
| 850 | 987 |
| 851 // With no delayed tasks. | 988 // With no delayed tasks. |
| 852 EXPECT_TRUE(manager_->NextPendingDelayedTaskRunTime().is_null()); | 989 EXPECT_TRUE(manager_->NextPendingDelayedTaskRunTime().is_null()); |
| 853 | 990 |
| 854 // With a non-delayed task. | 991 // With a non-delayed task. |
| 855 runners[0]->PostTask(FROM_HERE, base::Bind(&NullTestTask)); | 992 runners[0]->PostTask(FROM_HERE, base::Bind(&NopTask)); |
| 856 EXPECT_TRUE(manager_->NextPendingDelayedTaskRunTime().is_null()); | 993 EXPECT_TRUE(manager_->NextPendingDelayedTaskRunTime().is_null()); |
| 857 | 994 |
| 858 // With a delayed task. | 995 // With a delayed task. |
| 859 base::TimeDelta expected_delay = base::TimeDelta::FromMilliseconds(50); | 996 base::TimeDelta expected_delay = base::TimeDelta::FromMilliseconds(50); |
| 860 runners[0]->PostDelayedTask( | 997 runners[0]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), expected_delay); |
| 861 FROM_HERE, base::Bind(&NullTestTask), expected_delay); | |
| 862 EXPECT_EQ(clock->Now() + expected_delay, | 998 EXPECT_EQ(clock->Now() + expected_delay, |
| 863 manager_->NextPendingDelayedTaskRunTime()); | 999 manager_->NextPendingDelayedTaskRunTime()); |
| 864 | 1000 |
| 865 // With another delayed task in the same queue with a longer delay. | 1001 // With another delayed task in the same queue with a longer delay. |
| 866 runners[0]->PostDelayedTask( | 1002 runners[0]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), |
| 867 FROM_HERE, base::Bind(&NullTestTask), | 1003 base::TimeDelta::FromMilliseconds(100)); |
| 868 base::TimeDelta::FromMilliseconds(100)); | |
| 869 EXPECT_EQ(clock->Now() + expected_delay, | 1004 EXPECT_EQ(clock->Now() + expected_delay, |
| 870 manager_->NextPendingDelayedTaskRunTime()); | 1005 manager_->NextPendingDelayedTaskRunTime()); |
| 871 | 1006 |
| 872 // With another delayed task in the same queue with a shorter delay. | 1007 // With another delayed task in the same queue with a shorter delay. |
| 873 expected_delay = base::TimeDelta::FromMilliseconds(20); | 1008 expected_delay = base::TimeDelta::FromMilliseconds(20); |
| 874 runners[0]->PostDelayedTask( | 1009 runners[0]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), expected_delay); |
| 875 FROM_HERE, base::Bind(&NullTestTask), expected_delay); | |
| 876 EXPECT_EQ(clock->Now() + expected_delay, | 1010 EXPECT_EQ(clock->Now() + expected_delay, |
| 877 manager_->NextPendingDelayedTaskRunTime()); | 1011 manager_->NextPendingDelayedTaskRunTime()); |
| 878 | 1012 |
| 879 // With another delayed task in a different queue with a shorter delay. | 1013 // With another delayed task in a different queue with a shorter delay. |
| 880 expected_delay = base::TimeDelta::FromMilliseconds(10); | 1014 expected_delay = base::TimeDelta::FromMilliseconds(10); |
| 881 runners[1]->PostDelayedTask( | 1015 runners[1]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), expected_delay); |
| 882 FROM_HERE, base::Bind(&NullTestTask), expected_delay); | |
| 883 EXPECT_EQ(clock->Now() + expected_delay, | 1016 EXPECT_EQ(clock->Now() + expected_delay, |
| 884 manager_->NextPendingDelayedTaskRunTime()); | 1017 manager_->NextPendingDelayedTaskRunTime()); |
| 885 | 1018 |
| 886 // Test it updates as time progresses | 1019 // Test it updates as time progresses |
| 887 clock->AdvanceNow(expected_delay); | 1020 clock->AdvanceNow(expected_delay); |
| 888 EXPECT_EQ(clock->Now(), manager_->NextPendingDelayedTaskRunTime()); | 1021 EXPECT_EQ(clock->Now(), manager_->NextPendingDelayedTaskRunTime()); |
| 889 } | 1022 } |
| 890 | 1023 |
| 1024 TEST_F(TaskQueueManagerTest, NextPendingDelayedTaskRunTime_MultipleQueues) { |
| 1025 Initialize(3u, SelectorType::Automatic); |
| 1026 |
| 1027 scoped_refptr<base::SingleThreadTaskRunner> runners[3] = { |
| 1028 manager_->TaskRunnerForQueue(0), |
| 1029 manager_->TaskRunnerForQueue(1), |
| 1030 manager_->TaskRunnerForQueue(2)}; |
| 1031 |
| 1032 base::TimeDelta delay1 = base::TimeDelta::FromMilliseconds(50); |
| 1033 base::TimeDelta delay2 = base::TimeDelta::FromMilliseconds(5); |
| 1034 base::TimeDelta delay3 = base::TimeDelta::FromMilliseconds(10); |
| 1035 runners[0]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay1); |
| 1036 runners[1]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay2); |
| 1037 runners[2]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay3); |
| 1038 |
| 1039 EXPECT_EQ(now_src_->Now() + delay2, |
| 1040 manager_->NextPendingDelayedTaskRunTime()); |
| 1041 } |
| 1042 |
| 891 } // namespace | 1043 } // namespace |
| 892 } // namespace content | 1044 } // namespace content |
| 893 | 1045 |
| OLD | NEW |