diff options
Diffstat (limited to 'toolkit/mozapps/webextensions/test/xpcshell/test_delay_update.js')
-rw-r--r-- | toolkit/mozapps/webextensions/test/xpcshell/test_delay_update.js | 260 |
1 files changed, 260 insertions, 0 deletions
diff --git a/toolkit/mozapps/webextensions/test/xpcshell/test_delay_update.js b/toolkit/mozapps/webextensions/test/xpcshell/test_delay_update.js new file mode 100644 index 000000000..3d7eef051 --- /dev/null +++ b/toolkit/mozapps/webextensions/test/xpcshell/test_delay_update.js @@ -0,0 +1,260 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// This verifies that delaying an update works + +// The test extension uses an insecure update url. +Services.prefs.setBoolPref("extensions.checkUpdateSecurity", false); + +Components.utils.import("resource://testing-common/httpd.js"); +const profileDir = gProfD.clone(); +profileDir.append("extensions"); +const tempdir = gTmpD.clone(); + +const IGNORE_ID = "test_delay_update_ignore@tests.mozilla.org"; +const COMPLETE_ID = "test_delay_update_complete@tests.mozilla.org"; +const DEFER_ID = "test_delay_update_defer@tests.mozilla.org"; + +const TEST_IGNORE_PREF = "delaytest.ignore"; + +// Note that we would normally use BootstrapMonitor but it currently requires +// the objects in `data` to be serializable, and we need a real reference to the +// `instanceID` symbol to test. + +createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "42"); + +// Create and configure the HTTP server. +let testserver = createHttpServer(); +gPort = testserver.identity.primaryPort; +mapFile("/data/test_delay_updates_complete.rdf", testserver); +mapFile("/data/test_delay_updates_ignore.rdf", testserver); +mapFile("/data/test_delay_updates_defer.rdf", testserver); +testserver.registerDirectory("/addons/", do_get_file("addons")); + +function* createIgnoreAddon() { + writeInstallRDFToDir({ + id: IGNORE_ID, + version: "1.0", + bootstrap: true, + unpack: true, + updateURL: `http://localhost:${gPort}/data/test_delay_updates_ignore.rdf`, + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "1" + }], + name: "Test Delay Update Ignore", + }, profileDir, IGNORE_ID, "bootstrap.js"); + + let unpacked_addon = profileDir.clone(); + unpacked_addon.append(IGNORE_ID); + do_get_file("data/test_delay_update_ignore/bootstrap.js") + .copyTo(unpacked_addon, "bootstrap.js"); +} + +function* createCompleteAddon() { + writeInstallRDFToDir({ + id: COMPLETE_ID, + version: "1.0", + bootstrap: true, + unpack: true, + updateURL: `http://localhost:${gPort}/data/test_delay_updates_complete.rdf`, + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "1" + }], + name: "Test Delay Update Complete", + }, profileDir, COMPLETE_ID, "bootstrap.js"); + + let unpacked_addon = profileDir.clone(); + unpacked_addon.append(COMPLETE_ID); + do_get_file("data/test_delay_update_complete/bootstrap.js") + .copyTo(unpacked_addon, "bootstrap.js"); +} + +function* createDeferAddon() { + writeInstallRDFToDir({ + id: DEFER_ID, + version: "1.0", + bootstrap: true, + unpack: true, + updateURL: `http://localhost:${gPort}/data/test_delay_updates_defer.rdf`, + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "1" + }], + name: "Test Delay Update Defer", + }, profileDir, DEFER_ID, "bootstrap.js"); + + let unpacked_addon = profileDir.clone(); + unpacked_addon.append(DEFER_ID); + do_get_file("data/test_delay_update_defer/bootstrap.js") + .copyTo(unpacked_addon, "bootstrap.js"); +} + +// add-on registers upgrade listener, and ignores update. +add_task(function*() { + + yield createIgnoreAddon(); + + startupManager(); + + let addon = yield promiseAddonByID(IGNORE_ID); + do_check_neq(addon, null); + do_check_eq(addon.version, "1.0"); + do_check_eq(addon.name, "Test Delay Update Ignore"); + do_check_true(addon.isCompatible); + do_check_false(addon.appDisabled); + do_check_true(addon.isActive); + do_check_eq(addon.type, "extension"); + + let update = yield promiseFindAddonUpdates(addon); + let install = update.updateAvailable; + + yield promiseCompleteAllInstalls([install]); + + do_check_eq(install.state, AddonManager.STATE_POSTPONED); + + // addon upgrade has been delayed + let addon_postponed = yield promiseAddonByID(IGNORE_ID); + do_check_neq(addon_postponed, null); + do_check_eq(addon_postponed.version, "1.0"); + do_check_eq(addon_postponed.name, "Test Delay Update Ignore"); + do_check_true(addon_postponed.isCompatible); + do_check_false(addon_postponed.appDisabled); + do_check_true(addon_postponed.isActive); + do_check_eq(addon_postponed.type, "extension"); + do_check_true(Services.prefs.getBoolPref(TEST_IGNORE_PREF)); + + // restarting allows upgrade to proceed + yield promiseRestartManager(); + + let addon_upgraded = yield promiseAddonByID(IGNORE_ID); + do_check_neq(addon_upgraded, null); + do_check_eq(addon_upgraded.version, "2.0"); + do_check_eq(addon_upgraded.name, "Test Delay Update Ignore"); + do_check_true(addon_upgraded.isCompatible); + do_check_false(addon_upgraded.appDisabled); + do_check_true(addon_upgraded.isActive); + do_check_eq(addon_upgraded.type, "extension"); + + yield shutdownManager(); +}); + +// add-on registers upgrade listener, and allows update. +add_task(function*() { + + yield createCompleteAddon(); + + startupManager(); + + let addon = yield promiseAddonByID(COMPLETE_ID); + do_check_neq(addon, null); + do_check_eq(addon.version, "1.0"); + do_check_eq(addon.name, "Test Delay Update Complete"); + do_check_true(addon.isCompatible); + do_check_false(addon.appDisabled); + do_check_true(addon.isActive); + do_check_eq(addon.type, "extension"); + + let update = yield promiseFindAddonUpdates(addon); + let install = update.updateAvailable; + + yield promiseCompleteAllInstalls([install]); + + // upgrade is initially postponed + let addon_postponed = yield promiseAddonByID(COMPLETE_ID); + do_check_neq(addon_postponed, null); + do_check_eq(addon_postponed.version, "1.0"); + do_check_eq(addon_postponed.name, "Test Delay Update Complete"); + do_check_true(addon_postponed.isCompatible); + do_check_false(addon_postponed.appDisabled); + do_check_true(addon_postponed.isActive); + do_check_eq(addon_postponed.type, "extension"); + + // addon upgrade has been allowed + let [addon_allowed] = yield promiseAddonEvent("onInstalled"); + do_check_neq(addon_allowed, null); + do_check_eq(addon_allowed.version, "2.0"); + do_check_eq(addon_allowed.name, "Test Delay Update Complete"); + do_check_true(addon_allowed.isCompatible); + do_check_false(addon_allowed.appDisabled); + do_check_true(addon_allowed.isActive); + do_check_eq(addon_allowed.type, "extension"); + + // restarting changes nothing + yield promiseRestartManager(); + + let addon_upgraded = yield promiseAddonByID(COMPLETE_ID); + do_check_neq(addon_upgraded, null); + do_check_eq(addon_upgraded.version, "2.0"); + do_check_eq(addon_upgraded.name, "Test Delay Update Complete"); + do_check_true(addon_upgraded.isCompatible); + do_check_false(addon_upgraded.appDisabled); + do_check_true(addon_upgraded.isActive); + do_check_eq(addon_upgraded.type, "extension"); + + yield shutdownManager(); +}); + +// add-on registers upgrade listener, initially defers update then allows upgrade +add_task(function*() { + + yield createDeferAddon(); + + startupManager(); + + let addon = yield promiseAddonByID(DEFER_ID); + do_check_neq(addon, null); + do_check_eq(addon.version, "1.0"); + do_check_eq(addon.name, "Test Delay Update Defer"); + do_check_true(addon.isCompatible); + do_check_false(addon.appDisabled); + do_check_true(addon.isActive); + do_check_eq(addon.type, "extension"); + + let update = yield promiseFindAddonUpdates(addon); + let install = update.updateAvailable; + + yield promiseCompleteAllInstalls([install]); + + // upgrade is initially postponed + let addon_postponed = yield promiseAddonByID(DEFER_ID); + do_check_neq(addon_postponed, null); + do_check_eq(addon_postponed.version, "1.0"); + do_check_eq(addon_postponed.name, "Test Delay Update Defer"); + do_check_true(addon_postponed.isCompatible); + do_check_false(addon_postponed.appDisabled); + do_check_true(addon_postponed.isActive); + do_check_eq(addon_postponed.type, "extension"); + + // add-on will not allow upgrade until fake event fires + AddonManagerPrivate.callAddonListeners("onFakeEvent"); + + // addon upgrade has been allowed + let [addon_allowed] = yield promiseAddonEvent("onInstalled"); + do_check_neq(addon_allowed, null); + do_check_eq(addon_allowed.version, "2.0"); + do_check_eq(addon_allowed.name, "Test Delay Update Defer"); + do_check_true(addon_allowed.isCompatible); + do_check_false(addon_allowed.appDisabled); + do_check_true(addon_allowed.isActive); + do_check_eq(addon_allowed.type, "extension"); + + // restarting changes nothing + yield promiseRestartManager(); + + let addon_upgraded = yield promiseAddonByID(DEFER_ID); + do_check_neq(addon_upgraded, null); + do_check_eq(addon_upgraded.version, "2.0"); + do_check_eq(addon_upgraded.name, "Test Delay Update Defer"); + do_check_true(addon_upgraded.isCompatible); + do_check_false(addon_upgraded.appDisabled); + do_check_true(addon_upgraded.isActive); + do_check_eq(addon_upgraded.type, "extension"); + + yield shutdownManager(); +}); |