Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 /** | 5 /** |
| 6 * Test fixture for utility.js. | 6 * Test fixture for utility.js. |
| 7 * @constructor | 7 * @constructor |
| 8 * @extends {testing.Test} | 8 * @extends {testing.Test} |
| 9 */ | 9 */ |
| 10 function GoogleNowUtilityUnitTest () { | 10 function GoogleNowUtilityUnitTest () { |
| (...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 419 this.mockLocalFunctions.expects(once()).callback(); | 419 this.mockLocalFunctions.expects(once()).callback(); |
| 420 | 420 |
| 421 // Invocation. | 421 // Invocation. |
| 422 wrappedCallback(); | 422 wrappedCallback(); |
| 423 | 423 |
| 424 // Step 4. Firing runtime.onSuspend event. | 424 // Step 4. Firing runtime.onSuspend event. |
| 425 assertTrue(onSuspendHandlerContainer.length == 1, | 425 assertTrue(onSuspendHandlerContainer.length == 1, |
| 426 'onSuspendHandlerContainer.length must be 1'); | 426 'onSuspendHandlerContainer.length must be 1'); |
| 427 onSuspendHandlerContainer[0](); | 427 onSuspendHandlerContainer[0](); |
| 428 }); | 428 }); |
| 429 | |
| 430 var taskNameA = 'TASK A'; | |
| 431 var taskNameB = 'TASK B'; | |
| 432 var taskNameC = 'TASK C'; | |
| 433 | |
| 434 function areTasksConflicting(newTaskName, scheduledTaskName) { | |
| 435 return newTaskName == taskNameB && scheduledTaskName == taskNameA; | |
| 436 } | |
| 437 | |
| 438 function setUpTaskManagerTest(fixture) { | |
| 439 // We want to mock wrapper using makeAndRegisterMockApis(), which requires | |
| 440 // the mocked functions to not exist as a precondition. Resetting 'wrapper' to | |
| 441 // 'undefined'. | |
| 442 wrapper = undefined; | |
| 443 | |
| 444 fixture.makeAndRegisterMockApis([ | |
| 445 'wrapper.checkInWrappedCallback', | |
| 446 'wrapper.registerWrapperPluginFactory', | |
| 447 'wrapper.debugGetStateString' | |
| 448 ]); | |
| 449 fixture.makeMockLocalFunctions(['task1', 'task2', 'task3']); | |
| 450 fixture.makeAndRegisterMockGlobals(['reportError']); | |
| 451 | |
| 452 fixture.mockApis.stubs().wrapper_checkInWrappedCallback(); | |
| 453 fixture.mockApis.stubs().wrapper_debugGetStateString(). | |
| 454 will(returnValue('testWrapperDebugState')); | |
| 455 | |
| 456 var registerWrapperPluginFactorySavedArgs = new SaveMockArguments(); | |
| 457 fixture.mockApis.expects(once()).wrapper_registerWrapperPluginFactory( | |
| 458 registerWrapperPluginFactorySavedArgs.match(ANYTHING)); | |
| 459 var tasks = buildTaskManager(areTasksConflicting); | |
| 460 Mock4JS.verifyAllMocks(); | |
| 461 | |
| 462 return { | |
| 463 tasks: tasks, | |
| 464 pluginFactory: registerWrapperPluginFactorySavedArgs.arguments[0] | |
| 465 }; | |
| 466 } | |
| 467 | |
| 468 TEST_F('GoogleNowUtilityUnitTest', 'TaskManager2Sequential', function() { | |
| 469 // Tests that 2 tasks get successfully executed consequentially, even if the | |
| 470 // second one conflicts with the first. | |
| 471 | |
| 472 // Setup. | |
| 473 var test = setUpTaskManagerTest(this); | |
| 474 | |
| 475 // Step 1. Adding 1st task that doesn't create pending callbacks. | |
| 476 // Expectations. | |
| 477 this.mockLocalFunctions.expects(once()).task1(ANYTHING); | |
| 478 // Invocation. | |
| 479 test.tasks.add(taskNameA, this.mockLocalFunctions.functions().task1); | |
| 480 Mock4JS.verifyAllMocks(); | |
| 481 | |
| 482 // Step 2. Adding 2nd task. | |
| 483 // Expectations. | |
| 484 this.mockLocalFunctions.expects(once()).task2(ANYTHING); | |
| 485 // Invocation. | |
| 486 test.tasks.add(taskNameB, this.mockLocalFunctions.functions().task2); | |
| 487 }); | |
| 488 | |
| 489 TEST_F('GoogleNowUtilityUnitTest', 'TaskManagerConflicting', function() { | |
| 490 // Tests that adding a task while a conflicting task is being executed, causes | |
| 491 // the second one to be ignored. | |
| 492 | |
| 493 // Setup. | |
| 494 var test = setUpTaskManagerTest(this); | |
| 495 var task1PluginInstance; | |
| 496 | |
| 497 // Step 1. Adding 1st task that creates a pending callback. | |
| 498 // Expectations. | |
| 499 this.mockLocalFunctions.expects(once()).task1(ANYTHING). | |
| 500 will(callFunction(function() { | |
| 501 task1PluginInstance = test.pluginFactory(); | |
| 502 })); | |
| 503 // Invocation. | |
| 504 test.tasks.add(taskNameA, this.mockLocalFunctions.functions().task1); | |
| 505 Mock4JS.verifyAllMocks(); | |
| 506 | |
| 507 // Step 2. Adding 2nd task. | |
| 508 test.tasks.add(taskNameB, this.mockLocalFunctions.functions().task2); | |
| 509 Mock4JS.verifyAllMocks(); | |
| 510 | |
| 511 // Step 3. Entering the callback of task1. | |
| 512 task1PluginInstance.prologue(); | |
|
robliao
2013/09/03 23:23:31
It is worth a discussion as to what makes this tes
vadimt
2013/09/04 00:29:16
You mean what's the difference from TaskManager2Se
robliao
2013/09/04 00:54:00
That's the idea. A bit of the mechanics should be
vadimt
2013/09/04 01:40:15
Done.
robliao
2013/09/04 17:02:03
Where was this done?
On 2013/09/04 01:40:15, vadim
vadimt
2013/09/04 17:21:37
CR tool may not show you the latest uploaded versi
| |
| 513 Mock4JS.verifyAllMocks(); | |
| 514 | |
| 515 // Step 4. Leaving the callback of task1. | |
| 516 task1PluginInstance.epilogue(); | |
| 517 }); | |
| 518 | |
| 519 TEST_F('GoogleNowUtilityUnitTest', 'TaskManagerNestedTaskEnqueue', function() { | |
| 520 // Tests that adding a task while a non-conflicting task is being executed, | |
| 521 // causes the second one to be executed after the first one completes. | |
| 522 | |
| 523 // Setup. | |
| 524 var test = setUpTaskManagerTest(this); | |
| 525 var task1PluginInstance; | |
| 526 | |
| 527 // Step 1. Adding 1st task that creates a pending callback. | |
| 528 // Expectations. | |
| 529 this.mockLocalFunctions.expects(once()).task1(ANYTHING). | |
| 530 will(callFunction(function() { | |
| 531 task1PluginInstance = test.pluginFactory(); | |
| 532 })); | |
| 533 // Invocation. | |
| 534 test.tasks.add(taskNameA, this.mockLocalFunctions.functions().task1); | |
| 535 Mock4JS.verifyAllMocks(); | |
| 536 | |
| 537 // Step 2. Adding 2nd task. | |
| 538 test.tasks.add(taskNameC, this.mockLocalFunctions.functions().task2); | |
|
robliao
2013/09/03 23:23:31
Why not taskNameB?
vadimt
2013/09/04 00:29:16
taskNameB conflicts with taskNameA, while taskName
robliao
2013/09/04 00:54:00
Future readers will ask this question since the co
vadimt
2013/09/04 01:40:15
Done.
| |
| 539 Mock4JS.verifyAllMocks(); | |
| 540 | |
| 541 // Step 3. Entering the callback of task1. | |
| 542 task1PluginInstance.prologue(); | |
| 543 Mock4JS.verifyAllMocks(); | |
| 544 | |
| 545 // Step 4. Leaving the callback of task1. | |
| 546 // Expectations. | |
| 547 this.mockLocalFunctions.expects(once()).task2(ANYTHING); | |
| 548 // Invocation. | |
| 549 task1PluginInstance.epilogue(); | |
| 550 }); | |
| 551 | |
| 552 TEST_F('GoogleNowUtilityUnitTest', 'TaskManagerBranching', function() { | |
| 553 // Tests that task manager correctly detects completion of tasks that create | |
| 554 // branching chains of callbacks. | |
|
robliao
2013/09/03 23:23:31
Detail the tested branching pattern.
vadimt
2013/09/04 00:29:16
Done.
| |
| 555 | |
| 556 // Setup. | |
| 557 var test = setUpTaskManagerTest(this); | |
| 558 var task1PluginInstance1, task1PluginInstance2, task1PluginInstance3; | |
| 559 | |
| 560 // Step 1. Adding 1st task that creates a 2 pending callbacks. | |
| 561 // Expectations. | |
| 562 this.mockLocalFunctions.expects(once()).task1(ANYTHING). | |
| 563 will(callFunction(function() { | |
| 564 task1PluginInstance1 = test.pluginFactory(); | |
| 565 task1PluginInstance2 = test.pluginFactory(); | |
| 566 })); | |
| 567 // Invocation. | |
| 568 test.tasks.add(taskNameA, this.mockLocalFunctions.functions().task1); | |
| 569 Mock4JS.verifyAllMocks(); | |
| 570 | |
| 571 // Step 2. Adding 2nd task. | |
| 572 test.tasks.add(taskNameC, this.mockLocalFunctions.functions().task2); | |
|
robliao
2013/09/03 23:23:31
taskNameB?
vadimt
2013/09/04 00:29:16
Need 'C' because 'B' is conflicting and would be i
robliao
2013/09/04 00:54:00
That's not obvious from a reading of the test case
vadimt
2013/09/04 01:40:15
Done.
| |
| 573 Mock4JS.verifyAllMocks(); | |
| 574 | |
| 575 // Step 3. Entering callback 1, create pending callback 3, exit callback 1. | |
| 576 // Enter/exit callback 2. Enter callback 3. | |
| 577 task1PluginInstance1.prologue(); | |
| 578 task1PluginInstance3 = test.pluginFactory(); | |
| 579 task1PluginInstance1.epilogue(); | |
| 580 task1PluginInstance2.prologue(); | |
| 581 task1PluginInstance2.epilogue(); | |
| 582 task1PluginInstance3.prologue(); | |
| 583 Mock4JS.verifyAllMocks(); | |
| 584 | |
| 585 // Step 4. Leaving 3rd callback of task1. Now task1 is complete, and task2 | |
| 586 // should start. | |
| 587 // Expectations. | |
| 588 this.mockLocalFunctions.expects(once()).task2(ANYTHING); | |
| 589 // Invocation. | |
| 590 task1PluginInstance3.epilogue(); | |
| 591 }); | |
| 592 | |
| 593 TEST_F('GoogleNowUtilityUnitTest', 'TaskManagerSuspendError', function() { | |
| 594 // Tests that task manager's onSuspend method reports an error if there are | |
| 595 // pending tasks. | |
| 596 | |
| 597 // Setup. | |
| 598 var test = setUpTaskManagerTest(this); | |
| 599 var onSuspendHandlerContainer = getMockHandlerContainer('runtime.onSuspend'); | |
| 600 | |
| 601 // Step 1. Adding a task that creates a pending callback. | |
| 602 // Expectations. | |
| 603 this.mockLocalFunctions.expects(once()).task1(ANYTHING). | |
| 604 will(callFunction(function() { | |
| 605 test.pluginFactory(); | |
| 606 })); | |
| 607 // Invocation. | |
| 608 test.tasks.add(taskNameA, this.mockLocalFunctions.functions().task1); | |
| 609 Mock4JS.verifyAllMocks(); | |
| 610 | |
| 611 // Step 2. Invoke onSuspend event of the task manager. | |
| 612 // Setup and expectations. The 2 callbacks in onSuspendHandlerContainer are | |
| 613 // from the wrapper and the task manager. | |
| 614 assertTrue(onSuspendHandlerContainer.length == 2, | |
| 615 'onSuspendHandlerContainer.length must be 2'); | |
| 616 this.mockGlobals.expects(once()).reportError(eqToString( | |
| 617 'Error: ASSERT: Incomplete task when unloading event page,' + | |
| 618 ' queue = [{"name":"TASK A"}], testWrapperDebugState')); | |
| 619 // Invocation. | |
| 620 onSuspendHandlerContainer[1](); | |
| 621 }); | |
| 622 | |
| 623 TEST_F('GoogleNowUtilityUnitTest', 'TaskManagerSuspendSuccess', function() { | |
| 624 // Tests that task manager's onSuspend method does not reports an error if all | |
| 625 // tasks completed. | |
| 626 | |
| 627 // Setup. | |
| 628 var test = setUpTaskManagerTest(this); | |
| 629 var onSuspendHandlerContainer = getMockHandlerContainer('runtime.onSuspend'); | |
|
robliao
2013/09/03 23:23:31
Where is getMockHandlerContainer defined? Code sea
vadimt
2013/09/04 00:29:16
In https://codereview.chromium.org/23477006/diff/3
| |
| 630 var task1PluginInstance; | |
| 631 | |
| 632 // Step 1. Adding a task that creates a pending callback. | |
| 633 // Expectations. | |
| 634 this.mockLocalFunctions.expects(once()).task1(ANYTHING). | |
| 635 will(callFunction(function() { | |
| 636 task1PluginInstance = test.pluginFactory(); | |
| 637 })); | |
| 638 // Invocation. | |
| 639 test.tasks.add(taskNameA, this.mockLocalFunctions.functions().task1); | |
| 640 Mock4JS.verifyAllMocks(); | |
| 641 | |
| 642 // Step 2. Invoke task's callback and the onSuspend event of the task manager. | |
| 643 // The 2 callbacks in onSuspendHandlerContainer are from the wrapper and the | |
| 644 // task manager. | |
| 645 task1PluginInstance.prologue(); | |
| 646 task1PluginInstance.epilogue(); | |
| 647 onSuspendHandlerContainer[1](); | |
| 648 }); | |
| 649 | |
| 650 TEST_F('GoogleNowUtilityUnitTest', 'TaskManager3Tasks', function() { | |
| 651 // Tests that 3 tasks can be executed too. In particular, that if the second | |
| 652 // task is a single-step task which execution was originally blocked by task1, | |
| 653 // unblocking it causes immediate synchronous execution of both tasks 2 and 3. | |
| 654 | |
| 655 // Setup. | |
| 656 var test = setUpTaskManagerTest(this); | |
| 657 var task1PluginInstance; | |
| 658 | |
| 659 // Step 1. Adding 1st task that creates a pending callback. | |
| 660 // Expectations. | |
| 661 this.mockLocalFunctions.expects(once()).task1(ANYTHING). | |
| 662 will(callFunction(function() { | |
| 663 task1PluginInstance = test.pluginFactory(); | |
| 664 })); | |
| 665 // Invocation. | |
| 666 test.tasks.add(taskNameA, this.mockLocalFunctions.functions().task1); | |
| 667 Mock4JS.verifyAllMocks(); | |
| 668 | |
| 669 // Step 2. Adding 2nd and 3rd tasks. | |
| 670 test.tasks.add(taskNameC, this.mockLocalFunctions.functions().task2); | |
|
robliao
2013/09/03 23:23:31
taskNameB?
vadimt
2013/09/04 00:29:16
Se above about conflicts.
| |
| 671 test.tasks.add(taskNameC, this.mockLocalFunctions.functions().task3); | |
| 672 Mock4JS.verifyAllMocks(); | |
| 673 | |
| 674 // Step 3. Entering the callback of task1. | |
| 675 task1PluginInstance.prologue(); | |
| 676 Mock4JS.verifyAllMocks(); | |
| 677 | |
| 678 // Step 4. Leaving the callback of task1. | |
| 679 // Expectations. | |
| 680 this.mockLocalFunctions.expects(once()).task2(ANYTHING); | |
| 681 this.mockLocalFunctions.expects(once()).task3(ANYTHING); | |
| 682 // Invocation. | |
| 683 task1PluginInstance.epilogue(); | |
| 684 }); | |
| 685 | |
| 686 TEST_F('GoogleNowUtilityUnitTest', 'TaskManagerNestedNonTask', function() { | |
| 687 // Tests callbacks requested while a task is running, but not from a callback | |
| 688 // belonging to a task, are not counted as a part of the task. | |
| 689 | |
| 690 // Setup. | |
| 691 var test = setUpTaskManagerTest(this); | |
| 692 var task1PluginInstance, nonTaskPluginInstance; | |
| 693 | |
| 694 // Step 1. Adding 1st task that creates a pending callback. | |
| 695 // Expectations. | |
| 696 this.mockLocalFunctions.expects(once()).task1(ANYTHING). | |
| 697 will(callFunction(function() { | |
| 698 task1PluginInstance = test.pluginFactory(); | |
| 699 })); | |
| 700 // Invocation. | |
| 701 test.tasks.add(taskNameA, this.mockLocalFunctions.functions().task1); | |
| 702 Mock4JS.verifyAllMocks(); | |
| 703 | |
| 704 // Step 2. Code that is not a part of the task creates a pending callback. | |
| 705 nonTaskPluginInstance = test.pluginFactory(); | |
|
robliao
2013/09/03 23:23:31
This variable is never read. Necessary?
vadimt
2013/09/04 00:29:16
Thanks!
| |
| 706 Mock4JS.verifyAllMocks(); | |
| 707 | |
| 708 // Step 3. Entering the callback of task1. After this, task1 should be | |
| 709 // finished despite the pending non-task callback. | |
| 710 task1PluginInstance.prologue(); | |
| 711 task1PluginInstance.epilogue(); | |
| 712 Mock4JS.verifyAllMocks(); | |
| 713 | |
| 714 // Step 4. Checking that task1 is finished by submitting task2, which should | |
| 715 // be executed immediately. | |
| 716 this.mockLocalFunctions.expects(once()).task2(ANYTHING); | |
| 717 test.tasks.add(taskNameC, this.mockLocalFunctions.functions().task2); | |
| 718 }); | |
| OLD | NEW |