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

Side by Side Diff: components/scheduler/base/task_queue_manager_unittest.cc

Issue 2158993002: (Merge) Fix a bug that could occasionaly cause setInterval to stop (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@2785
Patch Set: Created 4 years, 5 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
« no previous file with comments | « components/scheduler/base/task_queue_impl.cc ('k') | components/scheduler/base/time_domain.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "components/scheduler/base/task_queue_manager.h" 5 #include "components/scheduler/base/task_queue_manager.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <utility> 9 #include <utility>
10 10
(...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after
384 std::vector<EnqueueOrder> run_order; 384 std::vector<EnqueueOrder> run_order;
385 // Posting a task when pumping is disabled doesn't result in work getting 385 // Posting a task when pumping is disabled doesn't result in work getting
386 // posted. 386 // posted.
387 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 387 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
388 EXPECT_FALSE(test_task_runner_->HasPendingTasks()); 388 EXPECT_FALSE(test_task_runner_->HasPendingTasks());
389 389
390 // However polling still works. 390 // However polling still works.
391 EXPECT_TRUE(runners_[0]->HasPendingImmediateWork()); 391 EXPECT_TRUE(runners_[0]->HasPendingImmediateWork());
392 392
393 // After pumping the task runs normally. 393 // After pumping the task runs normally.
394 runners_[0]->PumpQueue(true); 394 LazyNow lazy_now(now_src_.get());
395 runners_[0]->PumpQueue(&lazy_now, true);
395 EXPECT_TRUE(test_task_runner_->HasPendingTasks()); 396 EXPECT_TRUE(test_task_runner_->HasPendingTasks());
396 test_task_runner_->RunUntilIdle(); 397 test_task_runner_->RunUntilIdle();
397 EXPECT_THAT(run_order, ElementsAre(1)); 398 EXPECT_THAT(run_order, ElementsAre(1));
398 } 399 }
399 400
400 TEST_F(TaskQueueManagerTest, ManualPumpingToggle) { 401 TEST_F(TaskQueueManagerTest, ManualPumpingToggle) {
401 Initialize(1u); 402 Initialize(1u);
402 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); 403 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL);
403 404
404 std::vector<EnqueueOrder> run_order; 405 std::vector<EnqueueOrder> run_order;
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
466 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); 467 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL);
467 468
468 std::vector<EnqueueOrder> run_order; 469 std::vector<EnqueueOrder> run_order;
469 // Posting a delayed task when pumping will apply the delay, but won't cause 470 // Posting a delayed task when pumping will apply the delay, but won't cause
470 // work to executed afterwards. 471 // work to executed afterwards.
471 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); 472 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
472 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), 473 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
473 delay); 474 delay);
474 475
475 // After pumping but before the delay period has expired, task does not run. 476 // After pumping but before the delay period has expired, task does not run.
476 runners_[0]->PumpQueue(true); 477 LazyNow lazy_now1(now_src_.get());
478 runners_[0]->PumpQueue(&lazy_now1, true);
477 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5)); 479 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5));
478 EXPECT_TRUE(run_order.empty()); 480 EXPECT_TRUE(run_order.empty());
479 481
480 // Once the delay has expired, pumping causes the task to run. 482 // Once the delay has expired, pumping causes the task to run.
481 now_src_->Advance(base::TimeDelta::FromMilliseconds(5)); 483 now_src_->Advance(base::TimeDelta::FromMilliseconds(5));
482 runners_[0]->PumpQueue(true); 484 LazyNow lazy_now2(now_src_.get());
485 runners_[0]->PumpQueue(&lazy_now2, true);
483 EXPECT_TRUE(test_task_runner_->HasPendingTasks()); 486 EXPECT_TRUE(test_task_runner_->HasPendingTasks());
484 test_task_runner_->RunPendingTasks(); 487 test_task_runner_->RunPendingTasks();
485 EXPECT_THAT(run_order, ElementsAre(1)); 488 EXPECT_THAT(run_order, ElementsAre(1));
486 } 489 }
487 490
488 TEST_F(TaskQueueManagerTest, ManualPumpingWithMultipleDelayedTasks) { 491 TEST_F(TaskQueueManagerTest, ManualPumpingWithMultipleDelayedTasks) {
489 Initialize(1u); 492 Initialize(1u);
490 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); 493 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL);
491 494
492 std::vector<EnqueueOrder> run_order; 495 std::vector<EnqueueOrder> run_order;
493 // Posting a delayed task when pumping will apply the delay, but won't cause 496 // Posting a delayed task when pumping will apply the delay, but won't cause
494 // work to executed afterwards. 497 // work to executed afterwards.
495 base::TimeDelta delay1(base::TimeDelta::FromMilliseconds(1)); 498 base::TimeDelta delay1(base::TimeDelta::FromMilliseconds(1));
496 base::TimeDelta delay2(base::TimeDelta::FromMilliseconds(10)); 499 base::TimeDelta delay2(base::TimeDelta::FromMilliseconds(10));
497 base::TimeDelta delay3(base::TimeDelta::FromMilliseconds(20)); 500 base::TimeDelta delay3(base::TimeDelta::FromMilliseconds(20));
498 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), 501 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
499 delay1); 502 delay1);
500 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order), 503 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order),
501 delay2); 504 delay2);
502 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order), 505 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order),
503 delay3); 506 delay3);
504 507
505 now_src_->Advance(base::TimeDelta::FromMilliseconds(15)); 508 now_src_->Advance(base::TimeDelta::FromMilliseconds(15));
506 test_task_runner_->RunUntilIdle(); 509 test_task_runner_->RunUntilIdle();
507 EXPECT_TRUE(run_order.empty()); 510 EXPECT_TRUE(run_order.empty());
508 511
509 // Once the delay has expired, pumping causes the task to run. 512 // Once the delay has expired, pumping causes the task to run.
510 runners_[0]->PumpQueue(true); 513 LazyNow lazy_now(now_src_.get());
514 runners_[0]->PumpQueue(&lazy_now, true);
511 test_task_runner_->RunUntilIdle(); 515 test_task_runner_->RunUntilIdle();
512 EXPECT_THAT(run_order, ElementsAre(1, 2)); 516 EXPECT_THAT(run_order, ElementsAre(1, 2));
513 } 517 }
514 518
515 TEST_F(TaskQueueManagerTest, DelayedTasksDontAutoRunWithManualPumping) { 519 TEST_F(TaskQueueManagerTest, DelayedTasksDontAutoRunWithManualPumping) {
516 Initialize(1u); 520 Initialize(1u);
517 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); 521 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL);
518 522
519 std::vector<EnqueueOrder> run_order; 523 std::vector<EnqueueOrder> run_order;
520 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); 524 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
521 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), 525 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
522 delay); 526 delay);
523 527
524 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(10)); 528 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(10));
525 EXPECT_TRUE(run_order.empty()); 529 EXPECT_TRUE(run_order.empty());
526 } 530 }
527 531
528 TEST_F(TaskQueueManagerTest, ManualPumpingWithNonEmptyWorkQueue) { 532 TEST_F(TaskQueueManagerTest, ManualPumpingWithNonEmptyWorkQueue) {
529 Initialize(1u); 533 Initialize(1u);
530 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); 534 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL);
531 535
532 std::vector<EnqueueOrder> run_order; 536 std::vector<EnqueueOrder> run_order;
533 // Posting two tasks and pumping twice should result in two tasks in the work 537 // Posting two tasks and pumping twice should result in two tasks in the work
534 // queue. 538 // queue.
539 LazyNow lazy_now(now_src_.get());
535 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 540 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
536 runners_[0]->PumpQueue(true); 541 runners_[0]->PumpQueue(&lazy_now, true);
537 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); 542 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
538 runners_[0]->PumpQueue(true); 543 runners_[0]->PumpQueue(&lazy_now, true);
539 544
540 EXPECT_EQ(2u, runners_[0]->immediate_work_queue()->Size()); 545 EXPECT_EQ(2u, runners_[0]->immediate_work_queue()->Size());
541 } 546 }
542 547
543 void ReentrantTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner, 548 void ReentrantTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner,
544 int countdown, 549 int countdown,
545 std::vector<EnqueueOrder>* out_result) { 550 std::vector<EnqueueOrder>* out_result) {
546 out_result->push_back(countdown); 551 out_result->push_back(countdown);
547 if (--countdown) { 552 if (--countdown) {
548 runner->PostTask(FROM_HERE, 553 runner->PostTask(FROM_HERE,
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
695 std::vector<EnqueueOrder> run_order; 700 std::vector<EnqueueOrder> run_order;
696 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 701 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
697 test_task_runner_->RunUntilIdle(); 702 test_task_runner_->RunUntilIdle();
698 EXPECT_TRUE(run_order.empty()); // Shouldn't run - no other task to wake TQM. 703 EXPECT_TRUE(run_order.empty()); // Shouldn't run - no other task to wake TQM.
699 704
700 runners_[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); 705 runners_[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
701 test_task_runner_->RunUntilIdle(); 706 test_task_runner_->RunUntilIdle();
702 // This still shouldn't wake TQM as manual queue was not pumped. 707 // This still shouldn't wake TQM as manual queue was not pumped.
703 EXPECT_TRUE(run_order.empty()); 708 EXPECT_TRUE(run_order.empty());
704 709
705 runners_[1]->PumpQueue(true); 710 LazyNow lazy_now(now_src_.get());
711 runners_[1]->PumpQueue(&lazy_now, true);
706 test_task_runner_->RunUntilIdle(); 712 test_task_runner_->RunUntilIdle();
707 // Executing a task on an auto pumped queue should wake the TQM. 713 // Executing a task on an auto pumped queue should wake the TQM.
708 EXPECT_THAT(run_order, ElementsAre(2, 1)); 714 EXPECT_THAT(run_order, ElementsAre(2, 1));
709 } 715 }
710 716
711 void TestPostingTask(scoped_refptr<base::SingleThreadTaskRunner> task_runner, 717 void TestPostingTask(scoped_refptr<base::SingleThreadTaskRunner> task_runner,
712 base::Closure task) { 718 base::Closure task) {
713 task_runner->PostTask(FROM_HERE, task); 719 task_runner->PostTask(FROM_HERE, task);
714 } 720 }
715 721
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after
1028 1034
1029 queue0->PostTask(FROM_HERE, base::Bind(NullTask)); 1035 queue0->PostTask(FROM_HERE, base::Bind(NullTask));
1030 queue1->PostTask(FROM_HERE, base::Bind(NullTask)); 1036 queue1->PostTask(FROM_HERE, base::Bind(NullTask));
1031 EXPECT_TRUE(queue0->HasPendingImmediateWork()); 1037 EXPECT_TRUE(queue0->HasPendingImmediateWork());
1032 EXPECT_TRUE(queue1->HasPendingImmediateWork()); 1038 EXPECT_TRUE(queue1->HasPendingImmediateWork());
1033 1039
1034 test_task_runner_->RunUntilIdle(); 1040 test_task_runner_->RunUntilIdle();
1035 EXPECT_FALSE(queue0->HasPendingImmediateWork()); 1041 EXPECT_FALSE(queue0->HasPendingImmediateWork());
1036 EXPECT_TRUE(queue1->HasPendingImmediateWork()); 1042 EXPECT_TRUE(queue1->HasPendingImmediateWork());
1037 1043
1038 queue1->PumpQueue(true); 1044 LazyNow lazy_now(now_src_.get());
1045 queue1->PumpQueue(&lazy_now, true);
1039 EXPECT_FALSE(queue0->HasPendingImmediateWork()); 1046 EXPECT_FALSE(queue0->HasPendingImmediateWork());
1040 EXPECT_TRUE(queue1->HasPendingImmediateWork()); 1047 EXPECT_TRUE(queue1->HasPendingImmediateWork());
1041 1048
1042 test_task_runner_->RunUntilIdle(); 1049 test_task_runner_->RunUntilIdle();
1043 EXPECT_FALSE(queue0->HasPendingImmediateWork()); 1050 EXPECT_FALSE(queue0->HasPendingImmediateWork());
1044 EXPECT_FALSE(queue1->HasPendingImmediateWork()); 1051 EXPECT_FALSE(queue1->HasPendingImmediateWork());
1045 } 1052 }
1046 1053
1047 TEST_F(TaskQueueManagerTest, HasPendingImmediateWorkAndNeedsPumping) { 1054 TEST_F(TaskQueueManagerTest, HasPendingImmediateWorkAndNeedsPumping) {
1048 Initialize(2u); 1055 Initialize(2u);
(...skipping 22 matching lines...) Expand all
1071 EXPECT_TRUE(queue1->HasPendingImmediateWork()); 1078 EXPECT_TRUE(queue1->HasPendingImmediateWork());
1072 EXPECT_TRUE(queue1->NeedsPumping()); 1079 EXPECT_TRUE(queue1->NeedsPumping());
1073 1080
1074 test_task_runner_->ClearRunTaskLimit(); 1081 test_task_runner_->ClearRunTaskLimit();
1075 test_task_runner_->RunUntilIdle(); 1082 test_task_runner_->RunUntilIdle();
1076 EXPECT_FALSE(queue0->HasPendingImmediateWork()); 1083 EXPECT_FALSE(queue0->HasPendingImmediateWork());
1077 EXPECT_FALSE(queue0->NeedsPumping()); 1084 EXPECT_FALSE(queue0->NeedsPumping());
1078 EXPECT_TRUE(queue1->HasPendingImmediateWork()); 1085 EXPECT_TRUE(queue1->HasPendingImmediateWork());
1079 EXPECT_TRUE(queue1->NeedsPumping()); 1086 EXPECT_TRUE(queue1->NeedsPumping());
1080 1087
1081 queue1->PumpQueue(true); 1088 LazyNow lazy_now(now_src_.get());
1089 queue1->PumpQueue(&lazy_now, true);
1082 EXPECT_FALSE(queue0->HasPendingImmediateWork()); 1090 EXPECT_FALSE(queue0->HasPendingImmediateWork());
1083 EXPECT_FALSE(queue0->NeedsPumping()); 1091 EXPECT_FALSE(queue0->NeedsPumping());
1084 EXPECT_TRUE(queue1->HasPendingImmediateWork()); 1092 EXPECT_TRUE(queue1->HasPendingImmediateWork());
1085 EXPECT_FALSE(queue1->NeedsPumping()); 1093 EXPECT_FALSE(queue1->NeedsPumping());
1086 1094
1087 test_task_runner_->RunUntilIdle(); 1095 test_task_runner_->RunUntilIdle();
1088 EXPECT_FALSE(queue0->HasPendingImmediateWork()); 1096 EXPECT_FALSE(queue0->HasPendingImmediateWork());
1089 EXPECT_FALSE(queue0->NeedsPumping()); 1097 EXPECT_FALSE(queue0->NeedsPumping());
1090 EXPECT_FALSE(queue1->HasPendingImmediateWork()); 1098 EXPECT_FALSE(queue1->HasPendingImmediateWork());
1091 EXPECT_FALSE(queue1->NeedsPumping()); 1099 EXPECT_FALSE(queue1->NeedsPumping());
(...skipping 820 matching lines...) Expand 10 before | Expand all | Expand 10 after
1912 1920
1913 trace_analyzer::TraceEventVector events; 1921 trace_analyzer::TraceEventVector events;
1914 Query q = Query::EventPhaseIs(TRACE_EVENT_PHASE_ENTER_CONTEXT) || 1922 Query q = Query::EventPhaseIs(TRACE_EVENT_PHASE_ENTER_CONTEXT) ||
1915 Query::EventPhaseIs(TRACE_EVENT_PHASE_LEAVE_CONTEXT); 1923 Query::EventPhaseIs(TRACE_EVENT_PHASE_LEAVE_CONTEXT);
1916 analyzer->FindEvents(q, &events); 1924 analyzer->FindEvents(q, &events);
1917 1925
1918 EXPECT_EQ(2u, events.size()); 1926 EXPECT_EQ(2u, events.size());
1919 } 1927 }
1920 1928
1921 } // namespace scheduler 1929 } // namespace scheduler
OLDNEW
« no previous file with comments | « components/scheduler/base/task_queue_impl.cc ('k') | components/scheduler/base/time_domain.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698