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

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: Sami's Suggestions 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 {
(...skipping 30 matching lines...) Expand all
49 private: 49 private:
50 std::deque<size_t> queues_to_service_; 50 std::deque<size_t> queues_to_service_;
51 std::vector<const base::TaskQueue*> work_queues_; 51 std::vector<const base::TaskQueue*> work_queues_;
52 52
53 DISALLOW_COPY_AND_ASSIGN(SelectorForTest); 53 DISALLOW_COPY_AND_ASSIGN(SelectorForTest);
54 }; 54 };
55 55
56 class TaskQueueManagerTest : public testing::Test { 56 class TaskQueueManagerTest : public testing::Test {
57 protected: 57 protected:
58 void Initialize(size_t num_queues) { 58 void Initialize(size_t num_queues) {
59 test_task_runner_ = make_scoped_refptr(new base::TestSimpleTaskRunner()); 59 now_src_ = cc::TestNowSource::Create(1000);
60 test_task_runner_ =
61 make_scoped_refptr(new cc::OrderedSimpleTaskRunner(now_src_, false));
60 selector_ = make_scoped_ptr(new SelectorForTest); 62 selector_ = make_scoped_ptr(new SelectorForTest);
61 manager_ = make_scoped_ptr(new TaskQueueManager( 63 manager_ = make_scoped_ptr(new TaskQueueManager(
62 num_queues, NestableTaskRunnerForTest::Create(test_task_runner_.get()), 64 num_queues, NestableTaskRunnerForTest::Create(test_task_runner_.get()),
63 selector_.get())); 65 selector_.get()));
66 manager_->SetTimeSourceForTesting(now_src_);
67
64 EXPECT_EQ(num_queues, selector_->work_queues().size()); 68 EXPECT_EQ(num_queues, selector_->work_queues().size());
65 } 69 }
66 70
67 void InitializeWithRealMessageLoop(size_t num_queues) { 71 void InitializeWithRealMessageLoop(size_t num_queues) {
68 message_loop_.reset(new base::MessageLoop()); 72 message_loop_.reset(new base::MessageLoop());
69 selector_ = make_scoped_ptr(new SelectorForTest); 73 selector_ = make_scoped_ptr(new SelectorForTest);
70 manager_ = make_scoped_ptr(new TaskQueueManager( 74 manager_ = make_scoped_ptr(new TaskQueueManager(
71 num_queues, 75 num_queues,
72 RendererSchedulerMessageLoopDelegate::Create(message_loop_.get()), 76 RendererSchedulerMessageLoopDelegate::Create(message_loop_.get()),
73 selector_.get())); 77 selector_.get()));
74 EXPECT_EQ(num_queues, selector_->work_queues().size()); 78 EXPECT_EQ(num_queues, selector_->work_queues().size());
75 } 79 }
76 80
77 scoped_refptr<base::TestSimpleTaskRunner> test_task_runner_; 81 scoped_refptr<cc::TestNowSource> now_src_;
82 scoped_refptr<cc::OrderedSimpleTaskRunner> test_task_runner_;
78 scoped_ptr<SelectorForTest> selector_; 83 scoped_ptr<SelectorForTest> selector_;
79 scoped_ptr<TaskQueueManager> manager_; 84 scoped_ptr<TaskQueueManager> manager_;
80 scoped_ptr<base::MessageLoop> message_loop_; 85 scoped_ptr<base::MessageLoop> message_loop_;
81 }; 86 };
82 87
83 void PostFromNestedRunloop(base::MessageLoop* message_loop, 88 void PostFromNestedRunloop(base::MessageLoop* message_loop,
84 base::SingleThreadTaskRunner* runner, 89 base::SingleThreadTaskRunner* runner,
85 std::vector<std::pair<base::Closure, bool>>* tasks) { 90 std::vector<std::pair<base::Closure, bool>>* tasks) {
86 base::MessageLoop::ScopedNestableTaskAllower allow(message_loop); 91 base::MessageLoop::ScopedNestableTaskAllower allow(message_loop);
87 for (std::pair<base::Closure, bool>& pair : *tasks) { 92 for (std::pair<base::Closure, bool>& pair : *tasks) {
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); 142 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
138 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); 143 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
139 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order)); 144 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order));
140 runners[2]->PostTask(FROM_HERE, base::Bind(&TestTask, 5, &run_order)); 145 runners[2]->PostTask(FROM_HERE, base::Bind(&TestTask, 5, &run_order));
141 runners[2]->PostTask(FROM_HERE, base::Bind(&TestTask, 6, &run_order)); 146 runners[2]->PostTask(FROM_HERE, base::Bind(&TestTask, 6, &run_order));
142 147
143 test_task_runner_->RunUntilIdle(); 148 test_task_runner_->RunUntilIdle();
144 EXPECT_THAT(run_order, ElementsAre(1, 3, 5, 2, 4, 6)); 149 EXPECT_THAT(run_order, ElementsAre(1, 3, 5, 2, 4, 6));
145 } 150 }
146 151
152 void NopTask() {
153 }
154
155 TEST_F(TaskQueueManagerTest, NowNotCalledWhenThereAreNoDelayedTasks) {
156 Initialize(3u);
157
158 scoped_refptr<cc::TestNowSource> now_src = cc::TestNowSource::Create(1000);
159 manager_->SetTimeSourceForTesting(now_src);
160
161 scoped_refptr<base::SingleThreadTaskRunner> runners[3] = {
162 manager_->TaskRunnerForQueue(0),
163 manager_->TaskRunnerForQueue(1),
164 manager_->TaskRunnerForQueue(2)};
165
166 selector_->AppendQueueToService(0);
167 selector_->AppendQueueToService(1);
168 selector_->AppendQueueToService(2);
169 selector_->AppendQueueToService(0);
170 selector_->AppendQueueToService(1);
171 selector_->AppendQueueToService(2);
172
173 runners[0]->PostTask(FROM_HERE, base::Bind(&NopTask));
174 runners[0]->PostTask(FROM_HERE, base::Bind(&NopTask));
175 runners[1]->PostTask(FROM_HERE, base::Bind(&NopTask));
176 runners[1]->PostTask(FROM_HERE, base::Bind(&NopTask));
177 runners[2]->PostTask(FROM_HERE, base::Bind(&NopTask));
178 runners[2]->PostTask(FROM_HERE, base::Bind(&NopTask));
179
180 test_task_runner_->RunUntilIdle();
181
182 EXPECT_EQ(0, now_src->NumNowCalls());
183 }
184
147 TEST_F(TaskQueueManagerTest, NonNestableTaskPosting) { 185 TEST_F(TaskQueueManagerTest, NonNestableTaskPosting) {
148 InitializeWithRealMessageLoop(1u); 186 InitializeWithRealMessageLoop(1u);
149 187
150 std::vector<int> run_order; 188 std::vector<int> run_order;
151 scoped_refptr<base::SingleThreadTaskRunner> runner = 189 scoped_refptr<base::SingleThreadTaskRunner> runner =
152 manager_->TaskRunnerForQueue(0); 190 manager_->TaskRunnerForQueue(0);
153 191
154 selector_->AppendQueueToService(0); 192 selector_->AppendQueueToService(0);
155 193
156 runner->PostNonNestableTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 194 runner->PostNonNestableTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
238 276
239 std::vector<int> run_order; 277 std::vector<int> run_order;
240 scoped_refptr<base::SingleThreadTaskRunner> runner = 278 scoped_refptr<base::SingleThreadTaskRunner> runner =
241 manager_->TaskRunnerForQueue(0); 279 manager_->TaskRunnerForQueue(0);
242 280
243 selector_->AppendQueueToService(0); 281 selector_->AppendQueueToService(0);
244 282
245 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); 283 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
246 runner->PostDelayedTask( 284 runner->PostDelayedTask(
247 FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay); 285 FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay);
248 EXPECT_EQ(delay, test_task_runner_->NextPendingTaskDelay()); 286 EXPECT_EQ(delay, test_task_runner_->DelayToNextTaskTime());
249 EXPECT_TRUE(manager_->IsQueueEmpty(0)); 287 EXPECT_TRUE(manager_->IsQueueEmpty(0));
250 EXPECT_TRUE(run_order.empty()); 288 EXPECT_TRUE(run_order.empty());
251 289
252 // The task is inserted to the incoming queue only after the delay. 290 // The task doesn't run before the delay has completed.
253 test_task_runner_->RunPendingTasks(); 291 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(9));
254 EXPECT_FALSE(manager_->IsQueueEmpty(0));
255 EXPECT_TRUE(run_order.empty()); 292 EXPECT_TRUE(run_order.empty());
256 293
257 // After the delay the task runs normally. 294 // After the delay has completed, the task runs normally.
258 selector_->AppendQueueToService(0); 295 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(1));
259 test_task_runner_->RunUntilIdle();
260 EXPECT_THAT(run_order, ElementsAre(1)); 296 EXPECT_THAT(run_order, ElementsAre(1));
261 } 297 }
262 298
263 TEST_F(TaskQueueManagerTest, DelayedTaskDoesNotStayDelayed) { 299 TEST_F(TaskQueueManagerTest, DelayedTaskPosting_MultipleTasks) {
264 Initialize(1u); 300 Initialize(1u);
265 301
266 std::vector<int> run_order; 302 std::vector<int> run_order;
267 scoped_refptr<base::SingleThreadTaskRunner> runner = 303 scoped_refptr<base::SingleThreadTaskRunner> runner =
268 manager_->TaskRunnerForQueue(0); 304 manager_->TaskRunnerForQueue(0);
269 305
270 selector_->AppendQueueToService(0); 306 selector_->AppendQueueToService(0);
307 selector_->AppendQueueToService(0);
308 selector_->AppendQueueToService(0);
309
310 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
311 base::TimeDelta::FromMilliseconds(10));
312
313 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order),
314 base::TimeDelta::FromMilliseconds(8));
315
316 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order),
317 base::TimeDelta::FromMilliseconds(5));
318
319 EXPECT_EQ(base::TimeDelta::FromMilliseconds(5),
320 test_task_runner_->DelayToNextTaskTime());
321
322 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5));
323 EXPECT_THAT(run_order, ElementsAre(3));
324 EXPECT_EQ(base::TimeDelta::FromMilliseconds(3),
325 test_task_runner_->DelayToNextTaskTime());
326
327 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(3));
328 EXPECT_THAT(run_order, ElementsAre(3, 2));
329 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2),
330 test_task_runner_->DelayToNextTaskTime());
331
332 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(2));
333 EXPECT_THAT(run_order, ElementsAre(3, 2, 1));
334 }
335
336 TEST_F(TaskQueueManagerTest, PostDelayedTask_SharesChromiumTimers) {
337 Initialize(1u);
338
339 std::vector<int> run_order;
340 scoped_refptr<base::SingleThreadTaskRunner> runner =
341 manager_->TaskRunnerForQueue(0);
271 342
272 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); 343 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
273 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), 344 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
274 delay); 345 delay);
275 test_task_runner_->RunPendingTasks(); 346 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order),
347 delay);
348 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order),
349 delay);
276 350
277 // Reload the work queue so we see the next pending task. It should no longer 351 EXPECT_EQ(1u, test_task_runner_->NumPendingTasks());
278 // be marked as delayed.
279 manager_->PumpQueue(0);
280 EXPECT_TRUE(selector_->work_queues()[0]->front().delayed_run_time.is_null());
281
282 // Let the task run normally.
283 selector_->AppendQueueToService(0);
284 test_task_runner_->RunUntilIdle();
285 EXPECT_THAT(run_order, ElementsAre(1));
286 } 352 }
287 353
288 TEST_F(TaskQueueManagerTest, ManualPumping) { 354 TEST_F(TaskQueueManagerTest, ManualPumping) {
289 Initialize(1u); 355 Initialize(1u);
290 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); 356 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
291 357
292 std::vector<int> run_order; 358 std::vector<int> run_order;
293 scoped_refptr<base::SingleThreadTaskRunner> runner = 359 scoped_refptr<base::SingleThreadTaskRunner> runner =
294 manager_->TaskRunnerForQueue(0); 360 manager_->TaskRunnerForQueue(0);
295 361
296 // Posting a task when pumping is disabled doesn't result in work getting 362 // Posting a task when pumping is disabled doesn't result in work getting
297 // posted. 363 // posted.
298 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 364 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
299 EXPECT_FALSE(test_task_runner_->HasPendingTask()); 365 EXPECT_FALSE(test_task_runner_->HasPendingTasks());
300 366
301 // However polling still works. 367 // However polling still works.
302 EXPECT_FALSE(manager_->IsQueueEmpty(0)); 368 EXPECT_FALSE(manager_->IsQueueEmpty(0));
303 369
304 // After pumping the task runs normally. 370 // After pumping the task runs normally.
305 manager_->PumpQueue(0); 371 manager_->PumpQueue(0);
306 EXPECT_TRUE(test_task_runner_->HasPendingTask()); 372 EXPECT_TRUE(test_task_runner_->HasPendingTasks());
307 selector_->AppendQueueToService(0); 373 selector_->AppendQueueToService(0);
308 test_task_runner_->RunUntilIdle(); 374 test_task_runner_->RunUntilIdle();
309 EXPECT_THAT(run_order, ElementsAre(1)); 375 EXPECT_THAT(run_order, ElementsAre(1));
310 } 376 }
311 377
312 TEST_F(TaskQueueManagerTest, ManualPumpingToggle) { 378 TEST_F(TaskQueueManagerTest, ManualPumpingToggle) {
313 Initialize(1u); 379 Initialize(1u);
314 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); 380 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
315 381
316 std::vector<int> run_order; 382 std::vector<int> run_order;
317 scoped_refptr<base::SingleThreadTaskRunner> runner = 383 scoped_refptr<base::SingleThreadTaskRunner> runner =
318 manager_->TaskRunnerForQueue(0); 384 manager_->TaskRunnerForQueue(0);
319 385
320 // Posting a task when pumping is disabled doesn't result in work getting 386 // Posting a task when pumping is disabled doesn't result in work getting
321 // posted. 387 // posted.
322 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 388 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
323 EXPECT_FALSE(test_task_runner_->HasPendingTask()); 389 EXPECT_FALSE(test_task_runner_->HasPendingTasks());
324 390
325 // When pumping is enabled the task runs normally. 391 // When pumping is enabled the task runs normally.
326 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AUTO); 392 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AUTO);
327 EXPECT_TRUE(test_task_runner_->HasPendingTask()); 393 EXPECT_TRUE(test_task_runner_->HasPendingTasks());
328 selector_->AppendQueueToService(0); 394 selector_->AppendQueueToService(0);
329 test_task_runner_->RunUntilIdle(); 395 test_task_runner_->RunUntilIdle();
330 EXPECT_THAT(run_order, ElementsAre(1)); 396 EXPECT_THAT(run_order, ElementsAre(1));
331 } 397 }
332 398
333 TEST_F(TaskQueueManagerTest, DenyRunning) { 399 TEST_F(TaskQueueManagerTest, DenyRunning) {
334 Initialize(1u); 400 Initialize(1u);
335 401
336 std::vector<int> run_order; 402 std::vector<int> run_order;
337 scoped_refptr<base::SingleThreadTaskRunner> runner = 403 scoped_refptr<base::SingleThreadTaskRunner> runner =
(...skipping 12 matching lines...) Expand all
350 EXPECT_THAT(run_order, ElementsAre(1)); 416 EXPECT_THAT(run_order, ElementsAre(1));
351 } 417 }
352 418
353 TEST_F(TaskQueueManagerTest, ManualPumpingWithDelayedTask) { 419 TEST_F(TaskQueueManagerTest, ManualPumpingWithDelayedTask) {
354 Initialize(1u); 420 Initialize(1u);
355 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); 421 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
356 422
357 std::vector<int> run_order; 423 std::vector<int> run_order;
358 scoped_refptr<base::SingleThreadTaskRunner> runner = 424 scoped_refptr<base::SingleThreadTaskRunner> runner =
359 manager_->TaskRunnerForQueue(0); 425 manager_->TaskRunnerForQueue(0);
426 selector_->AppendQueueToService(0);
360 427
361 // Posting a delayed task when pumping will apply the delay, but won't cause 428 // Posting a delayed task when pumping will apply the delay, but won't cause
362 // work to executed afterwards. 429 // work to executed afterwards.
363 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); 430 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
364 runner->PostDelayedTask( 431 runner->PostDelayedTask(
365 FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay); 432 FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay);
366 test_task_runner_->RunUntilIdle(); 433
434 // After pumping but before the delay period has expired, task does not run.
435 manager_->PumpQueue(0);
436 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5));
367 EXPECT_TRUE(run_order.empty()); 437 EXPECT_TRUE(run_order.empty());
368 438
369 // After pumping the task runs normally. 439 // Once the delay has expired, pumping causes the task to run.
440 now_src_->AdvanceNow(base::TimeDelta::FromMilliseconds(5));
370 manager_->PumpQueue(0); 441 manager_->PumpQueue(0);
371 EXPECT_TRUE(test_task_runner_->HasPendingTask()); 442 EXPECT_TRUE(test_task_runner_->HasPendingTasks());
443 test_task_runner_->RunPendingTasks();
444 EXPECT_THAT(run_order, ElementsAre(1));
445 }
446
447 TEST_F(TaskQueueManagerTest, DelayedTasksDontAutoRunWithManualPumping) {
448 Initialize(1u);
449 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
450
451 std::vector<int> run_order;
452 scoped_refptr<base::SingleThreadTaskRunner> runner =
453 manager_->TaskRunnerForQueue(0);
372 selector_->AppendQueueToService(0); 454 selector_->AppendQueueToService(0);
373 test_task_runner_->RunUntilIdle(); 455
374 EXPECT_THAT(run_order, ElementsAre(1)); 456 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
457 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
458 delay);
459
460 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(10));
461 EXPECT_TRUE(run_order.empty());
375 } 462 }
376 463
377 TEST_F(TaskQueueManagerTest, ManualPumpingWithNonEmptyWorkQueue) { 464 TEST_F(TaskQueueManagerTest, ManualPumpingWithNonEmptyWorkQueue) {
378 Initialize(1u); 465 Initialize(1u);
379 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); 466 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
380 467
381 std::vector<int> run_order; 468 std::vector<int> run_order;
382 scoped_refptr<base::SingleThreadTaskRunner> runner = 469 scoped_refptr<base::SingleThreadTaskRunner> runner =
383 manager_->TaskRunnerForQueue(0); 470 manager_->TaskRunnerForQueue(0);
384 471
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
475 runner->PostTask(FROM_HERE, 562 runner->PostTask(FROM_HERE,
476 base::Bind(&RePostingTestTask, runner, &run_count)); 563 base::Bind(&RePostingTestTask, runner, &run_count));
477 564
478 selector_->AppendQueueToService(0); 565 selector_->AppendQueueToService(0);
479 selector_->AppendQueueToService(0); 566 selector_->AppendQueueToService(0);
480 selector_->AppendQueueToService(0); 567 selector_->AppendQueueToService(0);
481 568
482 test_task_runner_->RunPendingTasks(); 569 test_task_runner_->RunPendingTasks();
483 // NOTE without the executing_task_ check in MaybePostDoWorkOnMainRunner there 570 // NOTE without the executing_task_ check in MaybePostDoWorkOnMainRunner there
484 // will be two tasks here. 571 // will be two tasks here.
485 EXPECT_EQ(1u, test_task_runner_->GetPendingTasks().size()); 572 EXPECT_EQ(1u, test_task_runner_->NumPendingTasks());
486 EXPECT_EQ(1, run_count); 573 EXPECT_EQ(1, run_count);
487 } 574 }
488 575
489 TEST_F(TaskQueueManagerTest, PostFromNestedRunloop) { 576 TEST_F(TaskQueueManagerTest, PostFromNestedRunloop) {
490 InitializeWithRealMessageLoop(1u); 577 InitializeWithRealMessageLoop(1u);
491 578
492 selector_->AppendQueueToService(0); 579 selector_->AppendQueueToService(0);
493 selector_->AppendQueueToService(0); 580 selector_->AppendQueueToService(0);
494 selector_->AppendQueueToService(0); 581 selector_->AppendQueueToService(0);
495 selector_->AppendQueueToService(0); 582 selector_->AppendQueueToService(0);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
527 selector_->AppendQueueToService(0); 614 selector_->AppendQueueToService(0);
528 selector_->AppendQueueToService(0); 615 selector_->AppendQueueToService(0);
529 616
530 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 617 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
531 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); 618 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
532 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); 619 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
533 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order)); 620 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order));
534 621
535 // Running one task in the host message loop should cause two posted tasks to 622 // Running one task in the host message loop should cause two posted tasks to
536 // get executed. 623 // get executed.
537 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 1u); 624 EXPECT_EQ(test_task_runner_->NumPendingTasks(), 1u);
538 test_task_runner_->RunPendingTasks(); 625 test_task_runner_->RunPendingTasks();
539 EXPECT_THAT(run_order, ElementsAre(1, 2)); 626 EXPECT_THAT(run_order, ElementsAre(1, 2));
540 627
541 // The second task runs the remaining two posted tasks. 628 // The second task runs the remaining two posted tasks.
542 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 1u); 629 EXPECT_EQ(test_task_runner_->NumPendingTasks(), 1u);
543 test_task_runner_->RunPendingTasks(); 630 test_task_runner_->RunPendingTasks();
544 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4)); 631 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4));
545 } 632 }
546 633
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) { 634 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeup) {
593 Initialize(2u); 635 Initialize(2u);
594 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); 636 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP);
595 637
596 std::vector<int> run_order; 638 std::vector<int> run_order;
597 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { 639 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = {
598 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; 640 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)};
599 641
600 selector_->AppendQueueToService(1); 642 selector_->AppendQueueToService(1);
601 selector_->AppendQueueToService(0); 643 selector_->AppendQueueToService(0);
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
836 scoped_refptr<base::SingleThreadTaskRunner> runner = 878 scoped_refptr<base::SingleThreadTaskRunner> runner =
837 manager_->TaskRunnerForQueue(0); 879 manager_->TaskRunnerForQueue(0);
838 EXPECT_TRUE(runner->RunsTasksOnCurrentThread()); 880 EXPECT_TRUE(runner->RunsTasksOnCurrentThread());
839 manager_.reset(); 881 manager_.reset();
840 EXPECT_TRUE(runner->RunsTasksOnCurrentThread()); 882 EXPECT_TRUE(runner->RunsTasksOnCurrentThread());
841 } 883 }
842 884
843 } // namespace 885 } // namespace
844 } // namespace content 886 } // namespace content
845 887
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698