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

Side by Side Diff: third_party/WebKit/Source/platform/scheduler/child/idle_helper_unittest.cc

Issue 2487343004: Make sure scheduler shutdown prevents idle tasks from running (Closed)
Patch Set: Added a test which fails without the patch. Created 4 years, 1 month 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "platform/scheduler/child/idle_helper.h" 5 #include "platform/scheduler/child/idle_helper.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/callback.h" 9 #include "base/callback.h"
10 #include "base/macros.h" 10 #include "base/macros.h"
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner, 136 scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner,
137 std::unique_ptr<TestTimeSource> test_time_source) { 137 std::unique_ptr<TestTimeSource> test_time_source) {
138 if (message_loop) 138 if (message_loop)
139 return SchedulerTqmDelegateImpl::Create(message_loop, 139 return SchedulerTqmDelegateImpl::Create(message_loop,
140 std::move(test_time_source)); 140 std::move(test_time_source));
141 141
142 return SchedulerTqmDelegateForTest::Create(mock_task_runner, 142 return SchedulerTqmDelegateForTest::Create(mock_task_runner,
143 std::move(test_time_source)); 143 std::move(test_time_source));
144 } 144 }
145 145
146 void ShutdownIdleTask(IdleHelper* helper,
147 bool* shutdown_task_run,
148 base::TimeTicks deadline) {
149 *shutdown_task_run = true;
150 helper->Shutdown();
151 }
152
146 }; // namespace 153 }; // namespace
147 154
148 class IdleHelperForTest : public IdleHelper, public IdleHelper::Delegate { 155 class IdleHelperForTest : public IdleHelper, public IdleHelper::Delegate {
149 public: 156 public:
150 explicit IdleHelperForTest( 157 explicit IdleHelperForTest(
151 SchedulerHelper* scheduler_helper, 158 SchedulerHelper* scheduler_helper,
152 base::TimeDelta required_quiescence_duration_before_long_idle_period) 159 base::TimeDelta required_quiescence_duration_before_long_idle_period)
153 : IdleHelper(scheduler_helper, 160 : IdleHelper(scheduler_helper,
154 this, 161 this,
155 "test.idle", 162 "test.idle",
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 208
202 void SetUp() override { 209 void SetUp() override {
203 EXPECT_CALL(*idle_helper_, OnIdlePeriodStarted()).Times(AnyNumber()); 210 EXPECT_CALL(*idle_helper_, OnIdlePeriodStarted()).Times(AnyNumber());
204 EXPECT_CALL(*idle_helper_, OnIdlePeriodEnded()).Times(AnyNumber()); 211 EXPECT_CALL(*idle_helper_, OnIdlePeriodEnded()).Times(AnyNumber());
205 EXPECT_CALL(*idle_helper_, CanEnterLongIdlePeriod(_, _)) 212 EXPECT_CALL(*idle_helper_, CanEnterLongIdlePeriod(_, _))
206 .Times(AnyNumber()) 213 .Times(AnyNumber())
207 .WillRepeatedly(Return(true)); 214 .WillRepeatedly(Return(true));
208 } 215 }
209 216
210 void TearDown() override { 217 void TearDown() override {
218 EXPECT_CALL(*idle_helper_, OnIdlePeriodEnded()).Times(AnyNumber());
219 idle_helper_->Shutdown();
211 DCHECK(!mock_task_runner_.get() || !message_loop_.get()); 220 DCHECK(!mock_task_runner_.get() || !message_loop_.get());
212 if (mock_task_runner_.get()) { 221 if (mock_task_runner_.get()) {
213 // Check that all tests stop posting tasks. 222 // Check that all tests stop posting tasks.
214 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); 223 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
215 while (mock_task_runner_->RunUntilIdle()) { 224 while (mock_task_runner_->RunUntilIdle()) {
216 } 225 }
217 } else { 226 } else {
218 base::RunLoop().RunUntilIdle(); 227 base::RunLoop().RunUntilIdle();
219 } 228 }
220 } 229 }
(...skipping 551 matching lines...) Expand 10 before | Expand all | Expand 10 after
772 idle_helper_->EndIdlePeriod(); 781 idle_helper_->EndIdlePeriod();
773 CheckIdlePeriodStateIs("not_in_idle_period"); 782 CheckIdlePeriodStateIs("not_in_idle_period");
774 } 783 }
775 784
776 TEST_F(IdleHelperTest, TestLongIdlePeriodWhenShutdown) { 785 TEST_F(IdleHelperTest, TestLongIdlePeriodWhenShutdown) {
777 base::TimeTicks deadline_in_task; 786 base::TimeTicks deadline_in_task;
778 int run_count = 0; 787 int run_count = 0;
779 788
780 idle_task_runner_->PostIdleTask( 789 idle_task_runner_->PostIdleTask(
781 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); 790 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task));
782 scheduler_helper_->Shutdown(); 791 idle_helper_->Shutdown();
783 792
784 // We shouldn't be able to enter a long idle period when shutdown 793 // We shouldn't be able to enter a long idle period when shutdown
785 idle_helper_->EnableLongIdlePeriod(); 794 idle_helper_->EnableLongIdlePeriod();
786 RunUntilIdle(); 795 RunUntilIdle();
787 CheckIdlePeriodStateIs("not_in_idle_period"); 796 CheckIdlePeriodStateIs("not_in_idle_period");
788 EXPECT_EQ(0, run_count); 797 EXPECT_EQ(0, run_count);
789 } 798 }
790 799
791 void TestCanExceedIdleDeadlineIfRequiredTask(IdleHelperForTest* idle_helper, 800 void TestCanExceedIdleDeadlineIfRequiredTask(IdleHelperForTest* idle_helper,
792 bool* can_exceed_idle_deadline_out, 801 bool* can_exceed_idle_deadline_out,
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
1036 RunUntilIdle(); 1045 RunUntilIdle();
1037 EXPECT_EQ(0, run_count); 1046 EXPECT_EQ(0, run_count);
1038 1047
1039 default_task_runner_->PostDelayedTask(FROM_HERE, base::Bind(&NullTask), 1048 default_task_runner_->PostDelayedTask(FROM_HERE, base::Bind(&NullTask),
1040 more_than_min_deadline_duration); 1049 more_than_min_deadline_duration);
1041 idle_helper_->EnableLongIdlePeriod(); 1050 idle_helper_->EnableLongIdlePeriod();
1042 RunUntilIdle(); 1051 RunUntilIdle();
1043 EXPECT_EQ(1, run_count); 1052 EXPECT_EQ(1, run_count);
1044 } 1053 }
1045 1054
1055 TEST_F(IdleHelperWithQuiescencePeriodTest,
1056 PendingEnableLongIdlePeriodNotRunAfterShutdown) {
1057 MakeNonQuiescent();
1058
1059 bool shutdown_task_run = false;
1060 int run_count = 0;
1061 base::TimeTicks deadline_in_task;
1062 idle_task_runner_->PostIdleTask(
1063 FROM_HERE,
1064 base::Bind(&ShutdownIdleTask, base::Unretained(idle_helper_.get()),
1065 &shutdown_task_run));
1066 idle_task_runner_->PostIdleTask(
1067 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task));
1068
1069 // Delayed call to IdleHelper::EnableLongIdlePeriod enables idle tasks.
1070 idle_helper_->EnableLongIdlePeriod();
1071 clock_->Advance(maximum_idle_period_duration() * 2.0);
1072 mock_task_runner_->RunPendingTasks();
1073 EXPECT_TRUE(shutdown_task_run);
1074 EXPECT_EQ(0, run_count);
1075
1076 // Shutdown immediately after idle period started should prevent the idle
1077 // task from running.
1078 idle_helper_->Shutdown();
1079 mock_task_runner_->RunUntilIdle();
1080 EXPECT_EQ(0, run_count);
1081 }
1082
1046 } // namespace scheduler 1083 } // namespace scheduler
1047 } // namespace blink 1084 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698