/* 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")); });