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

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

Issue 1058873010: Move blink scheduler implementation into a component (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: updates Created 5 years, 8 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 "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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « components/scheduler/child/scheduler_helper.cc ('k') | components/scheduler/child/scheduler_message_loop_delegate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698