blob: cc8e2da5f17e754700587b2aa4fbec7afcc80a2c [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// TODO(robliao,vadimt): Determine the granularity of testing to perform.
/**
* Test fixture for background.js.
* @constructor
* @extends {testing.Test}
*/
function GoogleNowBackgroundUnitTest () {
testing.Test.call(this);
}
GoogleNowBackgroundUnitTest.prototype = {
__proto__: testing.Test.prototype,
/** @override */
extraLibraries: [
'common_test_util.js',
'background_test_util.js',
'background.js'
]
};
TEST_F('GoogleNowBackgroundUnitTest', 'AreTasksConflicting', function() {
function testTaskPair(newTaskName, scheduledTaskName, expected) {
assertTrue(areTasksConflicting(newTaskName, scheduledTaskName) == expected,
'(' + newTaskName + ', ' + scheduledTaskName + ')');
}
testTaskPair(UPDATE_CARDS_TASK_NAME, UPDATE_CARDS_TASK_NAME, true);
testTaskPair(UPDATE_CARDS_TASK_NAME, DISMISS_CARD_TASK_NAME, false);
testTaskPair(UPDATE_CARDS_TASK_NAME, RETRY_DISMISS_TASK_NAME, false);
testTaskPair(UPDATE_CARDS_TASK_NAME, STATE_CHANGED_TASK_NAME, false);
testTaskPair(DISMISS_CARD_TASK_NAME, UPDATE_CARDS_TASK_NAME, false);
testTaskPair(DISMISS_CARD_TASK_NAME, DISMISS_CARD_TASK_NAME, false);
testTaskPair(DISMISS_CARD_TASK_NAME, RETRY_DISMISS_TASK_NAME, false);
testTaskPair(DISMISS_CARD_TASK_NAME, STATE_CHANGED_TASK_NAME, false);
testTaskPair(RETRY_DISMISS_TASK_NAME, UPDATE_CARDS_TASK_NAME, true);
testTaskPair(RETRY_DISMISS_TASK_NAME, DISMISS_CARD_TASK_NAME, true);
testTaskPair(RETRY_DISMISS_TASK_NAME, RETRY_DISMISS_TASK_NAME, true);
testTaskPair(RETRY_DISMISS_TASK_NAME, STATE_CHANGED_TASK_NAME, false);
testTaskPair(STATE_CHANGED_TASK_NAME, UPDATE_CARDS_TASK_NAME, false);
testTaskPair(STATE_CHANGED_TASK_NAME, DISMISS_CARD_TASK_NAME, false);
testTaskPair(STATE_CHANGED_TASK_NAME, RETRY_DISMISS_TASK_NAME, false);
testTaskPair(STATE_CHANGED_TASK_NAME, STATE_CHANGED_TASK_NAME, false);
});
var testNotificationId = 'TEST GROUP-SOME TEST ID';
var testChromeNotificationId = 'TEST CARD ID';
var testNotification1 =
{testNotificationField: 'TEST NOTIFICATION VALUE1', priority: -1};
var testNotification2 =
{testNotificationField: 'TEST NOTIFICATION VALUE2', priority: 0};
var testActionUrls1 = {testField: 'TEST VALUE1'};
var testActionUrls2 = {testField: 'TEST VALUE2'};
var testDismissal1 = {testDismissalField: 'TEST DISMISSAL VALUE 1'};
var testDismissal2 = {testDismissalField: 'TEST DISMISSAL VALUE 2'};
var testVersion = 7;
var testTimestamp1 = 300000;
var testTimestamp2 = 600000;
var testGroupRank1 = 19;
var testGroupRank2 = 23;
var testTriggerUnmerged = {showTimeSec: 100, hideTimeSec: 200};
var testTriggerMerged = {showTime: 300007, hideTime: 300011};
var testVersion1 = 29;
var testVersion2 = 31;
TEST_F(
'GoogleNowBackgroundUnitTest',
'MergeCardsEmptyNoTrigger',
function() {
// Tests merging a card with an empty trigger into an 'undefined' merged
// card. This should start a new card.
// Invoking the tested function.
var resultingMergedCard = mergeCards(undefined, {
notificationId: testNotificationId,
chromeNotificationId: testChromeNotificationId,
version: testVersion1,
chromeNotificationOptions: testNotification1,
actionUrls: testActionUrls1,
dismissal: testDismissal1
}, testTimestamp1, testGroupRank1);
// Check the return value.
assertEquals(
JSON.stringify({
dismissals: [
{
notificationId: testNotificationId,
parameters: testDismissal1
}
],
groupRank: testGroupRank1,
trigger: {},
timestamp: testTimestamp1,
notification: testNotification1,
actionUrls: testActionUrls1,
version: testVersion1
}),
JSON.stringify(resultingMergedCard));
});
TEST_F(
'GoogleNowBackgroundUnitTest',
'MergeCards1',
function() {
// Tests merging a unmerged card into a merged card.
// Unmerged card priority is greater than merged card one. Unmerged card
// rank is less than merged card one, and it's older.
// Setup.
var mergedCard = {
trigger: testTriggerMerged,
version: testVersion1,
timestamp: testTimestamp2,
notification: testNotification1,
actionUrls: testActionUrls1,
groupRank: testGroupRank2,
dismissals:
[{notificationId: testNotificationId, parameters: testDismissal1}]
};
var unmergedNotification = {
notificationId: testNotificationId,
chromeNotificationId: testChromeNotificationId,
version: testVersion2,
chromeNotificationOptions: testNotification2,
actionUrls: testActionUrls2,
dismissal: testDismissal2,
trigger: testTriggerUnmerged
};
// Invoking the tested function.
var resultingMergedCard = mergeCards(
mergedCard, unmergedNotification, testTimestamp1, testGroupRank1);
// Check the return value.
assertEquals(
JSON.stringify({
trigger: testTriggerMerged,
version: testVersion1,
timestamp: testTimestamp2,
notification: {
testNotificationField: 'TEST NOTIFICATION VALUE1',
priority: 0
},
actionUrls: testActionUrls1,
groupRank: testGroupRank2,
dismissals: [
{notificationId: testNotificationId, parameters: testDismissal1},
{notificationId: testNotificationId, parameters: testDismissal2}
]
}),
JSON.stringify(resultingMergedCard));
});
TEST_F(
'GoogleNowBackgroundUnitTest',
'MergeCards2',
function() {
// Tests merging a unmerged card into a merged card.
// Unmerged card priority is less than merged card one. Unmerged card rank
// is greater than merged card one, and it's older.
// Setup.
var mergedCard = {
trigger: testTriggerMerged,
version: testVersion1,
timestamp: testTimestamp2,
notification: testNotification2,
actionUrls: testActionUrls1,
groupRank: testGroupRank1,
dismissals:
[{notificationId: testNotificationId, parameters: testDismissal1}]
};
var unmergedNotification = {
notificationId: testNotificationId,
chromeNotificationId: testChromeNotificationId,
version: testVersion2,
chromeNotificationOptions: testNotification1,
actionUrls: testActionUrls2,
dismissal: testDismissal2,
trigger: testTriggerUnmerged
};
// Invoking the tested function.
var resultingMergedCard = mergeCards(
mergedCard, unmergedNotification, testTimestamp1, testGroupRank2);
// Check the return value.
assertEquals(
JSON.stringify({
trigger: {showTime: 400000, hideTime: 500000},
version: testVersion1,
timestamp: testTimestamp2,
notification: {
testNotificationField: 'TEST NOTIFICATION VALUE2',
priority: 0
},
actionUrls: testActionUrls1,
groupRank: testGroupRank2,
dismissals: [
{notificationId: testNotificationId, parameters: testDismissal1},
{notificationId: testNotificationId, parameters: testDismissal2}
]
}),
JSON.stringify(resultingMergedCard));
});
TEST_F(
'GoogleNowBackgroundUnitTest',
'MergeCards3',
function() {
// Tests merging a unmerged card into a merged card.
// Unmerged card priority is less than merged card one. Unmerged card rank
// is less than merged card one, and it's newer.
// Setup.
var mergedCard = {
trigger: testTriggerMerged,
version: testVersion1,
timestamp: testTimestamp1,
notification: testNotification2,
actionUrls: testActionUrls1,
groupRank: testGroupRank2,
dismissals:
[{notificationId: testNotificationId, parameters: testDismissal1}]
};
var unmergedNotification = {
notificationId: testNotificationId,
chromeNotificationId: testChromeNotificationId,
version: testVersion2,
chromeNotificationOptions: testNotification1,
actionUrls: testActionUrls2,
dismissal: testDismissal2,
trigger: testTriggerUnmerged
};
// Invoking the tested function.
var resultingMergedCard = mergeCards(
mergedCard, unmergedNotification, testTimestamp2, testGroupRank1);
// Check the return value.
assertEquals(
JSON.stringify({
trigger: testTriggerMerged,
version: testVersion2,
timestamp: testTimestamp2,
notification: {
testNotificationField: 'TEST NOTIFICATION VALUE1',
priority: 0
},
actionUrls: testActionUrls2,
groupRank: testGroupRank2,
dismissals: [
{notificationId: testNotificationId, parameters: testDismissal1},
{notificationId: testNotificationId, parameters: testDismissal2}
]
}),
JSON.stringify(resultingMergedCard));
});
TEST_F(
'GoogleNowBackgroundUnitTest',
'MergeGroup',
function() {
// Tests mergeGroup method.
// Setup.
this.makeAndRegisterMockGlobals(['mergeCards']);
this.mockGlobals.expects(once()).
mergeCards(
undefined,
eqJSON({chromeNotificationId: 'ID 1', testField: 'TEST_FIELD1'}),
300000,
17).
will(returnValue({testField: 'RESULT 1'}));
this.mockGlobals.expects(once()).
mergeCards(
eqJSON({testField: 'TEST_FIELD22'}),
eqJSON({chromeNotificationId: 'ID 2', testField: 'TEST_FIELD2'}),
300000,
17).
will(returnValue({testField: 'RESULT 2'}));
var group = {
cards: [
{chromeNotificationId: 'ID 1', testField: 'TEST_FIELD1'},
{chromeNotificationId: 'ID 2', testField: 'TEST_FIELD2'}
],
cardsTimestamp: 300000,
nextPollTime: 600000,
rank: 17
};
var mergedCards = {
'ID 2': { testField: 'TEST_FIELD22' },
'ID 3': { testField: 'TEST_FIELD3' }
};
// Invoking the tested function.
mergeGroup(mergedCards, group);
// Check the output parameter.
assertEquals(
JSON.stringify({
'ID 2': { testField: 'RESULT 2' },
'ID 3': { testField: 'TEST_FIELD3'},
'ID 1': { testField: 'RESULT 1' }}),
JSON.stringify(mergedCards));
});
TEST_F(
'GoogleNowBackgroundUnitTest',
'MergeAndShowNotificationCards',
function() {
// Tests mergeAndShowNotificationCards function.
// The test passes 2 groups to mergeAndShowNotificationCards, checks that
// it calls mergeGroup() for each of these groups and calls
// showNotificationCards() with the results of these mergeGroup() calls.
// Setup and expectations.
var testGroups = {
'TEST GROUP 1': {testField: 'TEST VALUE 1'},
'TEST GROUP 2': {testField: 'TEST VALUE 2'}
};
this.makeAndRegisterMockGlobals(['mergeGroup', 'showNotificationCards']);
var mergeGroupSavedArgs = new SaveMockArguments();
this.mockGlobals.expects(once()).
mergeGroup(
mergeGroupSavedArgs.match(eqJSON({})),
mergeGroupSavedArgs.match(eqJSON({testField: 'TEST VALUE 1'}))).
will(callFunction(function() {
mergeGroupSavedArgs.arguments[0].card1 = {
testValue: 'TEST CARD VALUE 1'
};
}));
this.mockGlobals.expects(once()).
mergeGroup(
mergeGroupSavedArgs.match(
eqJSON({card1: {testValue: 'TEST CARD VALUE 1'}})),
mergeGroupSavedArgs.match(
eqJSON({testField: 'TEST VALUE 2'}))).
will(callFunction(function() {
mergeGroupSavedArgs.arguments[0].card2 = {
testValue: 'TEST CARD VALUE 2'
};
}));
this.mockGlobals.expects(once()).
showNotificationCards(eqJSON({
card1: {testValue: 'TEST CARD VALUE 1'},
card2: {testValue: 'TEST CARD VALUE 2'}
}));
// Invoking the tested function.
mergeAndShowNotificationCards(testGroups);
});
// TODO(vadimt): Add more tests for parseAndShowNotificationCards().
TEST_F(
'GoogleNowBackgroundUnitTest',
'ParseAndShowNotificationCardsAdd1Remove1',
function() {
// Tests parseAndShowNotificationCards function for the case when the
// extension has 2 groups, and the server sends update with 2 groups, one
// of which is new, and another one matches a stored group. The client
// has to delete the group that didn't receive an update, keep the
// existing group that received an update, and add a new stored group for
// the new group from the server.
// Setup and expectations.
var serverResponse = {
groups: {
GROUP1: {},
GROUP2: {}
}
};
var storedGroups = {
GROUP2: {
cards: ['c2'],
cardsTimestamp: 239,
nextPollTime: 10000,
rank: 1
},
GROUP3: {
cards: ['c3'],
cardsTimestamp: 240,
nextPollTime: 10001,
rank: 2
}
};
var expectedUpdatedGroups = {
GROUP1: {
cards: []
},
GROUP2: {
cards: ['c2'],
cardsTimestamp: 239,
nextPollTime: 10000,
rank: 1
}
};
this.makeAndRegisterMockGlobals(
['scheduleNextPoll', 'mergeAndShowNotificationCards', 'recordEvent']);
this.makeAndRegisterMockApis([
'chrome.storage.local.set',
'instrumented.storage.local.get'
]);
var storageGetSavedArgs = new SaveMockArguments();
this.mockApis.expects(once()).
instrumented_storage_local_get(
storageGetSavedArgs.match(eq('notificationGroups')),
storageGetSavedArgs.match(ANYTHING)).
will(invokeCallback(
storageGetSavedArgs, 1, {notificationGroups: storedGroups}));
this.mockGlobals.expects(once()).
scheduleNextPoll(eqJSON(expectedUpdatedGroups));
this.mockApis.expects(once()).
chrome_storage_local_set(
eqJSON({notificationGroups: expectedUpdatedGroups}));
this.mockGlobals.expects(once()).
mergeAndShowNotificationCards(eqJSON(expectedUpdatedGroups));
this.mockGlobals.expects(once()).
recordEvent(GoogleNowEvent.CARDS_PARSE_SUCCESS);
// Invoking the tested function.
parseAndShowNotificationCards(JSON.stringify(serverResponse));
});
/**
* Mocks global functions and APIs that initialize() depends upon.
* @param {Test} fixture Test fixture.
*/
function mockInitializeDependencies(fixture) {
fixture.makeAndRegisterMockGlobals([
'recordEvent',
'setBackgroundEnable',
'startPollingCards'
]);
fixture.makeAndRegisterMockApis([
'authenticationManager.isSignedIn',
'chrome.location.clearWatch',
'chrome.storage.local.remove',
'instrumented.metricsPrivate.getVariationParams',
'instrumented.notifications.getAll',
'instrumented.notifications.getPermissionLevel',
'instrumented.preferencesPrivate.googleGeolocationAccessEnabled.get',
'instrumented.storage.local.get',
'tasks.add',
'updateCardsAttempts.isRunning',
'updateCardsAttempts.stop'
]);
}
/**
* Sets up the test to expect the state machine calls and send
* the specified state machine state. Currently used to test initialize().
* Note that this CAN NOT be used if any of the methods below are called
* outside of this context with the same argument matchers.
* expects() calls cannot be chained with the same argument matchers.
* @param {object} fixture Test fixture.
* @param {string} testIdentityToken getAuthToken callback token.
* @param {boolean} testGeolocationPref Geolocation Preference callback value.
* @param {object} testExperimentVariationParams Response of
* metricsPrivate.getVariationParams.
* @param {string} testExperimentVariationParams Response of
* notifications.getPermissionLevel.
*/
function expectStateMachineCalls(
fixture,
testIdentityToken,
testGeolocationPref,
testExperimentVariationParams,
testNotificationPermissionLevel) {
var authenticationManagerIsSignedInSavedArgs = new SaveMockArguments();
fixture.mockApis.expects(once()).
authenticationManager_isSignedIn(
authenticationManagerIsSignedInSavedArgs.match(ANYTHING)).
will(invokeCallback(
authenticationManagerIsSignedInSavedArgs,
0,
testIdentityToken));
var getVariationParamsSavedArgs = new SaveMockArguments();
fixture.mockApis.expects(once()).
instrumented_metricsPrivate_getVariationParams(
getVariationParamsSavedArgs.match(ANYTHING),
getVariationParamsSavedArgs.match(ANYTHING)).
will(invokeCallback(
getVariationParamsSavedArgs, 1, testExperimentVariationParams));
var googleGeolocationPrefGetSavedArgs = new SaveMockArguments();
fixture.mockApis.expects(once()).
instrumented_preferencesPrivate_googleGeolocationAccessEnabled_get(
googleGeolocationPrefGetSavedArgs.match(eqJSON({})),
googleGeolocationPrefGetSavedArgs.match(ANYTHING)).
will(invokeCallback(
googleGeolocationPrefGetSavedArgs, 1, {value: testGeolocationPref}));
var notificationGetPermissionLevelSavedArgs = new SaveMockArguments();
fixture.mockApis.expects(once()).
instrumented_notifications_getPermissionLevel(
notificationGetPermissionLevelSavedArgs.match(ANYTHING)).
will(invokeCallback(
notificationGetPermissionLevelSavedArgs,
0,
testNotificationPermissionLevel))
fixture.mockGlobals.expects(once()).
setBackgroundEnable(ANYTHING);
}
/**
* Sets up the test to expect the initialization calls that
* initialize() invokes.
* Note that this CAN NOT be used if any of the methods below are called
* outside of this context with the same argument matchers.
* expects() calls cannot be chained with the same argument matchers.
*/
function expectInitialization(mockApisObj) {
var tasksAddSavedArgs = new SaveMockArguments();
mockApisObj.expects(once()).
tasks_add(
tasksAddSavedArgs.match(ANYTHING),
tasksAddSavedArgs.match(ANYTHING)).
will(invokeCallback(tasksAddSavedArgs, 1, function() {}));
var updateCardsAttemptsIsRunningSavedArgs = new SaveMockArguments();
mockApisObj.expects(once()).
updateCardsAttempts_isRunning(
updateCardsAttemptsIsRunningSavedArgs.match(ANYTHING)).
will(
invokeCallback(
updateCardsAttemptsIsRunningSavedArgs, 0, false));
}
TEST_F(
'GoogleNowBackgroundUnitTest',
'Initialize_ToastStateEmpty',
function() {
// Tests the case when getAuthToken fails most likely because the user is
// not signed in. In this case, the function should quietly exit after
// finding out that getAuthToken fails.
// Setup and expectations.
var testIdentityToken = undefined;
var testGeolocationPref = false;
var testExperimentVariationParams = {};
var testNotificationPermissionLevel = 'denied';
mockInitializeDependencies(this);
this.mockGlobals.expects(once()).recordEvent(
GoogleNowEvent.EXTENSION_START);
this.mockGlobals.expects(once()).recordEvent(
GoogleNowEvent.STOPPED);
expectInitialization(this.mockApis);
expectStateMachineCalls(
this,
testIdentityToken,
testGeolocationPref,
testExperimentVariationParams,
testNotificationPermissionLevel);
// Invoking the tested function.
initialize();
});
TEST_F(
'GoogleNowBackgroundUnitTest',
'DISABLED_Initialize_ToastStateEmpty2',
function() {
// Tests the case when getAuthToken succeeds, and the user has never
// responded to the toast.
// In this case, the function should invoke showWelcomeToast().
// Setup and expectations.
var testIdentityToken = 'some identity token';
var testGeolocationPref = false;
var testExperimentVariationParams = {};
var testNotificationPermissionLevel = 'denied';
mockInitializeDependencies(this);
this.mockGlobals.expects(once()).recordEvent(
GoogleNowEvent.EXTENSION_START);
expectInitialization(this.mockApis);
expectStateMachineCalls(
this,
testIdentityToken,
testGeolocationPref,
testExperimentVariationParams,
testNotificationPermissionLevel);
var chromeNotificationGetAllSavedArgs = new SaveMockArguments();
this.mockApis.expects(exactly(1)).
instrumented_notifications_getAll(
chromeNotificationGetAllSavedArgs.match(ANYTHING)).
will(
invokeCallback(chromeNotificationGetAllSavedArgs, 0, {}),
invokeCallback(chromeNotificationGetAllSavedArgs, 0, {}));
// Invoking the tested function.
initialize();
});
TEST_F('GoogleNowBackgroundUnitTest', 'Initialize_RunGoogleNow', function() {
// Tests if Google Now will invoke startPollingCards when all
// of the required state is fulfilled.
// Setup and expectations.
var testIdentityToken = 'some identity token';
var testGeolocationPref = true;
var testExperimentVariationParams = {};
var testNotificationPermissionLevel = 'granted';
mockInitializeDependencies(this);
this.mockGlobals.expects(once()).recordEvent(
GoogleNowEvent.EXTENSION_START);
expectInitialization(this.mockApis);
expectStateMachineCalls(
this,
testIdentityToken,
testGeolocationPref,
testExperimentVariationParams,
testNotificationPermissionLevel);
this.mockGlobals.expects(once()).startPollingCards();
// Invoking the tested function.
initialize();
});
TEST_F(
'GoogleNowBackgroundUnitTest',
'DISABLED_Initialize_NoGeolocation',
function() {
// Tests the case where everything is in place except for the
// Geolocation Preference after the user responded to the toast.
// Setup and expectations.
var testIdentityToken = 'some identity token';
var testGeolocationPref = false;
var testExperimentVariationParams = {};
var testNotificationPermissionLevel = 'denied';
mockInitializeDependencies(this);
this.mockGlobals.expects(once()).recordEvent(
GoogleNowEvent.EXTENSION_START);
this.mockGlobals.expects(once()).recordEvent(
GoogleNowEvent.USER_SUPPRESSED);
expectInitialization(this.mockApis);
expectStateMachineCalls(
this,
testIdentityToken,
testGeolocationPref,
testExperimentVariationParams,
testNotificationPermissionLevel,
testNotificationPermissionLevel);
var chromeNotificationGetAllSavedArgs = new SaveMockArguments();
this.mockApis.expects(exactly(2)).
instrumented_notifications_getAll(
chromeNotificationGetAllSavedArgs.match(ANYTHING)).
will(
invokeCallback(chromeNotificationGetAllSavedArgs, 0, {}),
invokeCallback(chromeNotificationGetAllSavedArgs, 0, {}));
// Invoking the tested function.
initialize();
});
/**
* Mocks global functions and APIs that onNotificationClicked() depends upon.
* @param {Test} fixture Test fixture.
*/
function mockOnNotificationClickedDependencies(fixture) {
fixture.makeAndRegisterMockApis([
'chrome.windows.create',
'chrome.windows.update',
'instrumented.storage.local.get',
'instrumented.tabs.create']);
}
TEST_F(
'GoogleNowBackgroundUnitTest',
'OnNotificationClicked_NoData',
function() {
// Tests the case when there is no data associated with notification id.
// In this case, the function should do nothing.
// Setup and expectations.
var testNotificationId = 'TEST_ID';
var testNotificationData = {};
mockOnNotificationClickedDependencies(this);
this.makeMockLocalFunctions(['selector']);
var storageGetSavedArgs = new SaveMockArguments();
this.mockApis.expects(once()).
instrumented_storage_local_get(
storageGetSavedArgs.match(eq('notificationsData')),
storageGetSavedArgs.match(ANYTHING)).
will(invokeCallback(storageGetSavedArgs, 1, testNotificationData));
// Invoking the tested function.
onNotificationClicked(
testNotificationId, this.mockLocalFunctions.functions().selector);
});
TEST_F(
'GoogleNowBackgroundUnitTest',
'OnNotificationClicked_ActionUrlsUndefined',
function() {
// Tests the case when the data associated with notification id is
// 'undefined'.
// In this case, the function should do nothing.
// Setup and expectations.
var testActionUrls = undefined;
var testNotificationId = 'TEST_ID';
var testNotificationData = {
notificationsData: {'TEST_ID': {actionUrls: testActionUrls}}
};
mockOnNotificationClickedDependencies(this);
this.makeMockLocalFunctions(['selector']);
var storageGetSavedArgs = new SaveMockArguments();
this.mockApis.expects(once()).
instrumented_storage_local_get(
storageGetSavedArgs.match(eq('notificationsData')),
storageGetSavedArgs.match(ANYTHING)).
will(invokeCallback(storageGetSavedArgs, 1, testNotificationData));
this.mockLocalFunctions.expects(once()).selector(undefined).will(
returnValue(undefined));
// Invoking the tested function.
onNotificationClicked(
testNotificationId, this.mockLocalFunctions.functions().selector);
});
TEST_F(
'GoogleNowBackgroundUnitTest',
'OnNotificationClicked_TabCreateSuccess',
function() {
// Tests the selected URL is OK and crome.tabs.create suceeds.
// Setup and expectations.
var testActionUrls = {testField: 'TEST VALUE'};
var testNotificationId = 'TEST_ID';
var testNotificationData = {
notificationsData: {'TEST_ID': {actionUrls: testActionUrls}}
};
var testActionUrl = 'http://testurl.com';
var testCreatedTab = {windowId: 239};
mockOnNotificationClickedDependencies(this);
this.makeMockLocalFunctions(['selector']);
var storageGetSavedArgs = new SaveMockArguments();
this.mockApis.expects(once()).
instrumented_storage_local_get(
storageGetSavedArgs.match(eq('notificationsData')),
storageGetSavedArgs.match(ANYTHING)).
will(invokeCallback(storageGetSavedArgs, 1, testNotificationData));
this.mockLocalFunctions.expects(once()).selector(testActionUrls).will(
returnValue(testActionUrl));
var chromeTabsCreateSavedArgs = new SaveMockArguments();
this.mockApis.expects(once()).
instrumented_tabs_create(
chromeTabsCreateSavedArgs.match(eqJSON({url: testActionUrl})),
chromeTabsCreateSavedArgs.match(ANYTHING)).
will(invokeCallback(chromeTabsCreateSavedArgs, 1, testCreatedTab));
this.mockApis.expects(once()).chrome_windows_update(
testCreatedTab.windowId,
eqJSON({focused: true}));
// Invoking the tested function.
onNotificationClicked(
testNotificationId, this.mockLocalFunctions.functions().selector);
});
TEST_F(
'GoogleNowBackgroundUnitTest',
'OnNotificationClicked_TabCreateFail',
function() {
// Tests the selected URL is OK and crome.tabs.create fails.
// In this case, the function should invoke chrome.windows.create as a
// second attempt.
// Setup and expectations.
var testActionUrls = {testField: 'TEST VALUE'};
var testNotificationId = 'TEST_ID';
var testNotificationData = {
notificationsData: {'TEST_ID': {actionUrls: testActionUrls}}
};
var testActionUrl = 'http://testurl.com';
var testCreatedTab = undefined; // chrome.tabs.create fails
mockOnNotificationClickedDependencies(this);
this.makeMockLocalFunctions(['selector']);
var storageGetSavedArgs = new SaveMockArguments();
this.mockApis.expects(once()).
instrumented_storage_local_get(
storageGetSavedArgs.match(eq('notificationsData')),
storageGetSavedArgs.match(ANYTHING)).
will(invokeCallback(storageGetSavedArgs, 1, testNotificationData));
this.mockLocalFunctions.expects(once()).selector(testActionUrls).will(
returnValue(testActionUrl));
var chromeTabsCreateSavedArgs = new SaveMockArguments();
this.mockApis.expects(once()).
instrumented_tabs_create(
chromeTabsCreateSavedArgs.match(eqJSON({url: testActionUrl})),
chromeTabsCreateSavedArgs.match(ANYTHING)).
will(invokeCallback(chromeTabsCreateSavedArgs, 1, testCreatedTab));
this.mockApis.expects(once()).chrome_windows_create(
eqJSON({url: testActionUrl, focused: true}));
// Invoking the tested function.
onNotificationClicked(
testNotificationId, this.mockLocalFunctions.functions().selector);
});