OLD | NEW |
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 "content/child/scheduler/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 "content/child/scheduler/nestable_task_runner_for_test.h" | 10 #include "components/scheduler/child/nestable_task_runner_for_test.h" |
11 #include "content/child/scheduler/scheduler_message_loop_delegate.h" | 11 #include "components/scheduler/child/scheduler_message_loop_delegate.h" |
12 #include "content/child/scheduler/task_queue_manager.h" | 12 #include "components/scheduler/child/task_queue_manager.h" |
13 #include "content/test/test_time_source.h" | 13 #include "components/scheduler/child/test_time_source.h" |
14 #include "testing/gmock/include/gmock/gmock.h" | 14 #include "testing/gmock/include/gmock/gmock.h" |
15 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
16 | 16 |
17 using testing::_; | 17 using testing::_; |
18 using testing::AnyNumber; | 18 using testing::AnyNumber; |
19 using testing::Invoke; | 19 using testing::Invoke; |
20 using testing::Return; | 20 using testing::Return; |
21 | 21 |
22 namespace content { | 22 namespace scheduler { |
23 | 23 |
24 namespace { | 24 namespace { |
25 void AppendToVectorTestTask(std::vector<std::string>* vector, | 25 void AppendToVectorTestTask(std::vector<std::string>* vector, |
26 std::string value) { | 26 std::string value) { |
27 vector->push_back(value); | 27 vector->push_back(value); |
28 } | 28 } |
29 | 29 |
30 void AppendToVectorIdleTestTask(std::vector<std::string>* vector, | 30 void AppendToVectorIdleTestTask(std::vector<std::string>* vector, |
31 std::string value, | 31 std::string value, |
32 base::TimeTicks deadline) { | 32 base::TimeTicks deadline) { |
33 AppendToVectorTestTask(vector, value); | 33 AppendToVectorTestTask(vector, value); |
34 } | 34 } |
35 | 35 |
36 void NullTask() { | 36 void NullTask() { |
37 } | 37 } |
38 | 38 |
39 void AppendToVectorReentrantTask( | 39 void AppendToVectorReentrantTask(base::SingleThreadTaskRunner* task_runner, |
40 base::SingleThreadTaskRunner* task_runner, | 40 std::vector<int>* vector, |
41 std::vector<int>* vector, | 41 int* reentrant_count, |
42 int* reentrant_count, | 42 int max_reentrant_count) { |
43 int max_reentrant_count) { | |
44 vector->push_back((*reentrant_count)++); | 43 vector->push_back((*reentrant_count)++); |
45 if (*reentrant_count < max_reentrant_count) { | 44 if (*reentrant_count < max_reentrant_count) { |
46 task_runner->PostTask( | 45 task_runner->PostTask( |
47 FROM_HERE, base::Bind(AppendToVectorReentrantTask, | 46 FROM_HERE, |
48 base::Unretained(task_runner), vector, | 47 base::Bind(AppendToVectorReentrantTask, base::Unretained(task_runner), |
49 reentrant_count, max_reentrant_count)); | 48 vector, reentrant_count, max_reentrant_count)); |
50 } | 49 } |
51 } | 50 } |
52 | 51 |
53 void NullIdleTask(base::TimeTicks) { | 52 void NullIdleTask(base::TimeTicks) { |
54 } | 53 } |
55 | 54 |
56 void IdleTestTask(int* run_count, | 55 void IdleTestTask(int* run_count, |
57 base::TimeTicks* deadline_out, | 56 base::TimeTicks* deadline_out, |
58 base::TimeTicks deadline) { | 57 base::TimeTicks deadline) { |
59 (*run_count)++; | 58 (*run_count)++; |
60 *deadline_out = deadline; | 59 *deadline_out = deadline; |
61 } | 60 } |
62 | 61 |
63 int max_idle_task_reposts = 2; | 62 int max_idle_task_reposts = 2; |
64 | 63 |
65 void RepostingIdleTestTask( | 64 void RepostingIdleTestTask(SingleThreadIdleTaskRunner* idle_task_runner, |
66 SingleThreadIdleTaskRunner* idle_task_runner, | 65 int* run_count, |
67 int* run_count, | 66 base::TimeTicks deadline) { |
68 base::TimeTicks deadline) { | |
69 if ((*run_count + 1) < max_idle_task_reposts) { | 67 if ((*run_count + 1) < max_idle_task_reposts) { |
70 idle_task_runner->PostIdleTask( | 68 idle_task_runner->PostIdleTask( |
71 FROM_HERE, | 69 FROM_HERE, base::Bind(&RepostingIdleTestTask, |
72 base::Bind(&RepostingIdleTestTask, | 70 base::Unretained(idle_task_runner), run_count)); |
73 base::Unretained(idle_task_runner), run_count)); | |
74 } | 71 } |
75 (*run_count)++; | 72 (*run_count)++; |
76 } | 73 } |
77 | 74 |
78 void UpdateClockToDeadlineIdleTestTask( | 75 void UpdateClockToDeadlineIdleTestTask( |
79 scoped_refptr<cc::TestNowSource> clock, | 76 scoped_refptr<cc::TestNowSource> clock, |
80 base::SingleThreadTaskRunner* task_runner, | 77 base::SingleThreadTaskRunner* task_runner, |
81 int* run_count, | 78 int* run_count, |
82 base::TimeTicks deadline) { | 79 base::TimeTicks deadline) { |
83 clock->SetNow(deadline); | 80 clock->SetNow(deadline); |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
277 base::TimeTicks deadline_in_task; | 274 base::TimeTicks deadline_in_task; |
278 | 275 |
279 clock_->AdvanceNow(base::TimeDelta::FromMilliseconds(100)); | 276 clock_->AdvanceNow(base::TimeDelta::FromMilliseconds(100)); |
280 idle_task_runner_->PostIdleTask( | 277 idle_task_runner_->PostIdleTask( |
281 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); | 278 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); |
282 | 279 |
283 RunUntilIdle(); | 280 RunUntilIdle(); |
284 EXPECT_EQ(0, run_count); | 281 EXPECT_EQ(0, run_count); |
285 | 282 |
286 scheduler_helper_->StartIdlePeriod( | 283 scheduler_helper_->StartIdlePeriod( |
287 SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, | 284 SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), |
288 clock_->Now(), | 285 expected_deadline, true); |
289 expected_deadline, | |
290 true); | |
291 RunUntilIdle(); | 286 RunUntilIdle(); |
292 EXPECT_EQ(1, run_count); | 287 EXPECT_EQ(1, run_count); |
293 EXPECT_EQ(expected_deadline, deadline_in_task); | 288 EXPECT_EQ(expected_deadline, deadline_in_task); |
294 } | 289 } |
295 | 290 |
296 TEST_F(SchedulerHelperTest, TestPostIdleTask_EndIdlePeriod) { | 291 TEST_F(SchedulerHelperTest, TestPostIdleTask_EndIdlePeriod) { |
297 int run_count = 0; | 292 int run_count = 0; |
298 base::TimeTicks deadline_in_task; | 293 base::TimeTicks deadline_in_task; |
299 | 294 |
300 clock_->AdvanceNow(base::TimeDelta::FromMilliseconds(100)); | 295 clock_->AdvanceNow(base::TimeDelta::FromMilliseconds(100)); |
301 idle_task_runner_->PostIdleTask( | 296 idle_task_runner_->PostIdleTask( |
302 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); | 297 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); |
303 | 298 |
304 RunUntilIdle(); | 299 RunUntilIdle(); |
305 EXPECT_EQ(0, run_count); | 300 EXPECT_EQ(0, run_count); |
306 | 301 |
307 scheduler_helper_->StartIdlePeriod( | 302 scheduler_helper_->StartIdlePeriod( |
308 SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, | 303 SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), |
309 clock_->Now(), | 304 clock_->Now() + base::TimeDelta::FromMilliseconds(10), true); |
310 clock_->Now() + base::TimeDelta::FromMilliseconds(10), | |
311 true); | |
312 scheduler_helper_->EndIdlePeriod(); | 305 scheduler_helper_->EndIdlePeriod(); |
313 RunUntilIdle(); | 306 RunUntilIdle(); |
314 EXPECT_EQ(0, run_count); | 307 EXPECT_EQ(0, run_count); |
315 } | 308 } |
316 | 309 |
317 TEST_F(SchedulerHelperTest, TestRepostingIdleTask) { | 310 TEST_F(SchedulerHelperTest, TestRepostingIdleTask) { |
318 int run_count = 0; | 311 int run_count = 0; |
319 | 312 |
320 max_idle_task_reposts = 2; | 313 max_idle_task_reposts = 2; |
321 idle_task_runner_->PostIdleTask( | 314 idle_task_runner_->PostIdleTask( |
322 FROM_HERE, | 315 FROM_HERE, |
323 base::Bind(&RepostingIdleTestTask, idle_task_runner_, &run_count)); | 316 base::Bind(&RepostingIdleTestTask, idle_task_runner_, &run_count)); |
324 scheduler_helper_->StartIdlePeriod( | 317 scheduler_helper_->StartIdlePeriod( |
325 SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, | 318 SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), |
326 clock_->Now(), | 319 clock_->Now() + base::TimeDelta::FromMilliseconds(10), true); |
327 clock_->Now() + base::TimeDelta::FromMilliseconds(10), | |
328 true); | |
329 RunUntilIdle(); | 320 RunUntilIdle(); |
330 EXPECT_EQ(1, run_count); | 321 EXPECT_EQ(1, run_count); |
331 | 322 |
332 // Reposted tasks shouldn't run until next idle period. | 323 // Reposted tasks shouldn't run until next idle period. |
333 RunUntilIdle(); | 324 RunUntilIdle(); |
334 EXPECT_EQ(1, run_count); | 325 EXPECT_EQ(1, run_count); |
335 | 326 |
336 scheduler_helper_->StartIdlePeriod( | 327 scheduler_helper_->StartIdlePeriod( |
337 SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, | 328 SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), |
338 clock_->Now(), | 329 clock_->Now() + base::TimeDelta::FromMilliseconds(10), true); |
339 clock_->Now() + base::TimeDelta::FromMilliseconds(10), | |
340 true); | |
341 RunUntilIdle(); | 330 RunUntilIdle(); |
342 EXPECT_EQ(2, run_count); | 331 EXPECT_EQ(2, run_count); |
343 } | 332 } |
344 | 333 |
345 TEST_F(SchedulerHelperTest, TestIdleTaskExceedsDeadline) { | 334 TEST_F(SchedulerHelperTest, TestIdleTaskExceedsDeadline) { |
346 int run_count = 0; | 335 int run_count = 0; |
347 | 336 |
348 // Post two UpdateClockToDeadlineIdleTestTask tasks. | 337 // Post two UpdateClockToDeadlineIdleTestTask tasks. |
349 idle_task_runner_->PostIdleTask( | 338 idle_task_runner_->PostIdleTask( |
350 FROM_HERE, base::Bind(&UpdateClockToDeadlineIdleTestTask, clock_, | 339 FROM_HERE, base::Bind(&UpdateClockToDeadlineIdleTestTask, clock_, |
351 default_task_runner_, &run_count)); | 340 default_task_runner_, &run_count)); |
352 idle_task_runner_->PostIdleTask( | 341 idle_task_runner_->PostIdleTask( |
353 FROM_HERE, base::Bind(&UpdateClockToDeadlineIdleTestTask, clock_, | 342 FROM_HERE, base::Bind(&UpdateClockToDeadlineIdleTestTask, clock_, |
354 default_task_runner_, &run_count)); | 343 default_task_runner_, &run_count)); |
355 | 344 |
356 scheduler_helper_->StartIdlePeriod( | 345 scheduler_helper_->StartIdlePeriod( |
357 SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, | 346 SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), |
358 clock_->Now(), | 347 clock_->Now() + base::TimeDelta::FromMilliseconds(10), true); |
359 clock_->Now() + base::TimeDelta::FromMilliseconds(10), | |
360 true); | |
361 RunUntilIdle(); | 348 RunUntilIdle(); |
362 // Only the first idle task should execute since it's used up the deadline. | 349 // Only the first idle task should execute since it's used up the deadline. |
363 EXPECT_EQ(1, run_count); | 350 EXPECT_EQ(1, run_count); |
364 | 351 |
365 scheduler_helper_->EndIdlePeriod(); | 352 scheduler_helper_->EndIdlePeriod(); |
366 scheduler_helper_->StartIdlePeriod( | 353 scheduler_helper_->StartIdlePeriod( |
367 SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, | 354 SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), |
368 clock_->Now(), | 355 clock_->Now() + base::TimeDelta::FromMilliseconds(10), true); |
369 clock_->Now() + base::TimeDelta::FromMilliseconds(10), | |
370 true); | |
371 RunUntilIdle(); | 356 RunUntilIdle(); |
372 // Second task should be run on the next idle period. | 357 // Second task should be run on the next idle period. |
373 EXPECT_EQ(2, run_count); | 358 EXPECT_EQ(2, run_count); |
374 } | 359 } |
375 | 360 |
376 TEST_F(SchedulerHelperTest, TestPostIdleTaskAfterWakeup) { | 361 TEST_F(SchedulerHelperTest, TestPostIdleTaskAfterWakeup) { |
377 base::TimeTicks deadline_in_task; | 362 base::TimeTicks deadline_in_task; |
378 int run_count = 0; | 363 int run_count = 0; |
379 | 364 |
380 idle_task_runner_->PostIdleTaskAfterWakeup( | 365 idle_task_runner_->PostIdleTaskAfterWakeup( |
381 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); | 366 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); |
382 | 367 |
383 scheduler_helper_->StartIdlePeriod( | 368 scheduler_helper_->StartIdlePeriod( |
384 SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, | 369 SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), |
385 clock_->Now(), | 370 clock_->Now() + base::TimeDelta::FromMilliseconds(10), true); |
386 clock_->Now() + base::TimeDelta::FromMilliseconds(10), | |
387 true); | |
388 RunUntilIdle(); | 371 RunUntilIdle(); |
389 // Shouldn't run yet as no other task woke up the scheduler. | 372 // Shouldn't run yet as no other task woke up the scheduler. |
390 EXPECT_EQ(0, run_count); | 373 EXPECT_EQ(0, run_count); |
391 | 374 |
392 idle_task_runner_->PostIdleTaskAfterWakeup( | 375 idle_task_runner_->PostIdleTaskAfterWakeup( |
393 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); | 376 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); |
394 | 377 |
395 scheduler_helper_->StartIdlePeriod( | 378 scheduler_helper_->StartIdlePeriod( |
396 SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, | 379 SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), |
397 clock_->Now(), | 380 clock_->Now() + base::TimeDelta::FromMilliseconds(10), true); |
398 clock_->Now() + base::TimeDelta::FromMilliseconds(10), | |
399 true); | |
400 RunUntilIdle(); | 381 RunUntilIdle(); |
401 // Another after wakeup idle task shouldn't wake the scheduler. | 382 // Another after wakeup idle task shouldn't wake the scheduler. |
402 EXPECT_EQ(0, run_count); | 383 EXPECT_EQ(0, run_count); |
403 | 384 |
404 default_task_runner_->PostTask(FROM_HERE, base::Bind(&NullTask)); | 385 default_task_runner_->PostTask(FROM_HERE, base::Bind(&NullTask)); |
405 | 386 |
406 RunUntilIdle(); | 387 RunUntilIdle(); |
407 // Must start a new idle period before idle task runs. | 388 // Must start a new idle period before idle task runs. |
408 scheduler_helper_->StartIdlePeriod( | 389 scheduler_helper_->StartIdlePeriod( |
409 SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, | 390 SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), |
410 clock_->Now(), | 391 clock_->Now() + base::TimeDelta::FromMilliseconds(10), true); |
411 clock_->Now() + base::TimeDelta::FromMilliseconds(10), | |
412 true); | |
413 RunUntilIdle(); | 392 RunUntilIdle(); |
414 // Execution of default task queue task should trigger execution of idle task. | 393 // Execution of default task queue task should trigger execution of idle task. |
415 EXPECT_EQ(2, run_count); | 394 EXPECT_EQ(2, run_count); |
416 } | 395 } |
417 | 396 |
418 TEST_F(SchedulerHelperTest, TestPostIdleTaskAfterWakeupWhileAwake) { | 397 TEST_F(SchedulerHelperTest, TestPostIdleTaskAfterWakeupWhileAwake) { |
419 base::TimeTicks deadline_in_task; | 398 base::TimeTicks deadline_in_task; |
420 int run_count = 0; | 399 int run_count = 0; |
421 | 400 |
422 idle_task_runner_->PostIdleTaskAfterWakeup( | 401 idle_task_runner_->PostIdleTaskAfterWakeup( |
423 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); | 402 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); |
424 default_task_runner_->PostTask(FROM_HERE, base::Bind(&NullTask)); | 403 default_task_runner_->PostTask(FROM_HERE, base::Bind(&NullTask)); |
425 | 404 |
426 RunUntilIdle(); | 405 RunUntilIdle(); |
427 // Must start a new idle period before idle task runs. | 406 // Must start a new idle period before idle task runs. |
428 scheduler_helper_->StartIdlePeriod( | 407 scheduler_helper_->StartIdlePeriod( |
429 SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, | 408 SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), |
430 clock_->Now(), | 409 clock_->Now() + base::TimeDelta::FromMilliseconds(10), true); |
431 clock_->Now() + base::TimeDelta::FromMilliseconds(10), | |
432 true); | |
433 RunUntilIdle(); | 410 RunUntilIdle(); |
434 // Should run as the scheduler was already awakened by the normal task. | 411 // Should run as the scheduler was already awakened by the normal task. |
435 EXPECT_EQ(1, run_count); | 412 EXPECT_EQ(1, run_count); |
436 } | 413 } |
437 | 414 |
438 TEST_F(SchedulerHelperTest, TestPostIdleTaskWakesAfterWakeupIdleTask) { | 415 TEST_F(SchedulerHelperTest, TestPostIdleTaskWakesAfterWakeupIdleTask) { |
439 base::TimeTicks deadline_in_task; | 416 base::TimeTicks deadline_in_task; |
440 int run_count = 0; | 417 int run_count = 0; |
441 | 418 |
442 idle_task_runner_->PostIdleTaskAfterWakeup( | 419 idle_task_runner_->PostIdleTaskAfterWakeup( |
443 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); | 420 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); |
444 idle_task_runner_->PostIdleTask( | 421 idle_task_runner_->PostIdleTask( |
445 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); | 422 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); |
446 | 423 |
447 scheduler_helper_->StartIdlePeriod( | 424 scheduler_helper_->StartIdlePeriod( |
448 SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, | 425 SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), |
449 clock_->Now(), | 426 clock_->Now() + base::TimeDelta::FromMilliseconds(10), true); |
450 clock_->Now() + base::TimeDelta::FromMilliseconds(10), | |
451 true); | |
452 RunUntilIdle(); | 427 RunUntilIdle(); |
453 // Must start a new idle period before after-wakeup idle task runs. | 428 // Must start a new idle period before after-wakeup idle task runs. |
454 scheduler_helper_->StartIdlePeriod( | 429 scheduler_helper_->StartIdlePeriod( |
455 SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, | 430 SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), |
456 clock_->Now(), | 431 clock_->Now() + base::TimeDelta::FromMilliseconds(10), true); |
457 clock_->Now() + base::TimeDelta::FromMilliseconds(10), | |
458 true); | |
459 RunUntilIdle(); | 432 RunUntilIdle(); |
460 // Normal idle task should wake up after-wakeup idle task. | 433 // Normal idle task should wake up after-wakeup idle task. |
461 EXPECT_EQ(2, run_count); | 434 EXPECT_EQ(2, run_count); |
462 } | 435 } |
463 | 436 |
464 TEST_F(SchedulerHelperTest, TestDelayedEndIdlePeriod) { | 437 TEST_F(SchedulerHelperTest, TestDelayedEndIdlePeriod) { |
465 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 438 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
466 | 439 |
467 EXPECT_CALL(*scheduler_helper_, CanEnterLongIdlePeriod(_, _)) | 440 EXPECT_CALL(*scheduler_helper_, CanEnterLongIdlePeriod(_, _)) |
468 .Times(2) | 441 .Times(2) |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
520 std::pair<SingleThreadIdleTaskRunner::IdleTask, bool>>* tasks) { | 493 std::pair<SingleThreadIdleTaskRunner::IdleTask, bool>>* tasks) { |
521 base::MessageLoop::ScopedNestableTaskAllower allow(message_loop_.get()); | 494 base::MessageLoop::ScopedNestableTaskAllower allow(message_loop_.get()); |
522 for (std::pair<SingleThreadIdleTaskRunner::IdleTask, bool>& pair : *tasks) { | 495 for (std::pair<SingleThreadIdleTaskRunner::IdleTask, bool>& pair : *tasks) { |
523 if (pair.second) { | 496 if (pair.second) { |
524 idle_task_runner_->PostIdleTask(FROM_HERE, pair.first); | 497 idle_task_runner_->PostIdleTask(FROM_HERE, pair.first); |
525 } else { | 498 } else { |
526 idle_task_runner_->PostNonNestableIdleTask(FROM_HERE, pair.first); | 499 idle_task_runner_->PostNonNestableIdleTask(FROM_HERE, pair.first); |
527 } | 500 } |
528 } | 501 } |
529 scheduler_helper_->StartIdlePeriod( | 502 scheduler_helper_->StartIdlePeriod( |
530 SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, | 503 SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), |
531 clock_->Now(), | 504 clock_->Now() + base::TimeDelta::FromMilliseconds(10), true); |
532 clock_->Now() + base::TimeDelta::FromMilliseconds(10), | |
533 true); | |
534 message_loop_->RunUntilIdle(); | 505 message_loop_->RunUntilIdle(); |
535 } | 506 } |
536 | 507 |
537 private: | 508 private: |
538 DISALLOW_COPY_AND_ASSIGN(SchedulerHelperWithMessageLoopTest); | 509 DISALLOW_COPY_AND_ASSIGN(SchedulerHelperWithMessageLoopTest); |
539 }; | 510 }; |
540 | 511 |
541 TEST_F(SchedulerHelperWithMessageLoopTest, | 512 TEST_F(SchedulerHelperWithMessageLoopTest, |
542 NonNestableIdleTaskDoesntExecuteInNestedLoop) { | 513 NonNestableIdleTaskDoesntExecuteInNestedLoop) { |
543 std::vector<std::string> order; | 514 std::vector<std::string> order; |
(...skipping 14 matching lines...) Expand all Loading... |
558 tasks_to_post_from_nested_loop.push_back(std::make_pair( | 529 tasks_to_post_from_nested_loop.push_back(std::make_pair( |
559 base::Bind(&AppendToVectorIdleTestTask, &order, std::string("5")), true)); | 530 base::Bind(&AppendToVectorIdleTestTask, &order, std::string("5")), true)); |
560 | 531 |
561 default_task_runner_->PostTask( | 532 default_task_runner_->PostTask( |
562 FROM_HERE, | 533 FROM_HERE, |
563 base::Bind(&SchedulerHelperWithMessageLoopTest::PostFromNestedRunloop, | 534 base::Bind(&SchedulerHelperWithMessageLoopTest::PostFromNestedRunloop, |
564 base::Unretained(this), | 535 base::Unretained(this), |
565 base::Unretained(&tasks_to_post_from_nested_loop))); | 536 base::Unretained(&tasks_to_post_from_nested_loop))); |
566 | 537 |
567 scheduler_helper_->StartIdlePeriod( | 538 scheduler_helper_->StartIdlePeriod( |
568 SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, | 539 SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), |
569 clock_->Now(), | 540 clock_->Now() + base::TimeDelta::FromMilliseconds(10), true); |
570 clock_->Now() + base::TimeDelta::FromMilliseconds(10), | |
571 true); | |
572 RunUntilIdle(); | 541 RunUntilIdle(); |
573 // Note we expect task 3 to run last because it's non-nestable. | 542 // Note we expect task 3 to run last because it's non-nestable. |
574 EXPECT_THAT(order, testing::ElementsAre(std::string("1"), std::string("2"), | 543 EXPECT_THAT(order, testing::ElementsAre(std::string("1"), std::string("2"), |
575 std::string("4"), std::string("5"), | 544 std::string("4"), std::string("5"), |
576 std::string("3"))); | 545 std::string("3"))); |
577 } | 546 } |
578 | 547 |
579 TEST_F(SchedulerHelperTest, TestLongIdlePeriod) { | 548 TEST_F(SchedulerHelperTest, TestLongIdlePeriod) { |
580 base::TimeTicks expected_deadline = | 549 base::TimeTicks expected_deadline = |
581 clock_->Now() + maximum_idle_period_duration(); | 550 clock_->Now() + maximum_idle_period_duration(); |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
720 } | 689 } |
721 | 690 |
722 TEST_F(SchedulerHelperTest, TestLongIdlePeriodWhenNotCanEnterLongIdlePeriod) { | 691 TEST_F(SchedulerHelperTest, TestLongIdlePeriodWhenNotCanEnterLongIdlePeriod) { |
723 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(1000); | 692 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(1000); |
724 base::TimeDelta halfDelay = base::TimeDelta::FromMilliseconds(500); | 693 base::TimeDelta halfDelay = base::TimeDelta::FromMilliseconds(500); |
725 base::TimeTicks delayOver = clock_->Now() + delay; | 694 base::TimeTicks delayOver = clock_->Now() + delay; |
726 base::TimeTicks deadline_in_task; | 695 base::TimeTicks deadline_in_task; |
727 int run_count = 0; | 696 int run_count = 0; |
728 | 697 |
729 ON_CALL(*scheduler_helper_, CanEnterLongIdlePeriod(_, _)) | 698 ON_CALL(*scheduler_helper_, CanEnterLongIdlePeriod(_, _)) |
730 .WillByDefault(Invoke([delay, delayOver]( | 699 .WillByDefault(Invoke( |
731 base::TimeTicks now, | 700 [delay, delayOver](base::TimeTicks now, |
732 base::TimeDelta* next_long_idle_period_delay_out) { | 701 base::TimeDelta* next_long_idle_period_delay_out) { |
733 if (now >= delayOver) | 702 if (now >= delayOver) |
734 return true; | 703 return true; |
735 *next_long_idle_period_delay_out = delay; | 704 *next_long_idle_period_delay_out = delay; |
736 return false; | 705 return false; |
737 })); | 706 })); |
738 | 707 |
739 EXPECT_CALL(*scheduler_helper_, CanEnterLongIdlePeriod(_, _)).Times(3); | 708 EXPECT_CALL(*scheduler_helper_, CanEnterLongIdlePeriod(_, _)).Times(3); |
740 | 709 |
741 idle_task_runner_->PostIdleTask( | 710 idle_task_runner_->PostIdleTask( |
742 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); | 711 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); |
743 | 712 |
744 // Make sure Idle tasks don't run until the delay has occured. | 713 // Make sure Idle tasks don't run until the delay has occured. |
745 scheduler_helper_->EnableLongIdlePeriod(); | 714 scheduler_helper_->EnableLongIdlePeriod(); |
746 RunUntilIdle(); | 715 RunUntilIdle(); |
747 EXPECT_EQ(0, run_count); | 716 EXPECT_EQ(0, run_count); |
(...skipping 26 matching lines...) Expand all Loading... |
774 | 743 |
775 // Should return false if not in an idle period. | 744 // Should return false if not in an idle period. |
776 EXPECT_FALSE(scheduler_helper_->CanExceedIdleDeadlineIfRequired()); | 745 EXPECT_FALSE(scheduler_helper_->CanExceedIdleDeadlineIfRequired()); |
777 | 746 |
778 // Should return false for short idle periods. | 747 // Should return false for short idle periods. |
779 idle_task_runner_->PostIdleTask( | 748 idle_task_runner_->PostIdleTask( |
780 FROM_HERE, base::Bind(&TestCanExceedIdleDeadlineIfRequiredTask, | 749 FROM_HERE, base::Bind(&TestCanExceedIdleDeadlineIfRequiredTask, |
781 scheduler_helper_.get(), &can_exceed_idle_deadline, | 750 scheduler_helper_.get(), &can_exceed_idle_deadline, |
782 &run_count)); | 751 &run_count)); |
783 scheduler_helper_->StartIdlePeriod( | 752 scheduler_helper_->StartIdlePeriod( |
784 SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, | 753 SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), |
785 clock_->Now(), | 754 clock_->Now() + base::TimeDelta::FromMilliseconds(10), true); |
786 clock_->Now() + base::TimeDelta::FromMilliseconds(10), | |
787 true); | |
788 RunUntilIdle(); | 755 RunUntilIdle(); |
789 EXPECT_EQ(1, run_count); | 756 EXPECT_EQ(1, run_count); |
790 EXPECT_FALSE(can_exceed_idle_deadline); | 757 EXPECT_FALSE(can_exceed_idle_deadline); |
791 | 758 |
792 // Should return false for a long idle period which is shortened due to a | 759 // Should return false for a long idle period which is shortened due to a |
793 // pending delayed task. | 760 // pending delayed task. |
794 default_task_runner_->PostDelayedTask(FROM_HERE, base::Bind(&NullTask), | 761 default_task_runner_->PostDelayedTask(FROM_HERE, base::Bind(&NullTask), |
795 base::TimeDelta::FromMilliseconds(10)); | 762 base::TimeDelta::FromMilliseconds(10)); |
796 idle_task_runner_->PostIdleTask( | 763 idle_task_runner_->PostIdleTask( |
797 FROM_HERE, base::Bind(&TestCanExceedIdleDeadlineIfRequiredTask, | 764 FROM_HERE, base::Bind(&TestCanExceedIdleDeadlineIfRequiredTask, |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
938 base::TimeTicks expected_deadline = | 905 base::TimeTicks expected_deadline = |
939 clock_->Now() + | 906 clock_->Now() + |
940 base::TimeDelta::FromMilliseconds(kQuiescenceDelayMs + kLongIdlePeriodMs); | 907 base::TimeDelta::FromMilliseconds(kQuiescenceDelayMs + kLongIdlePeriodMs); |
941 default_task_runner_->PostTask(FROM_HERE, base::Bind(NullTask)); | 908 default_task_runner_->PostTask(FROM_HERE, base::Bind(NullTask)); |
942 RunUntilIdle(); | 909 RunUntilIdle(); |
943 | 910 |
944 EXPECT_EQ(1, run_count); | 911 EXPECT_EQ(1, run_count); |
945 EXPECT_EQ(expected_deadline, deadline_in_task); | 912 EXPECT_EQ(expected_deadline, deadline_in_task); |
946 } | 913 } |
947 | 914 |
948 } // namespace content | 915 } // namespace scheduler |
OLD | NEW |