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: // This verifies that add-ons distributed with the application get installed michael@0: // correctly michael@0: michael@0: // Allow distributed add-ons to install michael@0: Services.prefs.setBoolPref("extensions.installDistroAddons", true); michael@0: michael@0: createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); michael@0: michael@0: const profileDir = gProfD.clone(); michael@0: profileDir.append("extensions"); michael@0: const distroDir = gProfD.clone(); michael@0: distroDir.append("distribution"); michael@0: distroDir.append("extensions"); michael@0: registerDirectory("XREAppDist", distroDir.parent); michael@0: michael@0: var addon1_1 = { michael@0: id: "addon1@tests.mozilla.org", michael@0: version: "1.0", michael@0: name: "Test version 1", michael@0: targetApplications: [{ michael@0: id: "xpcshell@tests.mozilla.org", michael@0: minVersion: "1", michael@0: maxVersion: "5" michael@0: }] michael@0: }; michael@0: michael@0: var addon1_2 = { michael@0: id: "addon1@tests.mozilla.org", michael@0: version: "2.0", michael@0: name: "Test version 2", michael@0: targetApplications: [{ michael@0: id: "xpcshell@tests.mozilla.org", michael@0: minVersion: "1", michael@0: maxVersion: "5" michael@0: }] michael@0: }; michael@0: michael@0: var addon1_3 = { michael@0: id: "addon1@tests.mozilla.org", michael@0: version: "3.0", michael@0: name: "Test version 3", michael@0: targetApplications: [{ michael@0: id: "xpcshell@tests.mozilla.org", michael@0: minVersion: "1", michael@0: maxVersion: "5" michael@0: }] michael@0: }; michael@0: michael@0: function getActiveVersion() { michael@0: return Services.prefs.getIntPref("bootstraptest.active_version"); michael@0: } michael@0: michael@0: function getInstalledVersion() { michael@0: return Services.prefs.getIntPref("bootstraptest.installed_version"); michael@0: } michael@0: michael@0: function setOldModificationTime() { michael@0: // Make sure the installed extension has an old modification time so any michael@0: // changes will be detected michael@0: shutdownManager() michael@0: let extension = gProfD.clone(); michael@0: extension.append("extensions"); michael@0: if (Services.prefs.getBoolPref("extensions.alwaysUnpack")) michael@0: extension.append("addon1@tests.mozilla.org"); michael@0: else michael@0: extension.append("addon1@tests.mozilla.org.xpi"); michael@0: setExtensionModifiedTime(extension, Date.now - 10000); michael@0: startupManager(false); michael@0: } michael@0: michael@0: function run_test() { michael@0: do_test_pending(); michael@0: michael@0: run_test_1(); michael@0: } michael@0: michael@0: // Tests that on the first startup the add-on gets installed michael@0: function run_test_1() { michael@0: writeInstallRDFForExtension(addon1_1, distroDir); michael@0: michael@0: startupManager(); michael@0: michael@0: AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) { michael@0: do_check_neq(a1, null); michael@0: do_check_eq(a1.version, "1.0"); michael@0: do_check_true(a1.isActive); michael@0: do_check_eq(a1.scope, AddonManager.SCOPE_PROFILE); michael@0: do_check_false(a1.foreignInstall); michael@0: michael@0: do_execute_soon(run_test_2); michael@0: }); michael@0: } michael@0: michael@0: // Tests that starting with a newer version in the distribution dir doesn't michael@0: // install it yet michael@0: function run_test_2() { michael@0: setOldModificationTime(); michael@0: michael@0: writeInstallRDFForExtension(addon1_2, distroDir); michael@0: michael@0: restartManager(); michael@0: michael@0: AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) { michael@0: do_check_neq(a1, null); michael@0: do_check_eq(a1.version, "1.0"); michael@0: do_check_true(a1.isActive); michael@0: do_check_eq(a1.scope, AddonManager.SCOPE_PROFILE); michael@0: michael@0: do_execute_soon(run_test_3); michael@0: }); michael@0: } michael@0: michael@0: // Test that an app upgrade installs the newer version michael@0: function run_test_3() { michael@0: restartManager("2"); michael@0: michael@0: AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) { michael@0: do_check_neq(a1, null); michael@0: do_check_eq(a1.version, "2.0"); michael@0: do_check_true(a1.isActive); michael@0: do_check_eq(a1.scope, AddonManager.SCOPE_PROFILE); michael@0: do_check_false(a1.foreignInstall); michael@0: michael@0: do_execute_soon(run_test_4); michael@0: }); michael@0: } michael@0: michael@0: // Test that an app upgrade doesn't downgrade the extension michael@0: function run_test_4() { michael@0: setOldModificationTime(); michael@0: michael@0: writeInstallRDFForExtension(addon1_1, distroDir); michael@0: michael@0: restartManager("3"); michael@0: michael@0: AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) { michael@0: do_check_neq(a1, null); michael@0: do_check_eq(a1.version, "2.0"); michael@0: do_check_true(a1.isActive); michael@0: do_check_eq(a1.scope, AddonManager.SCOPE_PROFILE); michael@0: michael@0: do_execute_soon(run_test_5); michael@0: }); michael@0: } michael@0: michael@0: // Tests that after uninstalling a restart doesn't re-install the extension michael@0: function run_test_5() { michael@0: AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) { michael@0: a1.uninstall(); 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: michael@0: do_execute_soon(run_test_6); michael@0: }); michael@0: })); michael@0: } michael@0: michael@0: // Tests that upgrading the application still doesn't re-install the uninstalled michael@0: // extension michael@0: function run_test_6() { michael@0: restartManager("4"); michael@0: michael@0: AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) { michael@0: do_check_eq(a1, null); michael@0: michael@0: do_execute_soon(run_test_7); michael@0: }); michael@0: } michael@0: michael@0: // Tests that a pending install of a newer version of a distributed add-on michael@0: // at app change still gets applied michael@0: function run_test_7() { michael@0: Services.prefs.clearUserPref("extensions.installedDistroAddon.addon1@tests.mozilla.org"); michael@0: michael@0: installAllFiles([do_get_addon("test_distribution1_2")], function() { michael@0: restartManager(2); michael@0: michael@0: AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) { michael@0: do_check_neq(a1, null); michael@0: do_check_eq(a1.version, "2.0"); michael@0: do_check_true(a1.isActive); michael@0: do_check_eq(a1.scope, AddonManager.SCOPE_PROFILE); michael@0: michael@0: a1.uninstall(); michael@0: do_execute_soon(run_test_8); michael@0: }); michael@0: }); michael@0: } michael@0: michael@0: // Tests that a pending install of a older version of a distributed add-on michael@0: // at app change gets replaced by the distributed version michael@0: function run_test_8() { michael@0: restartManager(); michael@0: michael@0: writeInstallRDFForExtension(addon1_3, distroDir); michael@0: michael@0: installAllFiles([do_get_addon("test_distribution1_2")], function() { michael@0: restartManager(3); michael@0: michael@0: AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) { michael@0: do_check_neq(a1, null); michael@0: do_check_eq(a1.version, "3.0"); michael@0: do_check_true(a1.isActive); michael@0: do_check_eq(a1.scope, AddonManager.SCOPE_PROFILE); michael@0: michael@0: a1.uninstall(); michael@0: do_execute_soon(run_test_9); michael@0: }); michael@0: }); michael@0: } michael@0: michael@0: // Tests that bootstrapped add-ons distributed start up correctly, also that michael@0: // add-ons with multiple directories get copied fully michael@0: function run_test_9() { michael@0: restartManager(); michael@0: michael@0: // Copy the test add-on to the distro dir michael@0: let addon = do_get_file("data/test_distribution2_2"); michael@0: addon.copyTo(distroDir, "addon2@tests.mozilla.org"); michael@0: michael@0: restartManager("5"); michael@0: michael@0: AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { michael@0: do_check_neq(a2, null); michael@0: do_check_true(a2.isActive); michael@0: michael@0: do_check_eq(getInstalledVersion(), 2); michael@0: do_check_eq(getActiveVersion(), 2); michael@0: michael@0: do_check_true(a2.hasResource("bootstrap.js")); michael@0: do_check_true(a2.hasResource("subdir/dummy.txt")); michael@0: do_check_true(a2.hasResource("subdir/subdir2/dummy2.txt")); michael@0: michael@0: // Currently installs are unpacked if the source is a directory regardless michael@0: // of the install.rdf property or the global preference michael@0: michael@0: let addonDir = profileDir.clone(); michael@0: addonDir.append("addon2@tests.mozilla.org"); michael@0: do_check_true(addonDir.exists()); michael@0: do_check_true(addonDir.isDirectory()); michael@0: addonDir.append("subdir"); michael@0: do_check_true(addonDir.exists()); michael@0: do_check_true(addonDir.isDirectory()); michael@0: addonDir.append("subdir2"); michael@0: do_check_true(addonDir.exists()); michael@0: do_check_true(addonDir.isDirectory()); michael@0: addonDir.append("dummy2.txt"); michael@0: do_check_true(addonDir.exists()); michael@0: do_check_true(addonDir.isFile()); michael@0: michael@0: a2.uninstall(); michael@0: michael@0: do_execute_soon(do_test_finished); michael@0: }); michael@0: }