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

Side by Side Diff: components/scheduler/child/scheduler_helper_unittest.cc

Issue 1106213002: Adds a SHUTDOWN_TASK_QUEUE and a PreShutdown api to the scheduler. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Review comments. Created 5 years, 7 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 "components/scheduler/child/scheduler_helper.h" 5 #include "components/scheduler/child/scheduler_helper.h"
6 6
7 #include "base/callback.h" 7 #include "base/callback.h"
8 #include "cc/test/ordered_simple_task_runner.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 "components/scheduler/child/nestable_task_runner_for_test.h" 10 #include "components/scheduler/child/nestable_task_runner_for_test.h"
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
123 TASK_QUEUE_COUNT, 123 TASK_QUEUE_COUNT,
124 required_quiescence_duration_before_long_idle_period) {} 124 required_quiescence_duration_before_long_idle_period) {}
125 125
126 ~SchedulerHelperForTest() override {} 126 ~SchedulerHelperForTest() override {}
127 127
128 // SchedulerHelperDelegate implementation: 128 // SchedulerHelperDelegate implementation:
129 MOCK_METHOD2(CanEnterLongIdlePeriod, 129 MOCK_METHOD2(CanEnterLongIdlePeriod,
130 bool(base::TimeTicks now, 130 bool(base::TimeTicks now,
131 base::TimeDelta* next_long_idle_period_delay_out)); 131 base::TimeDelta* next_long_idle_period_delay_out));
132 132
133 MOCK_METHOD0(IsNotQuiescent, void()); 133 void IsNotQuiescent() override {}
134 }; 134 };
135 135
136 class BaseSchedulerHelperTest : public testing::Test { 136 class BaseSchedulerHelperTest : public testing::Test {
137 public: 137 public:
138 BaseSchedulerHelperTest( 138 BaseSchedulerHelperTest(
139 base::MessageLoop* message_loop, 139 base::MessageLoop* message_loop,
140 base::TimeDelta required_quiescence_duration_before_long_idle_period) 140 base::TimeDelta required_quiescence_duration_before_long_idle_period)
141 : clock_(cc::TestNowSource::Create(5000)), 141 : clock_(cc::TestNowSource::Create(5000)),
142 mock_task_runner_(message_loop 142 mock_task_runner_(message_loop
143 ? nullptr 143 ? nullptr
144 : new cc::OrderedSimpleTaskRunner(clock_, false)), 144 : new cc::OrderedSimpleTaskRunner(clock_, false)),
145 message_loop_(message_loop), 145 message_loop_(message_loop),
146 nestable_task_runner_( 146 nestable_task_runner_(
147 CreateNestableSingleThreadTaskRunner(message_loop, 147 CreateNestableSingleThreadTaskRunner(message_loop,
148 mock_task_runner_)), 148 mock_task_runner_)),
149 scheduler_helper_(new SchedulerHelperForTest( 149 scheduler_helper_(new SchedulerHelperForTest(
150 nestable_task_runner_, 150 nestable_task_runner_,
151 required_quiescence_duration_before_long_idle_period)), 151 required_quiescence_duration_before_long_idle_period)),
152 default_task_runner_(scheduler_helper_->DefaultTaskRunner()), 152 default_task_runner_(scheduler_helper_->DefaultTaskRunner()),
153 idle_task_runner_(scheduler_helper_->IdleTaskRunner()) { 153 idle_task_runner_(scheduler_helper_->IdleTaskRunner()),
154 control_task_runner_(scheduler_helper_->ControlTaskRunner()),
155 shutdown_task_runner_(scheduler_helper_->ShutdownTaskRunner()) {
154 scheduler_helper_->SetTimeSourceForTesting( 156 scheduler_helper_->SetTimeSourceForTesting(
155 make_scoped_ptr(new TestTimeSource(clock_))); 157 make_scoped_ptr(new TestTimeSource(clock_)));
156 scheduler_helper_->GetTaskQueueManagerForTesting()->SetTimeSourceForTesting( 158 scheduler_helper_->GetTaskQueueManagerForTesting()->SetTimeSourceForTesting(
157 make_scoped_ptr(new TestTimeSource(clock_))); 159 make_scoped_ptr(new TestTimeSource(clock_)));
158 } 160 }
159 161
160 ~BaseSchedulerHelperTest() override {} 162 ~BaseSchedulerHelperTest() override {}
161 163
162 void TearDown() override { 164 void TearDown() override {
163 DCHECK(!mock_task_runner_.get() || !message_loop_.get()); 165 DCHECK(!mock_task_runner_.get() || !message_loop_.get());
(...skipping 14 matching lines...) Expand all
178 mock_task_runner_->RunUntilIdle(); 180 mock_task_runner_->RunUntilIdle();
179 else 181 else
180 message_loop_->RunUntilIdle(); 182 message_loop_->RunUntilIdle();
181 } 183 }
182 184
183 // Helper for posting several tasks of specific types. |task_descriptor| is a 185 // Helper for posting several tasks of specific types. |task_descriptor| is a
184 // string with space delimited task identifiers. The first letter of each 186 // string with space delimited task identifiers. The first letter of each
185 // task identifier specifies the task type: 187 // task identifier specifies the task type:
186 // - 'D': Default task 188 // - 'D': Default task
187 // - 'I': Idle task 189 // - 'I': Idle task
190 // - 'S': Shutdown task
191 // - 'T': conTrol task (to avoid confusion with compositor tasks)
188 void PostTestTasks(std::vector<std::string>* run_order, 192 void PostTestTasks(std::vector<std::string>* run_order,
189 const std::string& task_descriptor) { 193 const std::string& task_descriptor) {
190 std::istringstream stream(task_descriptor); 194 std::istringstream stream(task_descriptor);
191 while (!stream.eof()) { 195 while (!stream.eof()) {
192 std::string task; 196 std::string task;
193 stream >> task; 197 stream >> task;
194 switch (task[0]) { 198 switch (task[0]) {
195 case 'D': 199 case 'D':
196 default_task_runner_->PostTask( 200 default_task_runner_->PostTask(
197 FROM_HERE, base::Bind(&AppendToVectorTestTask, run_order, task)); 201 FROM_HERE, base::Bind(&AppendToVectorTestTask, run_order, task));
198 break; 202 break;
199 case 'I': 203 case 'I':
200 idle_task_runner_->PostIdleTask( 204 idle_task_runner_->PostIdleTask(
201 FROM_HERE, 205 FROM_HERE,
202 base::Bind(&AppendToVectorIdleTestTask, run_order, task)); 206 base::Bind(&AppendToVectorIdleTestTask, run_order, task));
203 break; 207 break;
208 case 'S':
209 shutdown_task_runner_->PostTask(
210 FROM_HERE, base::Bind(&AppendToVectorTestTask, run_order, task));
211 break;
212 case 'T':
213 control_task_runner_->PostTask(
214 FROM_HERE, base::Bind(&AppendToVectorTestTask, run_order, task));
215 break;
204 default: 216 default:
205 NOTREACHED(); 217 NOTREACHED();
206 } 218 }
207 } 219 }
208 } 220 }
209 221
210 protected: 222 protected:
211 static base::TimeDelta maximum_idle_period_duration() { 223 static base::TimeDelta maximum_idle_period_duration() {
212 return base::TimeDelta::FromMilliseconds( 224 return base::TimeDelta::FromMilliseconds(
213 SchedulerHelper::kMaximumIdlePeriodMillis); 225 SchedulerHelper::kMaximumIdlePeriodMillis);
214 } 226 }
215 227
216 base::TimeTicks CurrentIdleTaskDeadlineForTesting() { 228 base::TimeTicks CurrentIdleTaskDeadlineForTesting() {
217 base::TimeTicks deadline; 229 base::TimeTicks deadline;
218 scheduler_helper_->CurrentIdleTaskDeadlineCallback(&deadline); 230 scheduler_helper_->CurrentIdleTaskDeadlineCallback(&deadline);
219 return deadline; 231 return deadline;
220 } 232 }
221 233
222 scoped_refptr<cc::TestNowSource> clock_; 234 scoped_refptr<cc::TestNowSource> clock_;
223 // Only one of mock_task_runner_ or message_loop_ will be set. 235 // Only one of mock_task_runner_ or message_loop_ will be set.
224 scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_; 236 scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_;
225 scoped_ptr<base::MessageLoop> message_loop_; 237 scoped_ptr<base::MessageLoop> message_loop_;
226 238
227 scoped_refptr<NestableSingleThreadTaskRunner> nestable_task_runner_; 239 scoped_refptr<NestableSingleThreadTaskRunner> nestable_task_runner_;
228 scoped_ptr<SchedulerHelperForTest> scheduler_helper_; 240 scoped_ptr<SchedulerHelperForTest> scheduler_helper_;
229 scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_; 241 scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_;
230 scoped_refptr<SingleThreadIdleTaskRunner> idle_task_runner_; 242 scoped_refptr<SingleThreadIdleTaskRunner> idle_task_runner_;
243 scoped_refptr<base::SingleThreadTaskRunner> control_task_runner_;
244 scoped_refptr<base::SingleThreadTaskRunner> shutdown_task_runner_;
231 245
232 DISALLOW_COPY_AND_ASSIGN(BaseSchedulerHelperTest); 246 DISALLOW_COPY_AND_ASSIGN(BaseSchedulerHelperTest);
233 }; 247 };
234 248
235 class SchedulerHelperTest : public BaseSchedulerHelperTest { 249 class SchedulerHelperTest : public BaseSchedulerHelperTest {
236 public: 250 public:
237 SchedulerHelperTest() : BaseSchedulerHelperTest(nullptr, base::TimeDelta()) {} 251 SchedulerHelperTest() : BaseSchedulerHelperTest(nullptr, base::TimeDelta()) {}
238 252
239 ~SchedulerHelperTest() override {} 253 ~SchedulerHelperTest() override {}
240 254
(...skipping 664 matching lines...) Expand 10 before | Expand all | Expand 10 after
905 base::TimeTicks expected_deadline = 919 base::TimeTicks expected_deadline =
906 clock_->Now() + 920 clock_->Now() +
907 base::TimeDelta::FromMilliseconds(kQuiescenceDelayMs + kLongIdlePeriodMs); 921 base::TimeDelta::FromMilliseconds(kQuiescenceDelayMs + kLongIdlePeriodMs);
908 default_task_runner_->PostTask(FROM_HERE, base::Bind(NullTask)); 922 default_task_runner_->PostTask(FROM_HERE, base::Bind(NullTask));
909 RunUntilIdle(); 923 RunUntilIdle();
910 924
911 EXPECT_EQ(1, run_count); 925 EXPECT_EQ(1, run_count);
912 EXPECT_EQ(expected_deadline, deadline_in_task); 926 EXPECT_EQ(expected_deadline, deadline_in_task);
913 } 927 }
914 928
929 TEST_F(SchedulerHelperTest, TestPreShutdown_BlocksAllButShutdownTasks) {
930 std::vector<std::string> run_order;
931 PostTestTasks(&run_order, "D1 I1 T1 S1");
932
933 scheduler_helper_->PreShutdown();
934
935 RunUntilIdle();
936 EXPECT_THAT(run_order, testing::ElementsAre(std::string("S1")));
937 }
938
939 TEST_F(SchedulerHelperTest, TestPreShutdown_BlocksFutureLongIdleTasks) {
940 int run_count = 0;
941
942 EXPECT_CALL(*scheduler_helper_, CanEnterLongIdlePeriod(_, _))
943 .Times(1)
944 .WillRepeatedly(Return(true));
945
946 max_idle_task_reposts = 3;
947 idle_task_runner_->PostIdleTask(
948 FROM_HERE,
949 base::Bind(&RepostingIdleTestTask, idle_task_runner_, &run_count));
950
951 scheduler_helper_->EnableLongIdlePeriod();
952 RunUntilIdle();
953 EXPECT_EQ(1, run_count); // Should only run once per idle period.
954
955 // Advance time to start of next long idle period and check task reposted task
956 // does not get run (it should be blocked by PreShutdown).
957 scheduler_helper_->PreShutdown();
958 clock_->AdvanceNow(maximum_idle_period_duration());
959 RunUntilIdle();
960 EXPECT_EQ(1, run_count);
961
962 // Must destroy all tasks posted to scheduler_helper_ before run_count goes
963 // out of scope.
964 scheduler_helper_.reset();
965 }
966
915 } // namespace scheduler 967 } // namespace scheduler
OLDNEW
« no previous file with comments | « components/scheduler/child/scheduler_helper.cc ('k') | components/scheduler/child/web_scheduler_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698