| 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 750 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 761 var testAttemptAlarmName = 'attempt-scheduler-testAttempts'; | 761 var testAttemptAlarmName = 'attempt-scheduler-testAttempts'; |
| 762 var testAttemptStorageKey = 'current-delay-testAttempts'; | 762 var testAttemptStorageKey = 'current-delay-testAttempts'; |
| 763 var testInitialDelaySeconds = 239; | 763 var testInitialDelaySeconds = 239; |
| 764 var testMaximumDelaySeconds = 2239; | 764 var testMaximumDelaySeconds = 2239; |
| 765 // Value to be returned by mocked Math.random(). We want the value returned by | 765 // Value to be returned by mocked Math.random(). We want the value returned by |
| 766 // Math.random() to be predictable to be able to check results against expected | 766 // Math.random() to be predictable to be able to check results against expected |
| 767 // values. A fixed seed would be okay, but fixed seeding isn't possible in JS at | 767 // values. A fixed seed would be okay, but fixed seeding isn't possible in JS at |
| 768 // the moment. | 768 // the moment. |
| 769 var testRandomValue = 0.31415926; | 769 var testRandomValue = 0.31415926; |
| 770 | 770 |
| 771 function createTestAttempStorageEntry(delaySeconds) { | 771 /** |
| 772 // Creates a test storage object that attempt manager uses to store current | 772 * Creates a default storage current delay object. |
| 773 // delay. | 773 */ |
| 774 function createTestAttemptStorageEntryRequest() { |
| 775 var storageObject = {}; |
| 776 storageObject[testAttemptStorageKey] = testMaximumDelaySeconds; |
| 777 return storageObject; |
| 778 } |
| 779 |
| 780 /** |
| 781 * Creates a test storage object that attempt manager uses to store current |
| 782 * delay. |
| 783 */ |
| 784 function createTestAttemptStorageEntry(delaySeconds) { |
| 774 var storageObject = {}; | 785 var storageObject = {}; |
| 775 storageObject[testAttemptStorageKey] = delaySeconds; | 786 storageObject[testAttemptStorageKey] = delaySeconds; |
| 776 return storageObject; | 787 return storageObject; |
| 777 } | 788 } |
| 778 | 789 |
| 779 function setupAttemptManagerTest(fixture) { | 790 function setupAttemptManagerTest(fixture) { |
| 780 Math.random = function() { return testRandomValue; } | 791 Math.random = function() { return testRandomValue; } |
| 781 | 792 |
| 782 fixture.makeMockLocalFunctions([ | 793 fixture.makeMockLocalFunctions([ |
| 783 'attempt', | 794 'attempt', |
| 784 'planForNextCallback', | 795 'planForNextCallback', |
| 785 'isRunningCallback' | 796 'isRunningCallback' |
| 786 ]); | 797 ]); |
| 787 fixture.makeAndRegisterMockApis([ | 798 fixture.makeAndRegisterMockApis([ |
| 788 'chrome.alarms.clear', | 799 'chrome.alarms.clear', |
| 789 'chrome.alarms.create', | 800 'chrome.alarms.create', |
| 790 'chrome.storage.local.remove', | 801 'chrome.storage.local.remove', |
| 791 'chrome.storage.local.set', | 802 'chrome.storage.local.set', |
| 792 'instrumented.alarms.get', | 803 'fillFromChromeLocalStorage', |
| 793 'instrumented.storage.local.get' | 804 'instrumented.alarms.get' |
| 794 ]); | 805 ]); |
| 795 | 806 |
| 796 var testAttempts = buildAttemptManager( | 807 var testAttempts = buildAttemptManager( |
| 797 'testAttempts', | 808 'testAttempts', |
| 798 fixture.mockLocalFunctions.functions().attempt, | 809 fixture.mockLocalFunctions.functions().attempt, |
| 799 testInitialDelaySeconds, | 810 testInitialDelaySeconds, |
| 800 testMaximumDelaySeconds); | 811 testMaximumDelaySeconds); |
| 801 Mock4JS.verifyAllMocks(); | 812 Mock4JS.verifyAllMocks(); |
| 802 | 813 |
| 803 return { | 814 return { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 829 // Expectations. | 840 // Expectations. |
| 830 var expectedRetryDelaySeconds = | 841 var expectedRetryDelaySeconds = |
| 831 testInitialDelaySeconds * (1 + testRandomValue * 0.2); | 842 testInitialDelaySeconds * (1 + testRandomValue * 0.2); |
| 832 this.mockApis.expects(once()).chrome_alarms_create( | 843 this.mockApis.expects(once()).chrome_alarms_create( |
| 833 testAttemptAlarmName, | 844 testAttemptAlarmName, |
| 834 eqJSON({ | 845 eqJSON({ |
| 835 delayInMinutes: expectedRetryDelaySeconds / 60, | 846 delayInMinutes: expectedRetryDelaySeconds / 60, |
| 836 periodInMinutes: testMaximumDelaySeconds / 60 | 847 periodInMinutes: testMaximumDelaySeconds / 60 |
| 837 })); | 848 })); |
| 838 this.mockApis.expects(once()).chrome_storage_local_set( | 849 this.mockApis.expects(once()).chrome_storage_local_set( |
| 839 eqJSON(createTestAttempStorageEntry(expectedRetryDelaySeconds))); | 850 eqJSON(createTestAttemptStorageEntry(expectedRetryDelaySeconds))); |
| 840 // Invocation. | 851 // Invocation. |
| 841 test.attempts.start(); | 852 test.attempts.start(); |
| 842 Mock4JS.verifyAllMocks(); | 853 Mock4JS.verifyAllMocks(); |
| 843 | 854 |
| 844 // Step 3. Check that attempt manager is running. | 855 // Step 3. Check that attempt manager is running. |
| 845 // Expectations. | 856 // Expectations. |
| 846 alarmsGetSavedArgs = new SaveMockArguments(); | 857 alarmsGetSavedArgs = new SaveMockArguments(); |
| 847 this.mockApis.expects(once()). | 858 this.mockApis.expects(once()). |
| 848 instrumented_alarms_get( | 859 instrumented_alarms_get( |
| 849 alarmsGetSavedArgs.match(eq(testAttemptAlarmName)), | 860 alarmsGetSavedArgs.match(eq(testAttemptAlarmName)), |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 895 | 906 |
| 896 // Setup. | 907 // Setup. |
| 897 var test = setupAttemptManagerTest(this); | 908 var test = setupAttemptManagerTest(this); |
| 898 var testStoredRetryDelay = 433; | 909 var testStoredRetryDelay = 433; |
| 899 | 910 |
| 900 // Call planForNext, which prepares next attempt. Current retry time | 911 // Call planForNext, which prepares next attempt. Current retry time |
| 901 // is less than 1/2 of the maximum delay. | 912 // is less than 1/2 of the maximum delay. |
| 902 // Expectations. | 913 // Expectations. |
| 903 var expectedRetryDelaySeconds = | 914 var expectedRetryDelaySeconds = |
| 904 testStoredRetryDelay * 2 * (1 + testRandomValue * 0.2); | 915 testStoredRetryDelay * 2 * (1 + testRandomValue * 0.2); |
| 905 var storageGetSavedArgs = new SaveMockArguments(); | 916 expectChromeLocalStorageGet( |
| 906 this.mockApis.expects(once()).instrumented_storage_local_get( | 917 this, |
| 907 storageGetSavedArgs.match(eq(testAttemptStorageKey)), | 918 createTestAttemptStorageEntryRequest(), |
| 908 storageGetSavedArgs.match(ANYTHING)). | 919 createTestAttemptStorageEntry(testStoredRetryDelay)); |
| 909 will(invokeCallback( | |
| 910 storageGetSavedArgs, | |
| 911 1, | |
| 912 createTestAttempStorageEntry(testStoredRetryDelay))); | |
| 913 this.mockApis.expects(once()).chrome_alarms_create( | 920 this.mockApis.expects(once()).chrome_alarms_create( |
| 914 testAttemptAlarmName, | 921 testAttemptAlarmName, |
| 915 eqJSON({ | 922 eqJSON({ |
| 916 delayInMinutes: expectedRetryDelaySeconds / 60, | 923 delayInMinutes: expectedRetryDelaySeconds / 60, |
| 917 periodInMinutes: testMaximumDelaySeconds / 60})); | 924 periodInMinutes: testMaximumDelaySeconds / 60})); |
| 918 this.mockApis.expects(once()).chrome_storage_local_set( | 925 this.mockApis.expects(once()).chrome_storage_local_set( |
| 919 eqJSON(createTestAttempStorageEntry(expectedRetryDelaySeconds))); | 926 eqJSON(createTestAttemptStorageEntry(expectedRetryDelaySeconds))); |
| 920 this.mockLocalFunctions.expects(once()).planForNextCallback(); | 927 this.mockLocalFunctions.expects(once()).planForNextCallback(); |
| 921 // Invocation. | 928 // Invocation. |
| 922 test.attempts.planForNext( | 929 test.attempts.planForNext( |
| 923 this.mockLocalFunctions.functions().planForNextCallback); | 930 this.mockLocalFunctions.functions().planForNextCallback); |
| 924 }); | 931 }); |
| 925 | 932 |
| 926 TEST_F('GoogleNowUtilityUnitTest', 'AttemptManagerGrowthLimit', function() { | 933 TEST_F('GoogleNowUtilityUnitTest', 'AttemptManagerGrowthLimit', function() { |
| 927 // Tests that retry time stops growing at the maximum value. | 934 // Tests that retry time stops growing at the maximum value. |
| 928 | 935 |
| 929 // Setup. | 936 // Setup. |
| 930 var test = setupAttemptManagerTest(this); | 937 var test = setupAttemptManagerTest(this); |
| 931 var testStoredRetryDelay = 1500; | 938 var testStoredRetryDelay = 1500; |
| 932 | 939 |
| 933 // Call planForNext, which prepares next attempt. Current retry time | 940 // Call planForNext, which prepares next attempt. Current retry time |
| 934 // is greater than 1/2 of the maximum delay. | 941 // is greater than 1/2 of the maximum delay. |
| 935 // Expectations. | 942 // Expectations. |
| 936 var expectedRetryDelaySeconds = testMaximumDelaySeconds; | 943 var expectedRetryDelaySeconds = testMaximumDelaySeconds; |
| 937 var storageGetSavedArgs = new SaveMockArguments(); | 944 expectChromeLocalStorageGet( |
| 938 this.mockApis.expects(once()). | 945 this, |
| 939 instrumented_storage_local_get( | 946 createTestAttemptStorageEntryRequest(), |
| 940 storageGetSavedArgs.match(eq(testAttemptStorageKey)), | 947 createTestAttemptStorageEntry(testStoredRetryDelay) |
| 941 storageGetSavedArgs.match(ANYTHING)). | 948 ); |
| 942 will(invokeCallback( | |
| 943 storageGetSavedArgs, | |
| 944 1, | |
| 945 createTestAttempStorageEntry(testStoredRetryDelay))); | |
| 946 this.mockApis.expects(once()).chrome_alarms_create( | 949 this.mockApis.expects(once()).chrome_alarms_create( |
| 947 testAttemptAlarmName, | 950 testAttemptAlarmName, |
| 948 eqJSON({ | 951 eqJSON({ |
| 949 delayInMinutes: expectedRetryDelaySeconds / 60, | 952 delayInMinutes: expectedRetryDelaySeconds / 60, |
| 950 periodInMinutes: testMaximumDelaySeconds / 60 | 953 periodInMinutes: testMaximumDelaySeconds / 60 |
| 951 })); | 954 })); |
| 952 this.mockApis.expects(once()).chrome_storage_local_set( | 955 this.mockApis.expects(once()).chrome_storage_local_set( |
| 953 eqJSON(createTestAttempStorageEntry(expectedRetryDelaySeconds))); | 956 eqJSON(createTestAttemptStorageEntry(expectedRetryDelaySeconds))); |
| 954 this.mockLocalFunctions.expects(once()).planForNextCallback(); | 957 this.mockLocalFunctions.expects(once()).planForNextCallback(); |
| 955 // Invocation. | 958 // Invocation. |
| 956 test.attempts.planForNext( | 959 test.attempts.planForNext( |
| 957 this.mockLocalFunctions.functions().planForNextCallback); | 960 this.mockLocalFunctions.functions().planForNextCallback); |
| 958 }); | 961 }); |
| 959 | 962 |
| 960 TEST_F('GoogleNowUtilityUnitTest', 'AttemptManagerAlarm', function() { | 963 TEST_F('GoogleNowUtilityUnitTest', 'AttemptManagerAlarm', function() { |
| 961 // Tests that firing the alarm invokes the attempt. | 964 // Tests that firing the alarm invokes the attempt. |
| 962 | 965 |
| 963 // Setup. | 966 // Setup. |
| 964 var test = setupAttemptManagerTest(this); | 967 var test = setupAttemptManagerTest(this); |
| 965 var onAlarmHandlerContainer = getMockHandlerContainer('alarms.onAlarm'); | 968 var onAlarmHandlerContainer = getMockHandlerContainer('alarms.onAlarm'); |
| 966 assertEquals(1, onAlarmHandlerContainer.length); | 969 assertEquals(1, onAlarmHandlerContainer.length); |
| 967 | 970 |
| 968 // Fire the alarm and check that this invokes the attempt callback. | 971 // Fire the alarm and check that this invokes the attempt callback. |
| 969 // Expectations. | 972 // Expectations. |
| 970 var alarmsGetSavedArgs = new SaveMockArguments(); | 973 var alarmsGetSavedArgs = new SaveMockArguments(); |
| 971 this.mockApis.expects(once()). | 974 this.mockApis.expects(once()). |
| 972 instrumented_alarms_get( | 975 instrumented_alarms_get( |
| 973 alarmsGetSavedArgs.match(eq(testAttemptAlarmName)), | 976 alarmsGetSavedArgs.match(eq(testAttemptAlarmName)), |
| 974 alarmsGetSavedArgs.match(ANYTHING)). | 977 alarmsGetSavedArgs.match(ANYTHING)). |
| 975 will(invokeCallback(alarmsGetSavedArgs, 1, {testField: 'TEST VALUE'})); | 978 will(invokeCallback(alarmsGetSavedArgs, 1, {testField: 'TEST VALUE'})); |
| 976 this.mockLocalFunctions.expects(once()).attempt(); | 979 this.mockLocalFunctions.expects(once()).attempt(); |
| 977 // Invocation. | 980 // Invocation. |
| 978 onAlarmHandlerContainer[0]({name: testAttemptAlarmName}); | 981 onAlarmHandlerContainer[0]({name: testAttemptAlarmName}); |
| 979 }); | 982 }); |
| OLD | NEW |