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

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

Issue 962273002: Experimental: Chrome side of killing the blink timer heap (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase 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/task_queue_selector.h" 10 #include "content/renderer/scheduler/task_queue_selector.h"
11 #include "testing/gmock/include/gmock/gmock.h" 11 #include "testing/gmock/include/gmock/gmock.h"
12 12
13 using testing::ElementsAre; 13 using testing::ElementsAre;
14 using testing::_; 14 using testing::_;
15 15
16 namespace content { 16 namespace content {
17 namespace { 17 namespace {
18 18
(...skipping 28 matching lines...) Expand all
47 private: 47 private:
48 std::deque<size_t> queues_to_service_; 48 std::deque<size_t> queues_to_service_;
49 std::vector<const base::TaskQueue*> work_queues_; 49 std::vector<const base::TaskQueue*> work_queues_;
50 50
51 DISALLOW_COPY_AND_ASSIGN(SelectorForTest); 51 DISALLOW_COPY_AND_ASSIGN(SelectorForTest);
52 }; 52 };
53 53
54 class TaskQueueManagerTest : public testing::Test { 54 class TaskQueueManagerTest : public testing::Test {
55 protected: 55 protected:
56 void Initialize(size_t num_queues) { 56 void Initialize(size_t num_queues) {
57 test_task_runner_ = make_scoped_refptr(new base::TestSimpleTaskRunner()); 57 now_src_ = cc::TestNowSource::Create(0);
58 test_task_runner_ =
59 make_scoped_refptr(new cc::OrderedSimpleTaskRunner(now_src_, false));
58 selector_ = make_scoped_ptr(new SelectorForTest); 60 selector_ = make_scoped_ptr(new SelectorForTest);
59 manager_ = make_scoped_ptr( 61 manager_ = make_scoped_ptr(
60 new TaskQueueManager(num_queues, test_task_runner_, selector_.get())); 62 new TaskQueueManager(num_queues, test_task_runner_, selector_.get()));
63 manager_->SetTimeSourceForTesting(now_src_);
64
61 EXPECT_EQ(num_queues, selector_->work_queues().size()); 65 EXPECT_EQ(num_queues, selector_->work_queues().size());
62 } 66 }
63 67
64 void InitializeWithRealMessageLoop(size_t num_queues) { 68 void InitializeWithRealMessageLoop(size_t num_queues) {
65 message_loop_.reset(new base::MessageLoop()); 69 message_loop_.reset(new base::MessageLoop());
66 selector_ = make_scoped_ptr(new SelectorForTest); 70 selector_ = make_scoped_ptr(new SelectorForTest);
67 manager_ = make_scoped_ptr(new TaskQueueManager( 71 manager_ = make_scoped_ptr(new TaskQueueManager(
68 num_queues, message_loop_->task_runner(), selector_.get())); 72 num_queues, message_loop_->task_runner(), selector_.get()));
69 EXPECT_EQ(num_queues, selector_->work_queues().size()); 73 EXPECT_EQ(num_queues, selector_->work_queues().size());
70 } 74 }
71 75
72 scoped_refptr<base::TestSimpleTaskRunner> test_task_runner_; 76 scoped_refptr<cc::TestNowSource> now_src_;
77 scoped_refptr<cc::OrderedSimpleTaskRunner> test_task_runner_;
73 scoped_ptr<SelectorForTest> selector_; 78 scoped_ptr<SelectorForTest> selector_;
74 scoped_ptr<TaskQueueManager> manager_; 79 scoped_ptr<TaskQueueManager> manager_;
75 scoped_ptr<base::MessageLoop> message_loop_; 80 scoped_ptr<base::MessageLoop> message_loop_;
76 }; 81 };
77 82
78 void PostFromNestedRunloop(base::MessageLoop* message_loop, 83 void PostFromNestedRunloop(base::MessageLoop* message_loop,
79 base::SingleThreadTaskRunner* runner, 84 base::SingleThreadTaskRunner* runner,
80 std::vector<std::pair<base::Closure, bool>>* tasks) { 85 std::vector<std::pair<base::Closure, bool>>* tasks) {
81 base::MessageLoop::ScopedNestableTaskAllower allow(message_loop); 86 base::MessageLoop::ScopedNestableTaskAllower allow(message_loop);
82 for (std::pair<base::Closure, bool>& pair : *tasks) { 87 for (std::pair<base::Closure, bool>& pair : *tasks) {
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
233 238
234 std::vector<int> run_order; 239 std::vector<int> run_order;
235 scoped_refptr<base::SingleThreadTaskRunner> runner = 240 scoped_refptr<base::SingleThreadTaskRunner> runner =
236 manager_->TaskRunnerForQueue(0); 241 manager_->TaskRunnerForQueue(0);
237 242
238 selector_->AppendQueueToService(0); 243 selector_->AppendQueueToService(0);
239 244
240 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); 245 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
241 runner->PostDelayedTask( 246 runner->PostDelayedTask(
242 FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay); 247 FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay);
243 EXPECT_EQ(delay, test_task_runner_->NextPendingTaskDelay()); 248 EXPECT_EQ(delay, test_task_runner_->DelayToNextTaskTime());
244 EXPECT_TRUE(manager_->IsQueueEmpty(0)); 249 EXPECT_TRUE(manager_->IsQueueEmpty(0));
245 EXPECT_TRUE(run_order.empty()); 250 EXPECT_TRUE(run_order.empty());
246 251
247 // The task is inserted to the incoming queue only after the delay. 252 // The task doesn't run before the delay has completed.
248 test_task_runner_->RunPendingTasks(); 253 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(9));
249 EXPECT_FALSE(manager_->IsQueueEmpty(0));
250 EXPECT_TRUE(run_order.empty()); 254 EXPECT_TRUE(run_order.empty());
251 255
252 // After the delay the task runs normally. 256 // After the delay has completed, the task runs normally.
253 selector_->AppendQueueToService(0); 257 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(1));
254 test_task_runner_->RunUntilIdle();
255 EXPECT_THAT(run_order, ElementsAre(1)); 258 EXPECT_THAT(run_order, ElementsAre(1));
256 } 259 }
257 260
258 TEST_F(TaskQueueManagerTest, DelayedTaskDoesNotStayDelayed) { 261 TEST_F(TaskQueueManagerTest, DelayedTaskPosting_MultipleTasks) {
259 Initialize(1u); 262 Initialize(1u);
260 263
261 std::vector<int> run_order; 264 std::vector<int> run_order;
262 scoped_refptr<base::SingleThreadTaskRunner> runner = 265 scoped_refptr<base::SingleThreadTaskRunner> runner =
263 manager_->TaskRunnerForQueue(0); 266 manager_->TaskRunnerForQueue(0);
264 267
265 selector_->AppendQueueToService(0); 268 selector_->AppendQueueToService(0);
269 selector_->AppendQueueToService(0);
270 selector_->AppendQueueToService(0);
271
272 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
273 base::TimeDelta::FromMilliseconds(10));
274
275 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order),
276 base::TimeDelta::FromMilliseconds(8));
277
278 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order),
279 base::TimeDelta::FromMilliseconds(5));
280
281 EXPECT_EQ(base::TimeDelta::FromMilliseconds(5),
282 test_task_runner_->DelayToNextTaskTime());
283
284 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5));
285 EXPECT_THAT(run_order, ElementsAre(3));
286 EXPECT_EQ(base::TimeDelta::FromMilliseconds(3),
287 test_task_runner_->DelayToNextTaskTime());
288
289 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(3));
290 EXPECT_THAT(run_order, ElementsAre(3, 2));
291 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2),
292 test_task_runner_->DelayToNextTaskTime());
293
294 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(2));
295 EXPECT_THAT(run_order, ElementsAre(3, 2, 1));
296 }
297
298 TEST_F(TaskQueueManagerTest, PostDelayedTask_SharesChromiumTimers) {
299 Initialize(1u);
300
301 std::vector<int> run_order;
302 scoped_refptr<base::SingleThreadTaskRunner> runner =
303 manager_->TaskRunnerForQueue(0);
266 304
267 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); 305 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
268 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), 306 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
269 delay); 307 delay);
270 test_task_runner_->RunPendingTasks(); 308 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order),
309 delay);
310 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order),
311 delay);
271 312
272 // Reload the work queue so we see the next pending task. It should no longer 313 EXPECT_EQ(1u, test_task_runner_->NumPendingTasks());
273 // be marked as delayed.
274 manager_->PumpQueue(0);
275 EXPECT_TRUE(selector_->work_queues()[0]->front().delayed_run_time.is_null());
276
277 // Let the task run normally.
278 selector_->AppendQueueToService(0);
279 test_task_runner_->RunUntilIdle();
280 EXPECT_THAT(run_order, ElementsAre(1));
281 } 314 }
282 315
283 TEST_F(TaskQueueManagerTest, ManualPumping) { 316 TEST_F(TaskQueueManagerTest, ManualPumping) {
284 Initialize(1u); 317 Initialize(1u);
285 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); 318 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
286 319
287 std::vector<int> run_order; 320 std::vector<int> run_order;
288 scoped_refptr<base::SingleThreadTaskRunner> runner = 321 scoped_refptr<base::SingleThreadTaskRunner> runner =
289 manager_->TaskRunnerForQueue(0); 322 manager_->TaskRunnerForQueue(0);
290 323
291 // Posting a task when pumping is disabled doesn't result in work getting 324 // Posting a task when pumping is disabled doesn't result in work getting
292 // posted. 325 // posted.
293 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 326 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
294 EXPECT_FALSE(test_task_runner_->HasPendingTask()); 327 EXPECT_FALSE(test_task_runner_->HasPendingTasks());
295 328
296 // However polling still works. 329 // However polling still works.
297 EXPECT_FALSE(manager_->IsQueueEmpty(0)); 330 EXPECT_FALSE(manager_->IsQueueEmpty(0));
298 331
299 // After pumping the task runs normally. 332 // After pumping the task runs normally.
300 manager_->PumpQueue(0); 333 manager_->PumpQueue(0);
301 EXPECT_TRUE(test_task_runner_->HasPendingTask()); 334 EXPECT_TRUE(test_task_runner_->HasPendingTasks());
302 selector_->AppendQueueToService(0); 335 selector_->AppendQueueToService(0);
303 test_task_runner_->RunUntilIdle(); 336 test_task_runner_->RunUntilIdle();
304 EXPECT_THAT(run_order, ElementsAre(1)); 337 EXPECT_THAT(run_order, ElementsAre(1));
305 } 338 }
306 339
307 TEST_F(TaskQueueManagerTest, ManualPumpingToggle) { 340 TEST_F(TaskQueueManagerTest, ManualPumpingToggle) {
308 Initialize(1u); 341 Initialize(1u);
309 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); 342 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
310 343
311 std::vector<int> run_order; 344 std::vector<int> run_order;
312 scoped_refptr<base::SingleThreadTaskRunner> runner = 345 scoped_refptr<base::SingleThreadTaskRunner> runner =
313 manager_->TaskRunnerForQueue(0); 346 manager_->TaskRunnerForQueue(0);
314 347
315 // Posting a task when pumping is disabled doesn't result in work getting 348 // Posting a task when pumping is disabled doesn't result in work getting
316 // posted. 349 // posted.
317 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 350 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
318 EXPECT_FALSE(test_task_runner_->HasPendingTask()); 351 EXPECT_FALSE(test_task_runner_->HasPendingTasks());
319 352
320 // When pumping is enabled the task runs normally. 353 // When pumping is enabled the task runs normally.
321 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AUTO); 354 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AUTO);
322 EXPECT_TRUE(test_task_runner_->HasPendingTask()); 355 EXPECT_TRUE(test_task_runner_->HasPendingTasks());
323 selector_->AppendQueueToService(0); 356 selector_->AppendQueueToService(0);
324 test_task_runner_->RunUntilIdle(); 357 test_task_runner_->RunUntilIdle();
325 EXPECT_THAT(run_order, ElementsAre(1)); 358 EXPECT_THAT(run_order, ElementsAre(1));
326 } 359 }
327 360
328 TEST_F(TaskQueueManagerTest, DenyRunning) { 361 TEST_F(TaskQueueManagerTest, DenyRunning) {
329 Initialize(1u); 362 Initialize(1u);
330 363
331 std::vector<int> run_order; 364 std::vector<int> run_order;
332 scoped_refptr<base::SingleThreadTaskRunner> runner = 365 scoped_refptr<base::SingleThreadTaskRunner> runner =
(...skipping 12 matching lines...) Expand all
345 EXPECT_THAT(run_order, ElementsAre(1)); 378 EXPECT_THAT(run_order, ElementsAre(1));
346 } 379 }
347 380
348 TEST_F(TaskQueueManagerTest, ManualPumpingWithDelayedTask) { 381 TEST_F(TaskQueueManagerTest, ManualPumpingWithDelayedTask) {
349 Initialize(1u); 382 Initialize(1u);
350 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); 383 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
351 384
352 std::vector<int> run_order; 385 std::vector<int> run_order;
353 scoped_refptr<base::SingleThreadTaskRunner> runner = 386 scoped_refptr<base::SingleThreadTaskRunner> runner =
354 manager_->TaskRunnerForQueue(0); 387 manager_->TaskRunnerForQueue(0);
388 selector_->AppendQueueToService(0);
355 389
356 // Posting a delayed task when pumping will apply the delay, but won't cause 390 // Posting a delayed task when pumping will apply the delay, but won't cause
357 // work to executed afterwards. 391 // work to executed afterwards.
358 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); 392 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
359 runner->PostDelayedTask( 393 runner->PostDelayedTask(
360 FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay); 394 FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay);
361 test_task_runner_->RunUntilIdle(); 395
396 // After pumping but before the delay period has expired, task does not run.
397 manager_->PumpQueue(0);
398 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5));
362 EXPECT_TRUE(run_order.empty()); 399 EXPECT_TRUE(run_order.empty());
363 400
364 // After pumping the task runs normally. 401 // Once the delay has expired, pumping causes the task to run.
402 now_src_->AdvanceNow(base::TimeDelta::FromMilliseconds(5));
365 manager_->PumpQueue(0); 403 manager_->PumpQueue(0);
366 EXPECT_TRUE(test_task_runner_->HasPendingTask()); 404 EXPECT_TRUE(test_task_runner_->HasPendingTasks());
405 test_task_runner_->RunPendingTasks();
406 EXPECT_THAT(run_order, ElementsAre(1));
407 }
408
409 TEST_F(TaskQueueManagerTest, DelayedTasksDontAutoRunWithManualPumping) {
410 Initialize(1u);
411 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
412
413 std::vector<int> run_order;
414 scoped_refptr<base::SingleThreadTaskRunner> runner =
415 manager_->TaskRunnerForQueue(0);
367 selector_->AppendQueueToService(0); 416 selector_->AppendQueueToService(0);
368 test_task_runner_->RunUntilIdle(); 417
369 EXPECT_THAT(run_order, ElementsAre(1)); 418 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
419 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
420 delay);
421
422 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(10));
423 EXPECT_TRUE(run_order.empty());
370 } 424 }
371 425
372 TEST_F(TaskQueueManagerTest, ManualPumpingWithNonEmptyWorkQueue) { 426 TEST_F(TaskQueueManagerTest, ManualPumpingWithNonEmptyWorkQueue) {
373 Initialize(1u); 427 Initialize(1u);
374 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); 428 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
375 429
376 std::vector<int> run_order; 430 std::vector<int> run_order;
377 scoped_refptr<base::SingleThreadTaskRunner> runner = 431 scoped_refptr<base::SingleThreadTaskRunner> runner =
378 manager_->TaskRunnerForQueue(0); 432 manager_->TaskRunnerForQueue(0);
379 433
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
470 runner->PostTask(FROM_HERE, 524 runner->PostTask(FROM_HERE,
471 base::Bind(&RePostingTestTask, runner, &run_count)); 525 base::Bind(&RePostingTestTask, runner, &run_count));
472 526
473 selector_->AppendQueueToService(0); 527 selector_->AppendQueueToService(0);
474 selector_->AppendQueueToService(0); 528 selector_->AppendQueueToService(0);
475 selector_->AppendQueueToService(0); 529 selector_->AppendQueueToService(0);
476 530
477 test_task_runner_->RunPendingTasks(); 531 test_task_runner_->RunPendingTasks();
478 // NOTE without the executing_task_ check in MaybePostDoWorkOnMainRunner there 532 // NOTE without the executing_task_ check in MaybePostDoWorkOnMainRunner there
479 // will be two tasks here. 533 // will be two tasks here.
480 EXPECT_EQ(1u, test_task_runner_->GetPendingTasks().size()); 534 EXPECT_EQ(1u, test_task_runner_->NumPendingTasks());
481 EXPECT_EQ(1, run_count); 535 EXPECT_EQ(1, run_count);
482 } 536 }
483 537
484 TEST_F(TaskQueueManagerTest, PostFromNestedRunloop) { 538 TEST_F(TaskQueueManagerTest, PostFromNestedRunloop) {
485 InitializeWithRealMessageLoop(1u); 539 InitializeWithRealMessageLoop(1u);
486 540
487 selector_->AppendQueueToService(0); 541 selector_->AppendQueueToService(0);
488 selector_->AppendQueueToService(0); 542 selector_->AppendQueueToService(0);
489 selector_->AppendQueueToService(0); 543 selector_->AppendQueueToService(0);
490 selector_->AppendQueueToService(0); 544 selector_->AppendQueueToService(0);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
522 selector_->AppendQueueToService(0); 576 selector_->AppendQueueToService(0);
523 selector_->AppendQueueToService(0); 577 selector_->AppendQueueToService(0);
524 578
525 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 579 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
526 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); 580 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
527 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); 581 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
528 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order)); 582 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order));
529 583
530 // Running one task in the host message loop should cause two posted tasks to 584 // Running one task in the host message loop should cause two posted tasks to
531 // get executed. 585 // get executed.
532 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 1u); 586 EXPECT_EQ(test_task_runner_->NumPendingTasks(), 1u);
533 test_task_runner_->RunPendingTasks(); 587 test_task_runner_->RunPendingTasks();
534 EXPECT_THAT(run_order, ElementsAre(1, 2)); 588 EXPECT_THAT(run_order, ElementsAre(1, 2));
535 589
536 // The second task runs the remaining two posted tasks. 590 // The second task runs the remaining two posted tasks.
537 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 1u); 591 EXPECT_EQ(test_task_runner_->NumPendingTasks(), 1u);
538 test_task_runner_->RunPendingTasks(); 592 test_task_runner_->RunPendingTasks();
539 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4)); 593 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4));
540 } 594 }
541 595
542 void AdvanceNowTestTask(int value,
543 std::vector<int>* out_result,
544 scoped_refptr<cc::TestNowSource> time_source,
545 base::TimeDelta delta) {
546 TestTask(value, out_result);
547 time_source->AdvanceNow(delta);
548 }
549
550 TEST_F(TaskQueueManagerTest, InterruptWorkBatchForDelayedTask) {
551 scoped_refptr<cc::TestNowSource> clock(cc::TestNowSource::Create());
552 Initialize(1u);
553
554 manager_->SetWorkBatchSize(2);
555 manager_->SetTimeSourceForTesting(clock);
556
557 std::vector<int> run_order;
558 scoped_refptr<base::SingleThreadTaskRunner> runner =
559 manager_->TaskRunnerForQueue(0);
560
561 selector_->AppendQueueToService(0);
562 selector_->AppendQueueToService(0);
563 selector_->AppendQueueToService(0);
564
565 base::TimeDelta delta(base::TimeDelta::FromMilliseconds(10));
566 runner->PostTask(
567 FROM_HERE, base::Bind(&AdvanceNowTestTask, 2, &run_order, clock, delta));
568 runner->PostTask(
569 FROM_HERE, base::Bind(&AdvanceNowTestTask, 3, &run_order, clock, delta));
570
571 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(5));
572 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
573 delay);
574
575 // At this point we have two posted tasks: one for DoWork and one of the
576 // delayed task. Only the first non-delayed task should get executed because
577 // the work batch is interrupted by the pending delayed task.
578 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 2u);
579 test_task_runner_->RunPendingTasks();
580 EXPECT_THAT(run_order, ElementsAre(2));
581
582 // Running all remaining tasks should execute both pending tasks.
583 test_task_runner_->RunUntilIdle();
584 EXPECT_THAT(run_order, ElementsAre(2, 3, 1));
585 }
586
587 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeup) { 596 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeup) {
588 Initialize(2u); 597 Initialize(2u);
589 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); 598 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP);
590 599
591 std::vector<int> run_order; 600 std::vector<int> run_order;
592 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { 601 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = {
593 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; 602 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)};
594 603
595 selector_->AppendQueueToService(1); 604 selector_->AppendQueueToService(1);
596 selector_->AppendQueueToService(0); 605 selector_->AppendQueueToService(0);
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
831 scoped_refptr<base::SingleThreadTaskRunner> runner = 840 scoped_refptr<base::SingleThreadTaskRunner> runner =
832 manager_->TaskRunnerForQueue(0); 841 manager_->TaskRunnerForQueue(0);
833 EXPECT_TRUE(runner->RunsTasksOnCurrentThread()); 842 EXPECT_TRUE(runner->RunsTasksOnCurrentThread());
834 manager_.reset(); 843 manager_.reset();
835 EXPECT_TRUE(runner->RunsTasksOnCurrentThread()); 844 EXPECT_TRUE(runner->RunsTasksOnCurrentThread());
836 } 845 }
837 846
838 } // namespace 847 } // namespace
839 } // namespace content 848 } // namespace content
840 849
OLDNEW
« no previous file with comments | « content/renderer/scheduler/task_queue_manager.cc ('k') | content/renderer/scheduler/web_scheduler_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698