summaryrefslogtreecommitdiffstats
path: root/toolkit/mozapps/extensions/test/xpcshell/test_bug587088.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/mozapps/extensions/test/xpcshell/test_bug587088.js')
-rw-r--r--toolkit/mozapps/extensions/test/xpcshell/test_bug587088.js195
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"));
+});