diff options
Diffstat (limited to 'toolkit/mozapps/extensions/test/xpcshell/test_bug587088.js')
-rw-r--r-- | toolkit/mozapps/extensions/test/xpcshell/test_bug587088.js | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_bug587088.js b/toolkit/mozapps/extensions/test/xpcshell/test_bug587088.js new file mode 100644 index 0000000000..86fc4edbc9 --- /dev/null +++ b/toolkit/mozapps/extensions/test/xpcshell/test_bug587088.js @@ -0,0 +1,195 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// This test is currently dead code. +/* eslint-disable */ + +// Tests that trying to upgrade or uninstall an extension that has a file locked +// will roll back the upgrade or uninstall and retry at the next restart + +const profileDir = gProfD.clone(); +profileDir.append("extensions"); + +const ADDONS = [ + { + "install.rdf": { + "id": "addon1@tests.mozilla.org", + "version": "1.0", + "name": "Bug 587088 Test", + "targetApplications": [ + { + "id": "xpcshell@tests.mozilla.org", + "minVersion": "1", + "maxVersion": "1" + } + ] + }, + "testfile": "", + "testfile1": "", + }, + + { + "install.rdf": { + "id": "addon1@tests.mozilla.org", + "version": "2.0", + "name": "Bug 587088 Test", + "targetApplications": [ + { + "id": "xpcshell@tests.mozilla.org", + "minVersion": "1", + "maxVersion": "1" + } + ] + }, + "testfile": "", + "testfile2": "", + }, +]; + +add_task(async function setup() { + // This is only an issue on windows. + if (!("nsIWindowsRegKey" in Ci)) + return; + + do_test_pending(); + createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); +}); + +function check_addon(aAddon, aVersion) { + Assert.notEqual(aAddon, null); + Assert.equal(aAddon.version, aVersion); + Assert.ok(aAddon.isActive); + Assert.ok(isExtensionInAddonsList(profileDir, aAddon.id)); + + Assert.ok(aAddon.hasResource("testfile")); + if (aVersion == "1.0") { + Assert.ok(aAddon.hasResource("testfile1")); + Assert.ok(!aAddon.hasResource("testfile2")); + } else { + Assert.ok(!aAddon.hasResource("testfile1")); + Assert.ok(aAddon.hasResource("testfile2")); + } + + Assert.equal(aAddon.pendingOperations, AddonManager.PENDING_NONE); +} + +function check_addon_upgrading(aAddon) { + Assert.notEqual(aAddon, null); + Assert.equal(aAddon.version, "1.0"); + Assert.ok(aAddon.isActive); + Assert.ok(isExtensionInAddonsList(profileDir, aAddon.id)); + + Assert.ok(aAddon.hasResource("testfile")); + Assert.ok(aAddon.hasResource("testfile1")); + Assert.ok(!aAddon.hasResource("testfile2")); + + Assert.equal(aAddon.pendingOperations, AddonManager.PENDING_UPGRADE); + + Assert.equal(aAddon.pendingUpgrade.version, "2.0"); +} + +function check_addon_uninstalling(aAddon, aAfterRestart) { + Assert.notEqual(aAddon, null); + Assert.equal(aAddon.version, "1.0"); + + if (aAfterRestart) { + Assert.ok(!aAddon.isActive); + Assert.ok(!isExtensionInAddonsList(profileDir, aAddon.id)); + } else { + Assert.ok(aAddon.isActive); + Assert.ok(isExtensionInAddonsList(profileDir, aAddon.id)); + } + + Assert.ok(aAddon.hasResource("testfile")); + Assert.ok(aAddon.hasResource("testfile1")); + Assert.ok(!aAddon.hasResource("testfile2")); + + Assert.equal(aAddon.pendingOperations, AddonManager.PENDING_UNINSTALL); +} + +add_task(async function test_1() { + await AddonTestUtils.promiseInstallXPI(ADDONS[0]); + + await promiseRestartManager(); + + let a1 = await AddonManager.getAddonByID("addon1@tests.mozilla.org"); + check_addon(a1, "1.0"); + + // Lock either install.rdf for unpacked add-ons or the xpi for packed add-ons. + let uri = a1.getResourceURI("install.rdf"); + if (uri instanceof Ci.nsIJARURI) + uri = uri.JARFile; + + let fstream = Cc["@mozilla.org/network/file-input-stream;1"]. + createInstance(Ci.nsIFileInputStream); + fstream.init(uri.QueryInterface(Ci.nsIFileURL).file, -1, 0, 0); + + await AddonTestUtils.promiseInstallXPI(ADDONS[1]); + + check_addon_upgrading(a1); + + await promiseRestartManager(); + + let a1_2 = await AddonManager.getAddonByID("addon1@tests.mozilla.org"); + check_addon_upgrading(a1_2); + + await promiseRestartManager(); + + let a1_3 = await AddonManager.getAddonByID("addon1@tests.mozilla.org"); + check_addon_upgrading(a1_3); + + fstream.close(); + + await promiseRestartManager(); + + let a1_4 = await AddonManager.getAddonByID("addon1@tests.mozilla.org"); + check_addon(a1_4, "2.0"); + + await a1_4.uninstall(); +}); + +// Test that a failed uninstall gets rolled back +add_task(async function test_2() { + await promiseRestartManager(); + + await AddonTestUtils.promiseInstallXPI(ADDONS[0]); + await promiseRestartManager(); + + let a1 = await AddonManager.getAddonByID("addon1@tests.mozilla.org"); + check_addon(a1, "1.0"); + + // Lock either install.rdf for unpacked add-ons or the xpi for packed add-ons. + let uri = a1.getResourceURI("install.rdf"); + if (uri instanceof Ci.nsIJARURI) + uri = uri.JARFile; + + let fstream = Cc["@mozilla.org/network/file-input-stream;1"]. + createInstance(Ci.nsIFileInputStream); + fstream.init(uri.QueryInterface(Ci.nsIFileURL).file, -1, 0, 0); + + await a1.uninstall(); + + check_addon_uninstalling(a1); + + await promiseRestartManager(); + + let a1_2 = await AddonManager.getAddonByID("addon1@tests.mozilla.org"); + check_addon_uninstalling(a1_2, true); + + await promiseRestartManager(); + + let a1_3 = await AddonManager.getAddonByID("addon1@tests.mozilla.org"); + check_addon_uninstalling(a1_3, true); + + fstream.close(); + + await promiseRestartManager(); + + let a1_4 = await AddonManager.getAddonByID("addon1@tests.mozilla.org"); + Assert.equal(a1_4, null); + var dir = profileDir.clone(); + dir.append(do_get_expected_addon_name("addon1@tests.mozilla.org")); + Assert.ok(!dir.exists()); + Assert.ok(!isExtensionInAddonsList(profileDir, "addon1@tests.mozilla.org")); +}); |