1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/toolkit/mozapps/extensions/test/xpcshell/test_updateid.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,422 @@ 1.4 +/* Any copyright is dedicated to the Public Domain. 1.5 + * http://creativecommons.org/publicdomain/zero/1.0/ 1.6 + */ 1.7 + 1.8 +// This verifies that updating an add-on to a new ID works 1.9 + 1.10 +// The test extension uses an insecure update url. 1.11 +Services.prefs.setBoolPref("extensions.checkUpdateSecurity", false); 1.12 + 1.13 +Components.utils.import("resource://testing-common/httpd.js"); 1.14 +var testserver; 1.15 +const profileDir = gProfD.clone(); 1.16 +profileDir.append("extensions"); 1.17 + 1.18 +function resetPrefs() { 1.19 + Services.prefs.setIntPref("bootstraptest.active_version", -1); 1.20 + Services.prefs.setIntPref("bootstraptest.installed_version", -1); 1.21 + Services.prefs.setIntPref("bootstraptest.startup_reason", -1); 1.22 + Services.prefs.setIntPref("bootstraptest.shutdown_reason", -1); 1.23 + Services.prefs.setIntPref("bootstraptest.install_reason", -1); 1.24 + Services.prefs.setIntPref("bootstraptest.uninstall_reason", -1); 1.25 +} 1.26 + 1.27 +function getActiveVersion() { 1.28 + return Services.prefs.getIntPref("bootstraptest.active_version"); 1.29 +} 1.30 + 1.31 +function getInstalledVersion() { 1.32 + return Services.prefs.getIntPref("bootstraptest.installed_version"); 1.33 +} 1.34 + 1.35 +function run_test() { 1.36 + createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); 1.37 + 1.38 + // Create and configure the HTTP server. 1.39 + testserver = new HttpServer(); 1.40 + testserver.registerDirectory("/data/", do_get_file("data")); 1.41 + testserver.registerDirectory("/addons/", do_get_file("addons")); 1.42 + testserver.start(4444); 1.43 + 1.44 + do_test_pending(); 1.45 + run_test_1(); 1.46 +} 1.47 + 1.48 +function end_test() { 1.49 + testserver.stop(do_test_finished); 1.50 +} 1.51 + 1.52 +function installUpdate(aInstall, aCallback) { 1.53 + aInstall.addListener({ 1.54 + onInstallEnded: function(aInstall) { 1.55 + // give the startup time to run 1.56 + do_execute_soon(function() { 1.57 + aCallback(aInstall); 1.58 + }); 1.59 + } 1.60 + }); 1.61 + 1.62 + aInstall.install(); 1.63 +} 1.64 + 1.65 +// Verify that an update to an add-on with a new ID uninstalls the old add-on 1.66 +function run_test_1() { 1.67 + writeInstallRDFForExtension({ 1.68 + id: "addon1@tests.mozilla.org", 1.69 + version: "1.0", 1.70 + updateURL: "http://localhost:4444/data/test_updateid.rdf", 1.71 + targetApplications: [{ 1.72 + id: "xpcshell@tests.mozilla.org", 1.73 + minVersion: "1", 1.74 + maxVersion: "1" 1.75 + }], 1.76 + name: "Test Addon 1", 1.77 + }, profileDir); 1.78 + 1.79 + startupManager(); 1.80 + 1.81 + AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) { 1.82 + do_check_neq(a1, null); 1.83 + do_check_eq(a1.version, "1.0"); 1.84 + 1.85 + a1.findUpdates({ 1.86 + onUpdateAvailable: function(addon, install) { 1.87 + do_check_eq(install.name, addon.name); 1.88 + do_check_eq(install.version, "2.0"); 1.89 + do_check_eq(install.state, AddonManager.STATE_AVAILABLE); 1.90 + do_check_eq(install.existingAddon, a1); 1.91 + 1.92 + installUpdate(install, check_test_1); 1.93 + } 1.94 + }, AddonManager.UPDATE_WHEN_USER_REQUESTED); 1.95 + }); 1.96 +} 1.97 + 1.98 +function check_test_1(install) { 1.99 + AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) { 1.100 + // Existing add-on should have a pending upgrade 1.101 + do_check_neq(a1.pendingUpgrade, null); 1.102 + do_check_eq(a1.pendingUpgrade.id, "addon2@tests.mozilla.org"); 1.103 + do_check_eq(a1.pendingUpgrade.install.existingAddon, a1); 1.104 + do_check_neq(a1.syncGUID); 1.105 + 1.106 + let a1SyncGUID = a1.syncGUID; 1.107 + 1.108 + restartManager(); 1.109 + 1.110 + AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org", 1.111 + "addon2@tests.mozilla.org"], function([a1, a2]) { 1.112 + // Should have uninstalled the old and installed the new 1.113 + do_check_eq(a1, null); 1.114 + do_check_neq(a2, null); 1.115 + do_check_neq(a2.syncGUID, null); 1.116 + 1.117 + // The Sync GUID should change when the ID changes 1.118 + do_check_neq(a1SyncGUID, a2.syncGUID); 1.119 + 1.120 + a2.uninstall(); 1.121 + 1.122 + do_execute_soon(run_test_2); 1.123 + }); 1.124 + })); 1.125 +} 1.126 + 1.127 +// Test that when the new add-on already exists we just upgrade that 1.128 +function run_test_2() { 1.129 + restartManager(); 1.130 + shutdownManager(); 1.131 + 1.132 + writeInstallRDFForExtension({ 1.133 + id: "addon1@tests.mozilla.org", 1.134 + version: "1.0", 1.135 + updateURL: "http://localhost:4444/data/test_updateid.rdf", 1.136 + targetApplications: [{ 1.137 + id: "xpcshell@tests.mozilla.org", 1.138 + minVersion: "1", 1.139 + maxVersion: "1" 1.140 + }], 1.141 + name: "Test Addon 1", 1.142 + }, profileDir); 1.143 + writeInstallRDFForExtension({ 1.144 + id: "addon2@tests.mozilla.org", 1.145 + version: "1.0", 1.146 + targetApplications: [{ 1.147 + id: "xpcshell@tests.mozilla.org", 1.148 + minVersion: "1", 1.149 + maxVersion: "1" 1.150 + }], 1.151 + name: "Test Addon 2", 1.152 + }, profileDir); 1.153 + 1.154 + startupManager(); 1.155 + 1.156 + AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) { 1.157 + do_check_neq(a1, null); 1.158 + do_check_eq(a1.version, "1.0"); 1.159 + 1.160 + a1.findUpdates({ 1.161 + onUpdateAvailable: function(addon, install) { 1.162 + installUpdate(install, check_test_2); 1.163 + } 1.164 + }, AddonManager.UPDATE_WHEN_USER_REQUESTED); 1.165 + }); 1.166 +} 1.167 + 1.168 +function check_test_2(install) { 1.169 + AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org", 1.170 + "addon2@tests.mozilla.org"], 1.171 + callback_soon(function([a1, a2]) { 1.172 + do_check_eq(a1.pendingUpgrade, null); 1.173 + // Existing add-on should have a pending upgrade 1.174 + do_check_neq(a2.pendingUpgrade, null); 1.175 + do_check_eq(a2.pendingUpgrade.id, "addon2@tests.mozilla.org"); 1.176 + do_check_eq(a2.pendingUpgrade.install.existingAddon, a2); 1.177 + 1.178 + restartManager(); 1.179 + 1.180 + AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org", 1.181 + "addon2@tests.mozilla.org"], function([a1, a2]) { 1.182 + // Should have uninstalled the old and installed the new 1.183 + do_check_neq(a1, null); 1.184 + do_check_neq(a2, null); 1.185 + 1.186 + a1.uninstall(); 1.187 + a2.uninstall(); 1.188 + 1.189 + do_execute_soon(run_test_3); 1.190 + }); 1.191 + })); 1.192 +} 1.193 + 1.194 +// Test that we rollback correctly when removing the old add-on fails 1.195 +function run_test_3() { 1.196 + restartManager(); 1.197 + shutdownManager(); 1.198 + 1.199 + // This test only works on Windows 1.200 + if (!("nsIWindowsRegKey" in AM_Ci)) { 1.201 + run_test_4(); 1.202 + return; 1.203 + } 1.204 + 1.205 + writeInstallRDFForExtension({ 1.206 + id: "addon1@tests.mozilla.org", 1.207 + version: "1.0", 1.208 + updateURL: "http://localhost:4444/data/test_updateid.rdf", 1.209 + targetApplications: [{ 1.210 + id: "xpcshell@tests.mozilla.org", 1.211 + minVersion: "1", 1.212 + maxVersion: "1" 1.213 + }], 1.214 + name: "Test Addon 1", 1.215 + }, profileDir); 1.216 + 1.217 + startupManager(); 1.218 + 1.219 + AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) { 1.220 + do_check_neq(a1, null); 1.221 + do_check_eq(a1.version, "1.0"); 1.222 + 1.223 + a1.findUpdates({ 1.224 + onUpdateAvailable: function(addon, install) { 1.225 + installUpdate(install, check_test_3); 1.226 + } 1.227 + }, AddonManager.UPDATE_WHEN_USER_REQUESTED); 1.228 + }); 1.229 +} 1.230 + 1.231 +function check_test_3(install) { 1.232 + AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) { 1.233 + // Existing add-on should have a pending upgrade 1.234 + do_check_neq(a1.pendingUpgrade, null); 1.235 + do_check_eq(a1.pendingUpgrade.id, "addon2@tests.mozilla.org"); 1.236 + do_check_eq(a1.pendingUpgrade.install.existingAddon, a1); 1.237 + 1.238 + // Lock the old add-on open so it can't be uninstalled 1.239 + var file = profileDir.clone(); 1.240 + file.append("addon1@tests.mozilla.org"); 1.241 + if (!file.exists()) 1.242 + file.leafName += ".xpi"; 1.243 + else 1.244 + file.append("install.rdf"); 1.245 + 1.246 + var fstream = AM_Cc["@mozilla.org/network/file-output-stream;1"]. 1.247 + createInstance(AM_Ci.nsIFileOutputStream); 1.248 + fstream.init(file, FileUtils.MODE_APPEND | FileUtils.MODE_WRONLY, FileUtils.PERMS_FILE, 0); 1.249 + 1.250 + restartManager(); 1.251 + 1.252 + fstream.close(); 1.253 + 1.254 + AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org", 1.255 + "addon2@tests.mozilla.org"], 1.256 + callback_soon(function([a1, a2]) { 1.257 + // Should not have installed the new add-on but it should still be 1.258 + // pending install 1.259 + do_check_neq(a1, null); 1.260 + do_check_eq(a2, null); 1.261 + 1.262 + restartManager(); 1.263 + 1.264 + AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org", 1.265 + "addon2@tests.mozilla.org"], function([a1, a2]) { 1.266 + // Should have installed the new add-on 1.267 + do_check_eq(a1, null); 1.268 + do_check_neq(a2, null); 1.269 + 1.270 + a2.uninstall(); 1.271 + 1.272 + do_execute_soon(run_test_4); 1.273 + }); 1.274 + })); 1.275 + })); 1.276 +} 1.277 + 1.278 +// Tests that upgrading to a bootstrapped add-on works but requires a restart 1.279 +function run_test_4() { 1.280 + restartManager(); 1.281 + shutdownManager(); 1.282 + 1.283 + writeInstallRDFForExtension({ 1.284 + id: "addon2@tests.mozilla.org", 1.285 + version: "2.0", 1.286 + updateURL: "http://localhost:4444/data/test_updateid.rdf", 1.287 + targetApplications: [{ 1.288 + id: "xpcshell@tests.mozilla.org", 1.289 + minVersion: "1", 1.290 + maxVersion: "1" 1.291 + }], 1.292 + name: "Test Addon 2", 1.293 + }, profileDir); 1.294 + 1.295 + startupManager(); 1.296 + 1.297 + resetPrefs(); 1.298 + 1.299 + AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { 1.300 + do_check_neq(a2, null); 1.301 + do_check_neq(a2.syncGUID, null); 1.302 + do_check_eq(a2.version, "2.0"); 1.303 + 1.304 + a2.findUpdates({ 1.305 + onUpdateAvailable: function(addon, install) { 1.306 + installUpdate(install, check_test_4); 1.307 + } 1.308 + }, AddonManager.UPDATE_WHEN_USER_REQUESTED); 1.309 + }); 1.310 +} 1.311 + 1.312 +function check_test_4() { 1.313 + AddonManager.getAddonsByIDs(["addon2@tests.mozilla.org", 1.314 + "addon3@tests.mozilla.org"], 1.315 + callback_soon(function([a2, a3]) { 1.316 + // Should still be pending install even though the new add-on is restartless 1.317 + do_check_neq(a2, null); 1.318 + do_check_eq(a3, null); 1.319 + 1.320 + do_check_neq(a2.pendingUpgrade, null); 1.321 + do_check_eq(a2.pendingUpgrade.id, "addon3@tests.mozilla.org"); 1.322 + 1.323 + do_check_eq(getInstalledVersion(), -1); 1.324 + do_check_eq(getActiveVersion(), -1); 1.325 + 1.326 + restartManager(); 1.327 + 1.328 + AddonManager.getAddonsByIDs(["addon2@tests.mozilla.org", 1.329 + "addon3@tests.mozilla.org"], function([a2, a3]) { 1.330 + // Should have updated 1.331 + do_check_eq(a2, null); 1.332 + do_check_neq(a3, null); 1.333 + 1.334 + do_check_eq(getInstalledVersion(), 3); 1.335 + do_check_eq(getActiveVersion(), 3); 1.336 + 1.337 + do_execute_soon(run_test_5); 1.338 + }); 1.339 + })); 1.340 +} 1.341 + 1.342 +// Tests that upgrading to another bootstrapped add-on works without a restart 1.343 +function run_test_5() { 1.344 + AddonManager.getAddonByID("addon3@tests.mozilla.org", function(a3) { 1.345 + do_check_neq(a3, null); 1.346 + do_check_eq(a3.version, "3.0"); 1.347 + 1.348 + a3.findUpdates({ 1.349 + onUpdateAvailable: function(addon, install) { 1.350 + installUpdate(install, check_test_5); 1.351 + } 1.352 + }, AddonManager.UPDATE_WHEN_USER_REQUESTED); 1.353 + }); 1.354 +} 1.355 + 1.356 +function check_test_5() { 1.357 + AddonManager.getAddonsByIDs(["addon3@tests.mozilla.org", 1.358 + "addon4@tests.mozilla.org"], 1.359 + callback_soon(function([a3, a4]) { 1.360 + // Should have updated 1.361 + do_check_eq(a3, null); 1.362 + do_check_neq(a4, null); 1.363 + 1.364 + do_check_eq(getInstalledVersion(), 4); 1.365 + do_check_eq(getActiveVersion(), 4); 1.366 + 1.367 + restartManager(); 1.368 + 1.369 + AddonManager.getAddonsByIDs(["addon3@tests.mozilla.org", 1.370 + "addon4@tests.mozilla.org"], function([a3, a4]) { 1.371 + // Should still be gone 1.372 + do_check_eq(a3, null); 1.373 + do_check_neq(a4, null); 1.374 + 1.375 + do_check_eq(getInstalledVersion(), 4); 1.376 + do_check_eq(getActiveVersion(), 4); 1.377 + 1.378 + run_test_6(); 1.379 + }); 1.380 + })); 1.381 +} 1.382 + 1.383 +// Tests that upgrading to a non-bootstrapped add-on works but requires a restart 1.384 +function run_test_6() { 1.385 + AddonManager.getAddonByID("addon4@tests.mozilla.org", function(a4) { 1.386 + do_check_neq(a4, null); 1.387 + do_check_eq(a4.version, "4.0"); 1.388 + 1.389 + a4.findUpdates({ 1.390 + onUpdateAvailable: function(addon, install) { 1.391 + installUpdate(install, check_test_6); 1.392 + } 1.393 + }, AddonManager.UPDATE_WHEN_USER_REQUESTED); 1.394 + }); 1.395 +} 1.396 + 1.397 +function check_test_6() { 1.398 + AddonManager.getAddonsByIDs(["addon4@tests.mozilla.org", 1.399 + "addon2@tests.mozilla.org"], 1.400 + callback_soon(function([a4, a2]) { 1.401 + // Should still be pending install even though the old add-on is restartless 1.402 + do_check_neq(a4, null); 1.403 + do_check_eq(a2, null); 1.404 + 1.405 + do_check_neq(a4.pendingUpgrade, null); 1.406 + do_check_eq(a4.pendingUpgrade.id, "addon2@tests.mozilla.org"); 1.407 + 1.408 + do_check_eq(getInstalledVersion(), 4); 1.409 + do_check_eq(getActiveVersion(), 4); 1.410 + 1.411 + restartManager(); 1.412 + 1.413 + AddonManager.getAddonsByIDs(["addon4@tests.mozilla.org", 1.414 + "addon2@tests.mozilla.org"], function([a4, a2]) { 1.415 + // Should have updated 1.416 + do_check_eq(a4, null); 1.417 + do_check_neq(a2, null); 1.418 + 1.419 + do_check_eq(getInstalledVersion(), 0); 1.420 + do_check_eq(getActiveVersion(), 0); 1.421 + 1.422 + end_test(); 1.423 + }); 1.424 + })); 1.425 +}