gecko-dev/netwerk/test/unit_ipc/test_app_offline_notifications.js
Valentin Gosu b763fbe8d8 Bug 1057689 - Add xpcshell test checking correct notifications and app-offline state r=jduell
Changes NeckoParent to send the ipdl message if !UsingNeckoIPCSecurity() because xpcshell tests don't have TabParents.

MozReview-Commit-ID: F50WXzg3TIA
2014-09-01 17:29:28 +03:00

103 lines
3.3 KiB
JavaScript

// Checks that app-offline notifications are received in both the parent
// and the child process, and that after receiving the notification
// isAppOffline returns the correct value
Cu.import("resource://testing-common/httpd.js");
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
var test_index = 0;
var APP_ID = 42;
var events_observed_no = 0;
function set_app_offline(appId, offline) {
let ioservice = Cc['@mozilla.org/network/io-service;1'].
getService(Ci.nsIIOService);
ioservice.setAppOffline(appId, offline);
}
function is_app_offline(appId) {
let ioservice = Cc['@mozilla.org/network/io-service;1'].
getService(Ci.nsIIOService);
return ioservice.isAppOffline(appId);
}
// The expected offline status after running each function,
// and the next function that should be run.
// test0 test1 test2 test3 test4
let expected_offline = [ false, true, true, false, false];
let callbacks = [ test1, test2, test3, test4, finished];
function observer(aSubject, aTopic, aData) {
events_observed_no++;
let info = aSubject.QueryInterface(Ci.nsIAppOfflineInfo);
dump("ParentObserver - subject: {" + aSubject.appId + ", " + aSubject.mode + "} " +
"topic: " + aTopic + "\n");
// Check that the correct offline status is in place
do_check_eq(is_app_offline(APP_ID), expected_offline[test_index]);
// Execute the callback for the current test
do_execute_soon(callbacks[test_index]);
}
function run_test() {
Services.obs.addObserver(observer, "network:app-offline-status-changed", false);
test_index = 0;
do_check_eq(is_app_offline(APP_ID), expected_offline[test_index]) // The app should be online at first
run_test_in_child("child_app_offline_notifications.js", test0);
}
// Check that the app is online by default in the child
function test0() {
dump("parent: RUNNING: test0\n");
test_index = 0;
sendCommand('check_status('+APP_ID+','+Ci.nsIAppOfflineInfo.ONLINE+');\n', test1);
}
// Set the app OFFLINE
// Check that the notification is emmited in the parent process
// The observer function will execute test2 which does the check in the child
function test1() {
dump("parent: RUNNING: test1\n");
test_index = 1;
set_app_offline(APP_ID, Ci.nsIAppOfflineInfo.OFFLINE);
}
// Checks that child process sees the app OFFLINE
function test2() {
dump("parent: RUNNING: test2\n");
test_index = 2;
sendCommand('check_notification_and_status('+APP_ID+','+Ci.nsIAppOfflineInfo.OFFLINE+');\n', test3);
}
// Set the app ONLINE
// Chech that the notification is received in the parent
// The observer function will execute test3 and do the check in the child
function test3() {
dump("parent: RUNNING: test3\n");
test_index = 3;
set_app_offline(APP_ID, Ci.nsIAppOfflineInfo.ONLINE);
}
// Chech that the app is back online
function test4() {
dump("parent: RUNNING: test4\n");
test_index = 4;
sendCommand('check_notification_and_status('+APP_ID+','+Ci.nsIAppOfflineInfo.ONLINE+');\n', function() {
// Send command to unregister observer on the child
sendCommand('finished();\n', finished);
});
}
// Remove observer and end test
function finished() {
dump("parent: RUNNING: finished\n");
Services.obs.removeObserver(observer, "network:app-offline-status-changed");
do_check_eq(events_observed_no, 2);
do_test_finished();
}