summaryrefslogtreecommitdiffstats
path: root/toolkit/mozapps/extensions/test/xpcshell/test_hotfix.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/mozapps/extensions/test/xpcshell/test_hotfix.js')
-rw-r--r--toolkit/mozapps/extensions/test/xpcshell/test_hotfix.js309
1 files changed, 309 insertions, 0 deletions
diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_hotfix.js b/toolkit/mozapps/extensions/test/xpcshell/test_hotfix.js
new file mode 100644
index 000000000..c9303897f
--- /dev/null
+++ b/toolkit/mozapps/extensions/test/xpcshell/test_hotfix.js
@@ -0,0 +1,309 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+// This verifies that hotfix installation works
+
+// The test extension uses an insecure update url.
+Services.prefs.setBoolPref("extensions.checkUpdateSecurity", false);
+// Ignore any certificate requirements the app has set
+Services.prefs.setBoolPref("extensions.hotfix.cert.checkAttributes", false);
+
+Components.utils.import("resource://testing-common/httpd.js");
+var testserver = new HttpServer();
+testserver.start(-1);
+gPort = testserver.identity.primaryPort;
+testserver.registerDirectory("/addons/", do_get_file("addons"));
+mapFile("/data/test_hotfix_1.rdf", testserver);
+mapFile("/data/test_hotfix_2.rdf", testserver);
+mapFile("/data/test_hotfix_3.rdf", testserver);
+
+const profileDir = gProfD.clone();
+profileDir.append("extensions");
+
+function run_test() {
+ createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2");
+
+ startupManager();
+
+ do_test_pending();
+ run_test_1();
+}
+
+function end_test() {
+ testserver.stop(do_test_finished);
+}
+
+// Test that background updates find and install any available hotfix
+function run_test_1() {
+ Services.prefs.setCharPref("extensions.hotfix.id", "hotfix@tests.mozilla.org");
+ Services.prefs.setCharPref("extensions.update.background.url", "http://localhost:" +
+ gPort + "/data/test_hotfix_1.rdf");
+
+ prepare_test({
+ "hotfix@tests.mozilla.org": [
+ "onInstalling"
+ ]
+ }, [
+ "onNewInstall",
+ "onDownloadStarted",
+ "onDownloadEnded",
+ "onInstallStarted",
+ "onInstallEnded",
+ ], callback_soon(check_test_1));
+
+ // We don't need to wait on the promise, just waiting for the install to finish is enough.
+ AddonManagerInternal.backgroundUpdateCheck();
+}
+
+function check_test_1() {
+ restartManager();
+
+ AddonManager.getAddonByID("hotfix@tests.mozilla.org", function(aAddon) {
+ do_check_neq(aAddon, null);
+ do_check_eq(aAddon.version, "1.0");
+
+ aAddon.uninstall();
+ do_execute_soon(run_test_2);
+ });
+}
+
+// Don't install an already used hotfix
+function run_test_2() {
+ restartManager();
+
+ AddonManager.addInstallListener({
+ onNewInstall: function() {
+ do_throw("Should not have seen a new install created");
+ }
+ });
+
+ // Run the background update
+ AddonManagerInternal.backgroundUpdateCheck().then(run_test_3);
+}
+
+// Install a newer hotfix
+function run_test_3() {
+ restartManager();
+ Services.prefs.setCharPref("extensions.hotfix.url", "http://localhost:" +
+ gPort + "/data/test_hotfix_2.rdf");
+
+ prepare_test({
+ "hotfix@tests.mozilla.org": [
+ "onInstalling"
+ ]
+ }, [
+ "onNewInstall",
+ "onDownloadStarted",
+ "onDownloadEnded",
+ "onInstallStarted",
+ "onInstallEnded",
+ ], callback_soon(check_test_3));
+
+ AddonManagerInternal.backgroundUpdateCheck();
+}
+
+function check_test_3() {
+ restartManager();
+
+ AddonManager.getAddonByID("hotfix@tests.mozilla.org", function(aAddon) {
+ do_check_neq(aAddon, null);
+ do_check_eq(aAddon.version, "2.0");
+
+ aAddon.uninstall();
+ do_execute_soon(run_test_4);
+ });
+}
+
+// Don't install an incompatible hotfix
+function run_test_4() {
+ restartManager();
+
+ Services.prefs.setCharPref("extensions.hotfix.url", "http://localhost:" +
+ gPort + "/data/test_hotfix_3.rdf");
+
+ AddonManager.addInstallListener({
+ onNewInstall: function() {
+ do_throw("Should not have seen a new install created");
+ }
+ });
+
+ AddonManagerInternal.backgroundUpdateCheck().then(run_test_5);
+}
+
+// Don't install an older hotfix
+function run_test_5() {
+ restartManager();
+
+ Services.prefs.setCharPref("extensions.hotfix.url", "http://localhost:" +
+ gPort + "/data/test_hotfix_1.rdf");
+
+ AddonManager.addInstallListener({
+ onNewInstall: function() {
+ do_throw("Should not have seen a new install created");
+ }
+ });
+
+ AddonManagerInternal.backgroundUpdateCheck().then(run_test_6);
+}
+
+// Don't re-download an already pending install
+function run_test_6() {
+ restartManager();
+
+ Services.prefs.setCharPref("extensions.hotfix.lastVersion", "0");
+ Services.prefs.setCharPref("extensions.hotfix.url", "http://localhost:" +
+ gPort + "/data/test_hotfix_1.rdf");
+
+ prepare_test({
+ "hotfix@tests.mozilla.org": [
+ "onInstalling"
+ ]
+ }, [
+ "onNewInstall",
+ "onDownloadStarted",
+ "onDownloadEnded",
+ "onInstallStarted",
+ "onInstallEnded",
+ ], callback_soon(check_test_6));
+
+ AddonManagerInternal.backgroundUpdateCheck();
+}
+
+function check_test_6() {
+ AddonManager.addInstallListener({
+ onNewInstall: function() {
+ do_throw("Should not have seen a new install created");
+ }
+ });
+
+ AddonManagerInternal.backgroundUpdateCheck()
+ .then(promiseRestartManager)
+ .then(() => promiseAddonByID("hotfix@tests.mozilla.org"))
+ .then(aAddon => {
+ aAddon.uninstall();
+ run_test_7();
+ });
+}
+
+// Start downloading again if something cancels the install
+function run_test_7() {
+ restartManager();
+
+ Services.prefs.setCharPref("extensions.hotfix.lastVersion", "0");
+
+ prepare_test({
+ "hotfix@tests.mozilla.org": [
+ "onInstalling"
+ ]
+ }, [
+ "onNewInstall",
+ "onDownloadStarted",
+ "onDownloadEnded",
+ "onInstallStarted",
+ "onInstallEnded",
+ ], check_test_7);
+
+ AddonManagerInternal.backgroundUpdateCheck();
+}
+
+function check_test_7(aInstall) {
+ prepare_test({
+ "hotfix@tests.mozilla.org": [
+ "onOperationCancelled"
+ ]
+ }, [
+ "onInstallCancelled",
+ ]);
+
+ aInstall.cancel();
+
+ prepare_test({
+ "hotfix@tests.mozilla.org": [
+ "onInstalling"
+ ]
+ }, [
+ "onNewInstall",
+ "onDownloadStarted",
+ "onDownloadEnded",
+ "onInstallStarted",
+ "onInstallEnded",
+ ], callback_soon(finish_test_7));
+
+ AddonManagerInternal.backgroundUpdateCheck();
+}
+
+function finish_test_7() {
+ restartManager();
+
+ AddonManager.getAddonByID("hotfix@tests.mozilla.org", function(aAddon) {
+ do_check_neq(aAddon, null);
+ do_check_eq(aAddon.version, "1.0");
+
+ aAddon.uninstall();
+ do_execute_soon(run_test_8);
+ });
+}
+
+// Cancel a pending install when a newer version is already available
+function run_test_8() {
+ restartManager();
+
+ Services.prefs.setCharPref("extensions.hotfix.lastVersion", "0");
+ Services.prefs.setCharPref("extensions.hotfix.url", "http://localhost:" +
+ gPort + "/data/test_hotfix_1.rdf");
+
+ prepare_test({
+ "hotfix@tests.mozilla.org": [
+ "onInstalling"
+ ]
+ }, [
+ "onNewInstall",
+ "onDownloadStarted",
+ "onDownloadEnded",
+ "onInstallStarted",
+ "onInstallEnded",
+ ], check_test_8);
+
+ AddonManagerInternal.backgroundUpdateCheck();
+}
+
+function check_test_8() {
+ Services.prefs.setCharPref("extensions.hotfix.url", "http://localhost:" +
+ gPort + "/data/test_hotfix_2.rdf");
+
+ prepare_test({
+ "hotfix@tests.mozilla.org": [
+ "onOperationCancelled",
+ "onInstalling"
+ ]
+ }, [
+ "onNewInstall",
+ "onDownloadStarted",
+ "onDownloadEnded",
+ "onInstallStarted",
+ "onInstallCancelled",
+ "onInstallEnded",
+ ], finish_test_8);
+
+ AddonManagerInternal.backgroundUpdateCheck();
+}
+
+function finish_test_8() {
+ AddonManager.getAllInstalls(callback_soon(function(aInstalls) {
+ do_check_eq(aInstalls.length, 1);
+ do_check_eq(aInstalls[0].version, "2.0");
+
+ restartManager();
+
+ AddonManager.getAddonByID("hotfix@tests.mozilla.org", callback_soon(function(aAddon) {
+ do_check_neq(aAddon, null);
+ do_check_eq(aAddon.version, "2.0");
+
+ aAddon.uninstall();
+ restartManager();
+
+ end_test();
+ }));
+ }));
+}