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