michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: * http://creativecommons.org/publicdomain/zero/1.0/ michael@0: */ michael@0: michael@0: // Tests that trying to upgrade or uninstall an extension that has a file locked michael@0: // will roll back the upgrade or uninstall and retry at the next restart michael@0: michael@0: const profileDir = gProfD.clone(); michael@0: profileDir.append("extensions"); michael@0: michael@0: function run_test() { michael@0: // This is only an issue on windows. michael@0: if (!("nsIWindowsRegKey" in AM_Ci)) michael@0: return; michael@0: michael@0: do_test_pending(); michael@0: createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); michael@0: michael@0: startupManager(); michael@0: run_test_1(); michael@0: } michael@0: michael@0: function check_addon(aAddon, aVersion) { michael@0: do_check_neq(aAddon, null); michael@0: do_check_eq(aAddon.version, aVersion); michael@0: do_check_true(aAddon.isActive); michael@0: do_check_true(isExtensionInAddonsList(profileDir, aAddon.id)); michael@0: michael@0: do_check_true(aAddon.hasResource("testfile")); michael@0: if (aVersion == "1.0") { michael@0: do_check_true(aAddon.hasResource("testfile1")); michael@0: do_check_false(aAddon.hasResource("testfile2")); michael@0: } michael@0: else { michael@0: do_check_false(aAddon.hasResource("testfile1")); michael@0: do_check_true(aAddon.hasResource("testfile2")); michael@0: } michael@0: michael@0: do_check_eq(aAddon.pendingOperations, AddonManager.PENDING_NONE); michael@0: } michael@0: michael@0: function check_addon_upgrading(aAddon) { michael@0: do_check_neq(aAddon, null); michael@0: do_check_eq(aAddon.version, "1.0"); michael@0: do_check_true(aAddon.isActive); michael@0: do_check_true(isExtensionInAddonsList(profileDir, aAddon.id)); michael@0: michael@0: do_check_true(aAddon.hasResource("testfile")); michael@0: do_check_true(aAddon.hasResource("testfile1")); michael@0: do_check_false(aAddon.hasResource("testfile2")); michael@0: michael@0: do_check_eq(aAddon.pendingOperations, AddonManager.PENDING_UPGRADE); michael@0: michael@0: do_check_eq(aAddon.pendingUpgrade.version, "2.0"); michael@0: } michael@0: michael@0: function check_addon_uninstalling(aAddon, aAfterRestart) { michael@0: do_check_neq(aAddon, null); michael@0: do_check_eq(aAddon.version, "1.0"); michael@0: michael@0: if (aAfterRestart) { michael@0: do_check_false(aAddon.isActive); michael@0: do_check_false(isExtensionInAddonsList(profileDir, aAddon.id)); michael@0: } michael@0: else { michael@0: do_check_true(aAddon.isActive); michael@0: do_check_true(isExtensionInAddonsList(profileDir, aAddon.id)); michael@0: } michael@0: michael@0: do_check_true(aAddon.hasResource("testfile")); michael@0: do_check_true(aAddon.hasResource("testfile1")); michael@0: do_check_false(aAddon.hasResource("testfile2")); michael@0: michael@0: do_check_eq(aAddon.pendingOperations, AddonManager.PENDING_UNINSTALL); michael@0: } michael@0: michael@0: function run_test_1() { michael@0: installAllFiles([do_get_addon("test_bug587088_1")], function() { michael@0: restartManager(); michael@0: michael@0: AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) { michael@0: check_addon(a1, "1.0"); michael@0: michael@0: // Lock either install.rdf for unpacked add-ons or the xpi for packed add-ons. michael@0: let uri = a1.getResourceURI("install.rdf"); michael@0: if (uri.schemeIs("jar")) michael@0: uri = a1.getResourceURI(); michael@0: michael@0: let fstream = AM_Cc["@mozilla.org/network/file-input-stream;1"]. michael@0: createInstance(AM_Ci.nsIFileInputStream); michael@0: fstream.init(uri.QueryInterface(AM_Ci.nsIFileURL).file, -1, 0, 0); michael@0: michael@0: installAllFiles([do_get_addon("test_bug587088_2")], function() { michael@0: michael@0: check_addon_upgrading(a1); michael@0: michael@0: restartManager(); michael@0: michael@0: AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) { michael@0: check_addon_upgrading(a1); michael@0: michael@0: restartManager(); michael@0: michael@0: AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) { michael@0: check_addon_upgrading(a1); michael@0: michael@0: fstream.close(); michael@0: michael@0: restartManager(); michael@0: michael@0: AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) { michael@0: check_addon(a1, "2.0"); michael@0: michael@0: a1.uninstall(); michael@0: do_execute_soon(run_test_2); michael@0: }); michael@0: })); michael@0: })); michael@0: }); michael@0: }); michael@0: }); michael@0: } michael@0: michael@0: // Test that a failed uninstall gets rolled back michael@0: function run_test_2() { michael@0: restartManager(); michael@0: michael@0: installAllFiles([do_get_addon("test_bug587088_1")], function() { michael@0: restartManager(); michael@0: michael@0: AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) { michael@0: check_addon(a1, "1.0"); michael@0: michael@0: // Lock either install.rdf for unpacked add-ons or the xpi for packed add-ons. michael@0: let uri = a1.getResourceURI("install.rdf"); michael@0: if (uri.schemeIs("jar")) michael@0: uri = a1.getResourceURI(); michael@0: michael@0: let fstream = AM_Cc["@mozilla.org/network/file-input-stream;1"]. michael@0: createInstance(AM_Ci.nsIFileInputStream); michael@0: fstream.init(uri.QueryInterface(AM_Ci.nsIFileURL).file, -1, 0, 0); michael@0: michael@0: a1.uninstall(); michael@0: michael@0: check_addon_uninstalling(a1); michael@0: michael@0: restartManager(); michael@0: michael@0: AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) { michael@0: check_addon_uninstalling(a1, true); michael@0: michael@0: restartManager(); michael@0: michael@0: AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) { michael@0: check_addon_uninstalling(a1, true); michael@0: michael@0: fstream.close(); michael@0: michael@0: restartManager(); michael@0: michael@0: AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) { michael@0: do_check_eq(a1, null); michael@0: var dir = profileDir.clone(); michael@0: dir.append(do_get_expected_addon_name("addon1@tests.mozilla.org")); michael@0: do_check_false(dir.exists()); michael@0: do_check_false(isExtensionInAddonsList(profileDir, "addon1@tests.mozilla.org")); michael@0: michael@0: do_execute_soon(do_test_finished); michael@0: }); michael@0: })); michael@0: })); michael@0: })); michael@0: }); michael@0: }