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

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

Issue 2155143002: Fix a bug that could occasionaly cause setInterval to stop (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: ClearExpiredWakeups tweak. 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 427 matching lines...) Expand 10 before | Expand all | Expand 10 after
438 std::vector<EnqueueOrder> run_order; 438 std::vector<EnqueueOrder> run_order;
439 // Posting a task when pumping is disabled doesn't result in work getting 439 // Posting a task when pumping is disabled doesn't result in work getting
440 // posted. 440 // posted.
441 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 441 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
442 EXPECT_FALSE(test_task_runner_->HasPendingTasks()); 442 EXPECT_FALSE(test_task_runner_->HasPendingTasks());
443 443
444 // However polling still works. 444 // However polling still works.
445 EXPECT_TRUE(runners_[0]->HasPendingImmediateWork()); 445 EXPECT_TRUE(runners_[0]->HasPendingImmediateWork());
446 446
447 // After pumping the task runs normally. 447 // After pumping the task runs normally.
448 runners_[0]->PumpQueue(true); 448 LazyNow lazy_now(now_src_.get());
449 runners_[0]->PumpQueue(&lazy_now, true);
449 EXPECT_TRUE(test_task_runner_->HasPendingTasks()); 450 EXPECT_TRUE(test_task_runner_->HasPendingTasks());
450 test_task_runner_->RunUntilIdle(); 451 test_task_runner_->RunUntilIdle();
451 EXPECT_THAT(run_order, ElementsAre(1)); 452 EXPECT_THAT(run_order, ElementsAre(1));
452 } 453 }
453 454
454 TEST_F(TaskQueueManagerTest, ManualPumpingToggle) { 455 TEST_F(TaskQueueManagerTest, ManualPumpingToggle) {
455 Initialize(1u); 456 Initialize(1u);
456 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); 457 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL);
457 458
458 std::vector<EnqueueOrder> run_order; 459 std::vector<EnqueueOrder> run_order;
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
520 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); 521 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL);
521 522
522 std::vector<EnqueueOrder> run_order; 523 std::vector<EnqueueOrder> run_order;
523 // Posting a delayed task when pumping will apply the delay, but won't cause 524 // Posting a delayed task when pumping will apply the delay, but won't cause
524 // work to executed afterwards. 525 // work to executed afterwards.
525 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); 526 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
526 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), 527 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
527 delay); 528 delay);
528 529
529 // After pumping but before the delay period has expired, task does not run. 530 // After pumping but before the delay period has expired, task does not run.
530 runners_[0]->PumpQueue(true); 531 LazyNow lazy_now1(now_src_.get());
532 runners_[0]->PumpQueue(&lazy_now1, true);
531 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5)); 533 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5));
532 EXPECT_TRUE(run_order.empty()); 534 EXPECT_TRUE(run_order.empty());
533 535
534 // Once the delay has expired, pumping causes the task to run. 536 // Once the delay has expired, pumping causes the task to run.
535 now_src_->Advance(base::TimeDelta::FromMilliseconds(5)); 537 now_src_->Advance(base::TimeDelta::FromMilliseconds(5));
536 runners_[0]->PumpQueue(true); 538 LazyNow lazy_now2(now_src_.get());
539 runners_[0]->PumpQueue(&lazy_now2, true);
537 EXPECT_TRUE(test_task_runner_->HasPendingTasks()); 540 EXPECT_TRUE(test_task_runner_->HasPendingTasks());
538 test_task_runner_->RunPendingTasks(); 541 test_task_runner_->RunPendingTasks();
539 EXPECT_THAT(run_order, ElementsAre(1)); 542 EXPECT_THAT(run_order, ElementsAre(1));
540 } 543 }
541 544
542 TEST_F(TaskQueueManagerTest, ManualPumpingWithMultipleDelayedTasks) { 545 TEST_F(TaskQueueManagerTest, ManualPumpingWithMultipleDelayedTasks) {
543 Initialize(1u); 546 Initialize(1u);
544 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); 547 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL);
545 548
546 std::vector<EnqueueOrder> run_order; 549 std::vector<EnqueueOrder> run_order;
547 // Posting a delayed task when pumping will apply the delay, but won't cause 550 // Posting a delayed task when pumping will apply the delay, but won't cause
548 // work to executed afterwards. 551 // work to executed afterwards.
549 base::TimeDelta delay1(base::TimeDelta::FromMilliseconds(1)); 552 base::TimeDelta delay1(base::TimeDelta::FromMilliseconds(1));
550 base::TimeDelta delay2(base::TimeDelta::FromMilliseconds(10)); 553 base::TimeDelta delay2(base::TimeDelta::FromMilliseconds(10));
551 base::TimeDelta delay3(base::TimeDelta::FromMilliseconds(20)); 554 base::TimeDelta delay3(base::TimeDelta::FromMilliseconds(20));
552 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), 555 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
553 delay1); 556 delay1);
554 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order), 557 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order),
555 delay2); 558 delay2);
556 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order), 559 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order),
557 delay3); 560 delay3);
558 561
559 now_src_->Advance(base::TimeDelta::FromMilliseconds(15)); 562 now_src_->Advance(base::TimeDelta::FromMilliseconds(15));
560 test_task_runner_->RunUntilIdle(); 563 test_task_runner_->RunUntilIdle();
561 EXPECT_TRUE(run_order.empty()); 564 EXPECT_TRUE(run_order.empty());
562 565
563 // Once the delay has expired, pumping causes the task to run. 566 // Once the delay has expired, pumping causes the task to run.
564 runners_[0]->PumpQueue(true); 567 LazyNow lazy_now(now_src_.get());
568 runners_[0]->PumpQueue(&lazy_now, true);
565 test_task_runner_->RunUntilIdle(); 569 test_task_runner_->RunUntilIdle();
566 EXPECT_THAT(run_order, ElementsAre(1, 2)); 570 EXPECT_THAT(run_order, ElementsAre(1, 2));
567 } 571 }
568 572
569 TEST_F(TaskQueueManagerTest, DelayedTasksDontAutoRunWithManualPumping) { 573 TEST_F(TaskQueueManagerTest, DelayedTasksDontAutoRunWithManualPumping) {
570 Initialize(1u); 574 Initialize(1u);
571 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); 575 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL);
572 576
573 std::vector<EnqueueOrder> run_order; 577 std::vector<EnqueueOrder> run_order;
574 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); 578 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
575 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), 579 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
576 delay); 580 delay);
577 581
578 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(10)); 582 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(10));
579 EXPECT_TRUE(run_order.empty()); 583 EXPECT_TRUE(run_order.empty());
580 } 584 }
581 585
582 TEST_F(TaskQueueManagerTest, ManualPumpingWithNonEmptyWorkQueue) { 586 TEST_F(TaskQueueManagerTest, ManualPumpingWithNonEmptyWorkQueue) {
583 Initialize(1u); 587 Initialize(1u);
584 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); 588 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL);
585 589
586 std::vector<EnqueueOrder> run_order; 590 std::vector<EnqueueOrder> run_order;
587 // Posting two tasks and pumping twice should result in two tasks in the work 591 // Posting two tasks and pumping twice should result in two tasks in the work
588 // queue. 592 // queue.
593 LazyNow lazy_now(now_src_.get());
589 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 594 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
590 runners_[0]->PumpQueue(true); 595 runners_[0]->PumpQueue(&lazy_now, true);
591 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); 596 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
592 runners_[0]->PumpQueue(true); 597 runners_[0]->PumpQueue(&lazy_now, true);
593 598
594 EXPECT_EQ(2u, runners_[0]->immediate_work_queue()->Size()); 599 EXPECT_EQ(2u, runners_[0]->immediate_work_queue()->Size());
595 } 600 }
596 601
597 void ReentrantTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner, 602 void ReentrantTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner,
598 int countdown, 603 int countdown,
599 std::vector<EnqueueOrder>* out_result) { 604 std::vector<EnqueueOrder>* out_result) {
600 out_result->push_back(countdown); 605 out_result->push_back(countdown);
601 if (--countdown) { 606 if (--countdown) {
602 runner->PostTask(FROM_HERE, 607 runner->PostTask(FROM_HERE,
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
749 std::vector<EnqueueOrder> run_order; 754 std::vector<EnqueueOrder> run_order;
750 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 755 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
751 test_task_runner_->RunUntilIdle(); 756 test_task_runner_->RunUntilIdle();
752 EXPECT_TRUE(run_order.empty()); // Shouldn't run - no other task to wake TQM. 757 EXPECT_TRUE(run_order.empty()); // Shouldn't run - no other task to wake TQM.
753 758
754 runners_[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); 759 runners_[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
755 test_task_runner_->RunUntilIdle(); 760 test_task_runner_->RunUntilIdle();
756 // This still shouldn't wake TQM as manual queue was not pumped. 761 // This still shouldn't wake TQM as manual queue was not pumped.
757 EXPECT_TRUE(run_order.empty()); 762 EXPECT_TRUE(run_order.empty());
758 763
759 runners_[1]->PumpQueue(true); 764 LazyNow lazy_now(now_src_.get());
765 runners_[1]->PumpQueue(&lazy_now, true);
760 test_task_runner_->RunUntilIdle(); 766 test_task_runner_->RunUntilIdle();
761 // Executing a task on an auto pumped queue should wake the TQM. 767 // Executing a task on an auto pumped queue should wake the TQM.
762 EXPECT_THAT(run_order, ElementsAre(2, 1)); 768 EXPECT_THAT(run_order, ElementsAre(2, 1));
763 } 769 }
764 770
765 void TestPostingTask(scoped_refptr<base::SingleThreadTaskRunner> task_runner, 771 void TestPostingTask(scoped_refptr<base::SingleThreadTaskRunner> task_runner,
766 base::Closure task) { 772 base::Closure task) {
767 task_runner->PostTask(FROM_HERE, task); 773 task_runner->PostTask(FROM_HERE, task);
768 } 774 }
769 775
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after
1082 1088
1083 queue0->PostTask(FROM_HERE, base::Bind(NullTask)); 1089 queue0->PostTask(FROM_HERE, base::Bind(NullTask));
1084 queue1->PostTask(FROM_HERE, base::Bind(NullTask)); 1090 queue1->PostTask(FROM_HERE, base::Bind(NullTask));
1085 EXPECT_TRUE(queue0->HasPendingImmediateWork()); 1091 EXPECT_TRUE(queue0->HasPendingImmediateWork());
1086 EXPECT_TRUE(queue1->HasPendingImmediateWork()); 1092 EXPECT_TRUE(queue1->HasPendingImmediateWork());
1087 1093
1088 test_task_runner_->RunUntilIdle(); 1094 test_task_runner_->RunUntilIdle();
1089 EXPECT_FALSE(queue0->HasPendingImmediateWork()); 1095 EXPECT_FALSE(queue0->HasPendingImmediateWork());
1090 EXPECT_TRUE(queue1->HasPendingImmediateWork()); 1096 EXPECT_TRUE(queue1->HasPendingImmediateWork());
1091 1097
1092 queue1->PumpQueue(true); 1098 LazyNow lazy_now(now_src_.get());
1099 queue1->PumpQueue(&lazy_now, true);
1093 EXPECT_FALSE(queue0->HasPendingImmediateWork()); 1100 EXPECT_FALSE(queue0->HasPendingImmediateWork());
1094 EXPECT_TRUE(queue1->HasPendingImmediateWork()); 1101 EXPECT_TRUE(queue1->HasPendingImmediateWork());
1095 1102
1096 test_task_runner_->RunUntilIdle(); 1103 test_task_runner_->RunUntilIdle();
1097 EXPECT_FALSE(queue0->HasPendingImmediateWork()); 1104 EXPECT_FALSE(queue0->HasPendingImmediateWork());
1098 EXPECT_FALSE(queue1->HasPendingImmediateWork()); 1105 EXPECT_FALSE(queue1->HasPendingImmediateWork());
1099 } 1106 }
1100 1107
1101 TEST_F(TaskQueueManagerTest, HasPendingImmediateWorkAndNeedsPumping) { 1108 TEST_F(TaskQueueManagerTest, HasPendingImmediateWorkAndNeedsPumping) {
1102 Initialize(2u); 1109 Initialize(2u);
(...skipping 22 matching lines...) Expand all
1125 EXPECT_TRUE(queue1->HasPendingImmediateWork()); 1132 EXPECT_TRUE(queue1->HasPendingImmediateWork());
1126 EXPECT_TRUE(queue1->NeedsPumping()); 1133 EXPECT_TRUE(queue1->NeedsPumping());
1127 1134
1128 test_task_runner_->ClearRunTaskLimit(); 1135 test_task_runner_->ClearRunTaskLimit();
1129 test_task_runner_->RunUntilIdle(); 1136 test_task_runner_->RunUntilIdle();
1130 EXPECT_FALSE(queue0->HasPendingImmediateWork()); 1137 EXPECT_FALSE(queue0->HasPendingImmediateWork());
1131 EXPECT_FALSE(queue0->NeedsPumping()); 1138 EXPECT_FALSE(queue0->NeedsPumping());
1132 EXPECT_TRUE(queue1->HasPendingImmediateWork()); 1139 EXPECT_TRUE(queue1->HasPendingImmediateWork());
1133 EXPECT_TRUE(queue1->NeedsPumping()); 1140 EXPECT_TRUE(queue1->NeedsPumping());
1134 1141
1135 queue1->PumpQueue(true); 1142 LazyNow lazy_now(now_src_.get());
1143 queue1->PumpQueue(&lazy_now, true);
1136 EXPECT_FALSE(queue0->HasPendingImmediateWork()); 1144 EXPECT_FALSE(queue0->HasPendingImmediateWork());
1137 EXPECT_FALSE(queue0->NeedsPumping()); 1145 EXPECT_FALSE(queue0->NeedsPumping());
1138 EXPECT_TRUE(queue1->HasPendingImmediateWork()); 1146 EXPECT_TRUE(queue1->HasPendingImmediateWork());
1139 EXPECT_FALSE(queue1->NeedsPumping()); 1147 EXPECT_FALSE(queue1->NeedsPumping());
1140 1148
1141 test_task_runner_->RunUntilIdle(); 1149 test_task_runner_->RunUntilIdle();
1142 EXPECT_FALSE(queue0->HasPendingImmediateWork()); 1150 EXPECT_FALSE(queue0->HasPendingImmediateWork());
1143 EXPECT_FALSE(queue0->NeedsPumping()); 1151 EXPECT_FALSE(queue0->NeedsPumping());
1144 EXPECT_FALSE(queue1->HasPendingImmediateWork()); 1152 EXPECT_FALSE(queue1->HasPendingImmediateWork());
1145 EXPECT_FALSE(queue1->NeedsPumping()); 1153 EXPECT_FALSE(queue1->NeedsPumping());
(...skipping 820 matching lines...) Expand 10 before | Expand all | Expand 10 after
1966 1974
1967 trace_analyzer::TraceEventVector events; 1975 trace_analyzer::TraceEventVector events;
1968 Query q = Query::EventPhaseIs(TRACE_EVENT_PHASE_ENTER_CONTEXT) || 1976 Query q = Query::EventPhaseIs(TRACE_EVENT_PHASE_ENTER_CONTEXT) ||
1969 Query::EventPhaseIs(TRACE_EVENT_PHASE_LEAVE_CONTEXT); 1977 Query::EventPhaseIs(TRACE_EVENT_PHASE_LEAVE_CONTEXT);
1970 analyzer->FindEvents(q, &events); 1978 analyzer->FindEvents(q, &events);
1971 1979
1972 EXPECT_EQ(2u, events.size()); 1980 EXPECT_EQ(2u, events.size());
1973 } 1981 }
1974 1982
1975 } // namespace scheduler 1983 } // 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