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

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

Issue 1008693004: Handle delayed tasks more natively in the scheduler (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Responding to yet more feedback. Also removed some boilerplate calls to AppendQueueToService Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/scheduler/task_queue_manager.h" 5 #include "content/renderer/scheduler/task_queue_manager.h"
6 6
7 #include "base/test/test_simple_task_runner.h"
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698