Chromium Code Reviews| Index: chrome/browser/resources/google_now/utility_unittest.gtestjs |
| diff --git a/chrome/browser/resources/google_now/utility_unittest.gtestjs b/chrome/browser/resources/google_now/utility_unittest.gtestjs |
| index 423f0878195a674c5c7ae0f26130b6329c4e4b34..ac8b0fa38d07b76918c4053b4add14e8d2e2dcca 100644 |
| --- a/chrome/browser/resources/google_now/utility_unittest.gtestjs |
| +++ b/chrome/browser/resources/google_now/utility_unittest.gtestjs |
| @@ -179,8 +179,7 @@ TEST_F('GoogleNowUtilityUnitTest', 'WrapperWrapCallbackEvent', function() { |
| wrapper.checkInWrappedCallback(); |
| // Step 4. Check that there won't be errors whe the page unloads. |
| - assertTrue(onSuspendHandlerContainer.length == 1, |
| - 'onSuspendHandlerContainer.length must be 1'); |
| + assertEquals(1, onSuspendHandlerContainer.length); |
| onSuspendHandlerContainer[0](); |
| }); |
| @@ -381,8 +380,7 @@ TEST_F('GoogleNowUtilityUnitTest', 'WrapperOnSuspendListenerFail', function() { |
| reportError(eqJSON(testError)); |
| // Invocation. |
| - assertTrue(onSuspendHandlerContainer.length == 1, |
| - 'onSuspendHandlerContainer.length must be 1'); |
| + assertEquals(1, onSuspendHandlerContainer.length); |
| onSuspendHandlerContainer[0](); |
| }); |
| @@ -424,8 +422,7 @@ TEST_F('GoogleNowUtilityUnitTest', |
| wrappedCallback(); |
| // Step 4. Fire runtime.onSuspend event. |
| - assertTrue(onSuspendHandlerContainer.length == 1, |
| - 'onSuspendHandlerContainer.length must be 1'); |
| + assertEquals(1, onSuspendHandlerContainer.length); |
| onSuspendHandlerContainer[0](); |
| }); |
| @@ -441,11 +438,6 @@ function areTasksConflicting(newTaskName, scheduledTaskName) { |
| } |
| function setUpTaskManagerTest(fixture) { |
| - // We want to mock wrapper using makeAndRegisterMockApis(), which requires |
| - // the mocked functions to not exist as a precondition. Resetting 'wrapper' to |
| - // 'undefined'. |
| - wrapper = undefined; |
| - |
| fixture.makeAndRegisterMockApis([ |
| 'wrapper.checkInWrappedCallback', |
| 'wrapper.registerWrapperPluginFactory', |
| @@ -620,8 +612,7 @@ TEST_F('GoogleNowUtilityUnitTest', 'TaskManagerSuspendError', function() { |
| // Step 2. Invoke onSuspend event of the task manager. |
| // Setup and expectations. The 2 callbacks in onSuspendHandlerContainer are |
| // from the wrapper and the task manager. |
| - assertTrue(onSuspendHandlerContainer.length == 2, |
| - 'onSuspendHandlerContainer.length must be 2'); |
| + assertEquals(2, onSuspendHandlerContainer.length); |
| this.mockGlobals.expects(once()).reportError(eqToString( |
| 'Error: ASSERT: Incomplete task when unloading event page,' + |
| ' queue = [{"name":"TASK A"}], testWrapperDebugState')); |
| @@ -726,3 +717,223 @@ TEST_F('GoogleNowUtilityUnitTest', 'TaskManagerNestedNonTask', function() { |
| this.mockLocalFunctions.expects(once()).task2(ANYTHING); |
| test.tasks.add(taskNameC, this.mockLocalFunctions.functions().task2); |
| }); |
| + |
| +var testAttemptAlarmName = 'attempt-scheduler-testAttempts'; |
| +var testAttemptStorageKey = 'current-delay-testAttempts'; |
| +var testInitialDelaySeconds = 239; |
| +var testMaximumDelaySeconds = 2239; |
| +// Value to be returned by mocked Math.random(). We want the value returned by |
| +// Math.random() to be predictable to be able to check results against expected |
| +// values. A fixed seed would be okay, but fixed seeding isn't possible in JS at |
| +// the moment. |
| +var testRandomValue = 0.31415926; |
|
arv (Not doing code reviews)
2013/09/09 13:55:10
FYI, we have a bunch of these already:
https://co
vadimt
2013/09/09 15:53:06
Thanks, that's nice to know! However, I don't see
|
| + |
| +function createTestAttempStorageEntry(delaySeconds) { |
| + // Creates a test storage object that attempt manager uses to store current |
| + // delay. |
| + var storageObject = {}; |
| + storageObject[testAttemptStorageKey] = delaySeconds; |
| + return storageObject; |
| +} |
| + |
| +function setupAttemptManagerTest(fixture) { |
| + Math.random = function() { return testRandomValue; } |
| + |
| + fixture.makeMockLocalFunctions([ |
| + 'attempt', |
| + 'planForNextCallback', |
| + 'isRunningCallback' |
| + ]); |
| + fixture.makeAndRegisterMockApis([ |
| + 'chrome.alarms.clear', |
| + 'chrome.alarms.create', |
| + 'chrome.storage.local.remove', |
| + 'chrome.storage.local.set', |
| + 'instrumented.alarms.get', |
| + 'instrumented.storage.local.get' |
| + ]); |
| + |
| + var testAttempts = buildAttemptManager( |
| + 'testAttempts', |
| + fixture.mockLocalFunctions.functions().attempt, |
| + testInitialDelaySeconds, |
| + testMaximumDelaySeconds); |
| + Mock4JS.verifyAllMocks(); |
| + |
| + return { |
| + attempts: testAttempts |
| + }; |
| +} |
| + |
| +TEST_F('GoogleNowUtilityUnitTest', 'AttemptManagerStartStop', function() { |
| + // Tests starting and stopping an attempt manager. |
| + |
| + // Setup. |
| + var test = setupAttemptManagerTest(this); |
| + |
| + // Step 1. Check that attempt manager is not running. |
| + // Expectations. |
| + var alarmsGetSavedArgs = new SaveMockArguments(); |
| + this.mockApis.expects(once()). |
| + instrumented_alarms_get( |
| + alarmsGetSavedArgs.match(eq(testAttemptAlarmName)), |
| + alarmsGetSavedArgs.match(ANYTHING)). |
| + will(invokeCallback(alarmsGetSavedArgs, 1, undefined)); |
| + this.mockLocalFunctions.expects(once()).isRunningCallback(false); |
| + // Invocation. |
| + test.attempts.isRunning( |
| + this.mockLocalFunctions.functions().isRunningCallback); |
| + Mock4JS.verifyAllMocks(); |
| + |
| + // Step 2. Start attempt manager with no parameters. |
| + // Expectations. |
| + var expectedRetryDelaySeconds = |
| + testInitialDelaySeconds * (1 + testRandomValue * 0.2); |
| + this.mockApis.expects(once()).chrome_alarms_create( |
| + testAttemptAlarmName, |
| + eqJSON({ |
| + delayInMinutes: expectedRetryDelaySeconds / 60, |
| + periodInMinutes: testMaximumDelaySeconds / 60 |
| + })); |
| + this.mockApis.expects(once()).chrome_storage_local_set( |
| + eqJSON(createTestAttempStorageEntry(expectedRetryDelaySeconds))); |
| + // Invocation. |
| + test.attempts.start(); |
| + Mock4JS.verifyAllMocks(); |
| + |
| + // Step 3. Check that attempt manager is running. |
| + // Expectations. |
| + alarmsGetSavedArgs = new SaveMockArguments(); |
| + this.mockApis.expects(once()). |
| + instrumented_alarms_get( |
| + alarmsGetSavedArgs.match(eq(testAttemptAlarmName)), |
| + alarmsGetSavedArgs.match(ANYTHING)). |
| + will(invokeCallback(alarmsGetSavedArgs, 1, {testField: 'TEST VALUE'})); |
| + this.mockLocalFunctions.expects(once()).isRunningCallback(true); |
| + // Invocation. |
| + test.attempts.isRunning( |
| + this.mockLocalFunctions.functions().isRunningCallback); |
| + Mock4JS.verifyAllMocks(); |
| + |
| + // Step 4. Stop task manager. |
| + // Expectations. |
| + this.mockApis.expects(once()).chrome_alarms_clear(testAttemptAlarmName); |
| + this.mockApis.expects(once()).chrome_storage_local_remove( |
| + testAttemptStorageKey); |
| + // Invocation. |
| + test.attempts.stop(); |
| +}); |
| + |
| +TEST_F( |
| + 'GoogleNowUtilityUnitTest', |
| + 'AttemptManagerStartWithDelayParam', |
| + function() { |
| + // Tests starting an attempt manager with a delay parameter. |
| + |
| + // Setup. |
| + var test = setupAttemptManagerTest(this); |
| + var testFirstDelaySeconds = 1039; |
| + |
| + // Starting attempt manager with a parameter specifying first delay. |
| + // Expectations. |
| + this.mockApis.expects(once()).chrome_alarms_create( |
| + testAttemptAlarmName, |
| + eqJSON({ |
| + delayInMinutes: testFirstDelaySeconds / 60, |
| + periodInMinutes: testMaximumDelaySeconds / 60 |
| + })); |
| + this.mockApis.expects(once()).chrome_storage_local_remove( |
| + testAttemptStorageKey); |
| + // Invocation. |
| + test.attempts.start(testFirstDelaySeconds); |
| +}); |
| + |
| +TEST_F('GoogleNowUtilityUnitTest', 'AttemptManagerExponGrowth', function() { |
| + // Tests that retry time grows exponentially. We don't need to check the case |
| + // of growing more than once, since the object doesn't have state, and the |
| + // test checks all its inputs and outputs of the tested code. |
| + |
| + // Setup. |
| + var test = setupAttemptManagerTest(this); |
| + var testStoredRetryDelay = 433; |
| + |
| + // Call planForNext, which prepares next attempt. Current retry time |
| + // is less than 1/2 of the maximum delay. |
| + // Expectations. |
| + var expectedRetryDelaySeconds = |
| + testStoredRetryDelay * 2 * (1 + testRandomValue * 0.2); |
| + var storageGetSavedArgs = new SaveMockArguments(); |
| + this.mockApis.expects(once()).instrumented_storage_local_get( |
| + storageGetSavedArgs.match(eq(testAttemptStorageKey)), |
| + storageGetSavedArgs.match(ANYTHING)). |
| + will(invokeCallback( |
| + storageGetSavedArgs, |
| + 1, |
| + createTestAttempStorageEntry(testStoredRetryDelay))); |
| + this.mockApis.expects(once()).chrome_alarms_create( |
| + testAttemptAlarmName, |
| + eqJSON({ |
| + delayInMinutes: expectedRetryDelaySeconds / 60, |
| + periodInMinutes: testMaximumDelaySeconds / 60})); |
| + this.mockApis.expects(once()).chrome_storage_local_set( |
| + eqJSON(createTestAttempStorageEntry(expectedRetryDelaySeconds))); |
| + this.mockLocalFunctions.expects(once()).planForNextCallback(); |
| + // Invocation. |
| + test.attempts.planForNext( |
| + this.mockLocalFunctions.functions().planForNextCallback); |
| +}); |
| + |
| +TEST_F('GoogleNowUtilityUnitTest', 'AttemptManagerGrowthLimit', function() { |
| + // Tests that retry time stops growing at the maximum value. |
| + |
| + // Setup. |
| + var test = setupAttemptManagerTest(this); |
| + var testStoredRetryDelay = 1500; |
| + |
| + // Call planForNext, which prepares next attempt. Current retry time |
| + // is greater than 1/2 of the maximum delay. |
| + // Expectations. |
| + var expectedRetryDelaySeconds = testMaximumDelaySeconds; |
| + var storageGetSavedArgs = new SaveMockArguments(); |
| + this.mockApis.expects(once()). |
| + instrumented_storage_local_get( |
| + storageGetSavedArgs.match(eq(testAttemptStorageKey)), |
| + storageGetSavedArgs.match(ANYTHING)). |
| + will(invokeCallback( |
| + storageGetSavedArgs, |
| + 1, |
| + createTestAttempStorageEntry(testStoredRetryDelay))); |
| + this.mockApis.expects(once()).chrome_alarms_create( |
| + testAttemptAlarmName, |
| + eqJSON({ |
| + delayInMinutes: expectedRetryDelaySeconds / 60, |
| + periodInMinutes: testMaximumDelaySeconds / 60 |
| + })); |
| + this.mockApis.expects(once()).chrome_storage_local_set( |
| + eqJSON(createTestAttempStorageEntry(expectedRetryDelaySeconds))); |
| + this.mockLocalFunctions.expects(once()).planForNextCallback(); |
| + // Invocation. |
| + test.attempts.planForNext( |
| + this.mockLocalFunctions.functions().planForNextCallback); |
| +}); |
| + |
| +TEST_F('GoogleNowUtilityUnitTest', 'AttemptManagerAlarm', function() { |
| + // Tests that firing the alarm invokes the attempt. |
| + |
| + // Setup. |
| + var test = setupAttemptManagerTest(this); |
| + var onAlarmHandlerContainer = getMockHandlerContainer('alarms.onAlarm'); |
| + assertEquals(1, onAlarmHandlerContainer.length); |
| + |
| + // Fire the alarm and check that this invokes the attempt callback. |
| + // Expectations. |
| + var alarmsGetSavedArgs = new SaveMockArguments(); |
| + this.mockApis.expects(once()). |
| + instrumented_alarms_get( |
| + alarmsGetSavedArgs.match(eq(testAttemptAlarmName)), |
| + alarmsGetSavedArgs.match(ANYTHING)). |
| + will(invokeCallback(alarmsGetSavedArgs, 1, {testField: 'TEST VALUE'})); |
| + this.mockLocalFunctions.expects(once()).attempt(); |
| + // Invocation. |
| + onAlarmHandlerContainer[0]({name: testAttemptAlarmName}); |
| +}); |