OLD | NEW |
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 "components/scheduler/renderer/web_view_scheduler_impl.h" | 5 #include "components/scheduler/renderer/web_view_scheduler_impl.h" |
6 | 6 |
7 #include "base/callback.h" | 7 #include "base/callback.h" |
8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
9 #include "base/test/simple_test_tick_clock.h" | 9 #include "base/test/simple_test_tick_clock.h" |
10 #include "cc/test/ordered_simple_task_runner.h" | 10 #include "cc/test/ordered_simple_task_runner.h" |
11 #include "components/scheduler/base/test_time_source.h" | 11 #include "components/scheduler/base/test_time_source.h" |
12 #include "components/scheduler/child/scheduler_tqm_delegate_for_test.h" | 12 #include "components/scheduler/child/scheduler_tqm_delegate_for_test.h" |
13 #include "components/scheduler/renderer/renderer_scheduler_impl.h" | 13 #include "components/scheduler/renderer/renderer_scheduler_impl.h" |
14 #include "components/scheduler/renderer/web_frame_scheduler_impl.h" | 14 #include "components/scheduler/renderer/web_frame_scheduler_impl.h" |
| 15 #include "testing/gmock/include/gmock/gmock.h" |
15 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
16 #include "third_party/WebKit/public/platform/WebTaskRunner.h" | 17 #include "third_party/WebKit/public/platform/WebTaskRunner.h" |
17 #include "third_party/WebKit/public/platform/WebTraceLocation.h" | 18 #include "third_party/WebKit/public/platform/WebTraceLocation.h" |
18 | 19 |
| 20 using testing::ElementsAre; |
| 21 |
19 namespace scheduler { | 22 namespace scheduler { |
20 | 23 |
21 class WebViewSchedulerImplTest : public testing::Test { | 24 class WebViewSchedulerImplTest : public testing::Test { |
22 public: | 25 public: |
23 WebViewSchedulerImplTest() {} | 26 WebViewSchedulerImplTest() {} |
24 ~WebViewSchedulerImplTest() override {} | 27 ~WebViewSchedulerImplTest() override {} |
25 | 28 |
26 void SetUp() override { | 29 void SetUp() override { |
27 clock_.reset(new base::SimpleTestTickClock()); | 30 clock_.reset(new base::SimpleTestTickClock()); |
28 clock_->Advance(base::TimeDelta::FromMicroseconds(5000)); | 31 clock_->Advance(base::TimeDelta::FromMicroseconds(5000)); |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
145 web_frame_scheduler2->timerTaskRunner()->postDelayedTask( | 148 web_frame_scheduler2->timerTaskRunner()->postDelayedTask( |
146 BLINK_FROM_HERE, | 149 BLINK_FROM_HERE, |
147 new RepeatingTask(web_frame_scheduler2->timerTaskRunner(), &run_count2), | 150 new RepeatingTask(web_frame_scheduler2->timerTaskRunner(), &run_count2), |
148 1.0); | 151 1.0); |
149 | 152 |
150 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); | 153 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); |
151 EXPECT_EQ(1000, run_count1); | 154 EXPECT_EQ(1000, run_count1); |
152 EXPECT_EQ(1, run_count2); | 155 EXPECT_EQ(1, run_count2); |
153 } | 156 } |
154 | 157 |
| 158 namespace { |
| 159 class VirtualTimeRecorderTask : public blink::WebTaskRunner::Task { |
| 160 public: |
| 161 VirtualTimeRecorderTask(RendererSchedulerImpl* scheduler, |
| 162 std::vector<base::TimeTicks>* out_real_times, |
| 163 std::vector<size_t>* out_virtual_times_ms) |
| 164 : scheduler_(scheduler), |
| 165 out_real_times_(out_real_times), |
| 166 out_virtual_times_ms_(out_virtual_times_ms) {} |
| 167 |
| 168 ~VirtualTimeRecorderTask() override {} |
| 169 |
| 170 void run() override { |
| 171 out_real_times_->push_back(scheduler_->tick_clock()->NowTicks()); |
| 172 out_virtual_times_ms_->push_back( |
| 173 scheduler_->MonotonicallyIncreasingVirtualTimeSeconds() * 1000.0); |
| 174 } |
| 175 |
| 176 private: |
| 177 RendererSchedulerImpl* scheduler_; // NOT OWNED |
| 178 std::vector<base::TimeTicks>* out_real_times_; // NOT OWNED |
| 179 std::vector<size_t>* out_virtual_times_ms_; // NOT OWNED |
| 180 }; |
| 181 } |
| 182 |
| 183 TEST_F(WebViewSchedulerImplTest, VirtualTime_TimerFastForwarding) { |
| 184 std::vector<base::TimeTicks> real_times; |
| 185 std::vector<size_t> virtual_times_ms; |
| 186 base::TimeTicks initial_real_time = scheduler_->tick_clock()->NowTicks(); |
| 187 size_t initial_virtual_time_ms = |
| 188 scheduler_->MonotonicallyIncreasingVirtualTimeSeconds() * 1000.0; |
| 189 |
| 190 web_view_scheduler_->enableVirtualTime(); |
| 191 |
| 192 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( |
| 193 BLINK_FROM_HERE, |
| 194 new VirtualTimeRecorderTask(scheduler_.get(), &real_times, |
| 195 &virtual_times_ms), |
| 196 2.0); |
| 197 |
| 198 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( |
| 199 BLINK_FROM_HERE, |
| 200 new VirtualTimeRecorderTask(scheduler_.get(), &real_times, |
| 201 &virtual_times_ms), |
| 202 20.0); |
| 203 |
| 204 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( |
| 205 BLINK_FROM_HERE, |
| 206 new VirtualTimeRecorderTask(scheduler_.get(), &real_times, |
| 207 &virtual_times_ms), |
| 208 200.0); |
| 209 |
| 210 mock_task_runner_->RunUntilIdle(); |
| 211 |
| 212 EXPECT_THAT(real_times, ElementsAre(initial_real_time, |
| 213 initial_real_time, initial_real_time)); |
| 214 EXPECT_THAT(virtual_times_ms, |
| 215 ElementsAre(initial_virtual_time_ms + 2, |
| 216 initial_virtual_time_ms + 20, |
| 217 initial_virtual_time_ms + 200)); |
| 218 } |
| 219 |
| 220 TEST_F(WebViewSchedulerImplTest, VirtualTime_LoadingTaskFastForwarding) { |
| 221 std::vector<base::TimeTicks> real_times; |
| 222 std::vector<size_t> virtual_times_ms; |
| 223 base::TimeTicks initial_real_time = scheduler_->tick_clock()->NowTicks(); |
| 224 size_t initial_virtual_time_ms = |
| 225 scheduler_->MonotonicallyIncreasingVirtualTimeSeconds() * 1000.0; |
| 226 |
| 227 web_view_scheduler_->enableVirtualTime(); |
| 228 |
| 229 web_frame_scheduler_->loadingTaskRunner()->postDelayedTask( |
| 230 BLINK_FROM_HERE, |
| 231 new VirtualTimeRecorderTask(scheduler_.get(), &real_times, |
| 232 &virtual_times_ms), |
| 233 2.0); |
| 234 |
| 235 web_frame_scheduler_->loadingTaskRunner()->postDelayedTask( |
| 236 BLINK_FROM_HERE, |
| 237 new VirtualTimeRecorderTask(scheduler_.get(), &real_times, |
| 238 &virtual_times_ms), |
| 239 20.0); |
| 240 |
| 241 web_frame_scheduler_->loadingTaskRunner()->postDelayedTask( |
| 242 BLINK_FROM_HERE, |
| 243 new VirtualTimeRecorderTask(scheduler_.get(), &real_times, |
| 244 &virtual_times_ms), |
| 245 200.0); |
| 246 |
| 247 mock_task_runner_->RunUntilIdle(); |
| 248 |
| 249 EXPECT_THAT(real_times, ElementsAre(initial_real_time, |
| 250 initial_real_time, initial_real_time)); |
| 251 EXPECT_THAT(virtual_times_ms, |
| 252 ElementsAre(initial_virtual_time_ms + 2, |
| 253 initial_virtual_time_ms + 20, |
| 254 initial_virtual_time_ms + 200)); |
| 255 } |
| 256 |
| 257 TEST_F(WebViewSchedulerImplTest, |
| 258 RepeatingTimer_PageInBackground_MeansNothingForFirtualTime) { |
| 259 web_view_scheduler_->enableVirtualTime(); |
| 260 web_view_scheduler_->setPageVisible(false); |
| 261 base::TimeTicks initial_real_time = scheduler_->tick_clock()->NowTicks(); |
| 262 |
| 263 int run_count = 0; |
| 264 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( |
| 265 BLINK_FROM_HERE, |
| 266 new RepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count), |
| 267 1.0); |
| 268 |
| 269 mock_task_runner_->RunTasksWhile(mock_task_runner_->TaskRunCountBelow(2000)); |
| 270 EXPECT_EQ(1999, run_count); |
| 271 |
| 272 // The global tick clock has not moved, yet we ran a large number of "delayed" |
| 273 // tasks despite calling setPageVisible(false). |
| 274 EXPECT_EQ(initial_real_time, scheduler_->tick_clock()->NowTicks()); |
| 275 } |
| 276 |
| 277 namespace { |
| 278 class RunOrderTask : public blink::WebTaskRunner::Task { |
| 279 public: |
| 280 RunOrderTask(int index, std::vector<int>* out_run_order) |
| 281 : index_(index), |
| 282 out_run_order_(out_run_order) {} |
| 283 |
| 284 ~RunOrderTask() override {} |
| 285 |
| 286 void run() override { |
| 287 out_run_order_->push_back(index_); |
| 288 } |
| 289 |
| 290 private: |
| 291 int index_; |
| 292 std::vector<int>* out_run_order_; // NOT OWNED |
| 293 }; |
| 294 |
| 295 class DelayedRunOrderTask : public blink::WebTaskRunner::Task { |
| 296 public: |
| 297 DelayedRunOrderTask(int index, blink::WebTaskRunner* task_runner, |
| 298 std::vector<int>* out_run_order) |
| 299 : index_(index), |
| 300 task_runner_(task_runner), |
| 301 out_run_order_(out_run_order) {} |
| 302 |
| 303 ~DelayedRunOrderTask() override {} |
| 304 |
| 305 void run() override { |
| 306 out_run_order_->push_back(index_); |
| 307 task_runner_->postTask( |
| 308 BLINK_FROM_HERE, new RunOrderTask(index_ + 1, out_run_order_)); |
| 309 } |
| 310 |
| 311 private: |
| 312 int index_; |
| 313 blink::WebTaskRunner* task_runner_; // NOT OWNED |
| 314 std::vector<int>* out_run_order_; // NOT OWNED |
| 315 }; |
| 316 } |
| 317 |
| 318 TEST_F(WebViewSchedulerImplTest, VirtualTime_DelayedAndImmediateTaskOrdering) { |
| 319 std::vector<int> run_order; |
| 320 |
| 321 web_view_scheduler_->setAllowVirtualTimeToAdvance(false); |
| 322 web_view_scheduler_->enableVirtualTime(); |
| 323 |
| 324 web_frame_scheduler_->timerTaskRunner()->postTask( |
| 325 BLINK_FROM_HERE, new RunOrderTask(0, &run_order)); |
| 326 |
| 327 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( |
| 328 BLINK_FROM_HERE, |
| 329 new DelayedRunOrderTask(1, web_frame_scheduler_->timerTaskRunner(), |
| 330 &run_order), |
| 331 2.0); |
| 332 |
| 333 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( |
| 334 BLINK_FROM_HERE, |
| 335 new DelayedRunOrderTask(3, web_frame_scheduler_->timerTaskRunner(), |
| 336 &run_order), |
| 337 4.0); |
| 338 |
| 339 mock_task_runner_->RunUntilIdle(); |
| 340 EXPECT_TRUE(run_order.empty()); |
| 341 |
| 342 web_view_scheduler_->setAllowVirtualTimeToAdvance(true); |
| 343 mock_task_runner_->RunUntilIdle(); |
| 344 |
| 345 EXPECT_THAT(run_order, ElementsAre(0, 1, 2, 3, 4)); |
| 346 } |
| 347 |
155 class WebViewSchedulerImplTestWithDisabledBackgroundTimerThrottling | 348 class WebViewSchedulerImplTestWithDisabledBackgroundTimerThrottling |
156 : public WebViewSchedulerImplTest { | 349 : public WebViewSchedulerImplTest { |
157 public: | 350 public: |
158 WebViewSchedulerImplTestWithDisabledBackgroundTimerThrottling() {} | 351 WebViewSchedulerImplTestWithDisabledBackgroundTimerThrottling() {} |
159 ~WebViewSchedulerImplTestWithDisabledBackgroundTimerThrottling() override {} | 352 ~WebViewSchedulerImplTestWithDisabledBackgroundTimerThrottling() override {} |
160 | 353 |
161 bool DisableBackgroundTimerThrottling() const override { return true; } | 354 bool DisableBackgroundTimerThrottling() const override { return true; } |
162 }; | 355 }; |
163 | 356 |
164 TEST_F(WebViewSchedulerImplTestWithDisabledBackgroundTimerThrottling, | 357 TEST_F(WebViewSchedulerImplTestWithDisabledBackgroundTimerThrottling, |
165 RepeatingTimer_PageInBackground) { | 358 RepeatingTimer_PageInBackground) { |
166 web_view_scheduler_->setPageVisible(false); | 359 web_view_scheduler_->setPageVisible(false); |
167 | 360 |
168 int run_count = 0; | 361 int run_count = 0; |
169 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( | 362 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( |
170 BLINK_FROM_HERE, | 363 BLINK_FROM_HERE, |
171 new RepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count), | 364 new RepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count), |
172 1.0); | 365 1.0); |
173 | 366 |
174 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); | 367 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); |
175 EXPECT_EQ(1000, run_count); | 368 EXPECT_EQ(1000, run_count); |
176 } | 369 } |
177 | 370 |
| 371 TEST_F(WebViewSchedulerImplTest, VirtualTimeSettings_NewWebFrameScheduler) { |
| 372 std::vector<int> run_order; |
| 373 |
| 374 web_view_scheduler_->setAllowVirtualTimeToAdvance(false); |
| 375 web_view_scheduler_->enableVirtualTime(); |
| 376 |
| 377 scoped_ptr<WebFrameSchedulerImpl> web_frame_scheduler = |
| 378 web_view_scheduler_->createWebFrameSchedulerImpl(); |
| 379 |
| 380 web_frame_scheduler->timerTaskRunner()->postTask( |
| 381 BLINK_FROM_HERE, new RunOrderTask(1, &run_order)); |
| 382 |
| 383 mock_task_runner_->RunUntilIdle(); |
| 384 EXPECT_TRUE(run_order.empty()); |
| 385 |
| 386 web_view_scheduler_->setAllowVirtualTimeToAdvance(true); |
| 387 mock_task_runner_->RunUntilIdle(); |
| 388 |
| 389 EXPECT_THAT(run_order, ElementsAre(1)); |
| 390 } |
| 391 |
178 } // namespace scheduler | 392 } // namespace scheduler |
OLD | NEW |