1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/toolkit/mozapps/extensions/test/xpcshell/test_update_strictcompat.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,1091 @@ 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 add-on update checks work 1.9 + 1.10 +const PREF_MATCH_OS_LOCALE = "intl.locale.matchOS"; 1.11 +const PREF_SELECTED_LOCALE = "general.useragent.locale"; 1.12 +const PREF_GETADDONS_CACHE_ENABLED = "extensions.getAddons.cache.enabled"; 1.13 + 1.14 +// The test extension uses an insecure update url. 1.15 +Services.prefs.setBoolPref("extensions.checkUpdateSecurity", false); 1.16 +// This test requires lightweight themes update to be enabled even if the app 1.17 +// doesn't support lightweight themes. 1.18 +Services.prefs.setBoolPref("lightweightThemes.update.enabled", true); 1.19 + 1.20 +Components.utils.import("resource://gre/modules/LightweightThemeManager.jsm"); 1.21 + 1.22 +const PARAMS = "?%REQ_VERSION%/%ITEM_ID%/%ITEM_VERSION%/%ITEM_MAXAPPVERSION%/" + 1.23 + "%ITEM_STATUS%/%APP_ID%/%APP_VERSION%/%CURRENT_APP_VERSION%/" + 1.24 + "%APP_OS%/%APP_ABI%/%APP_LOCALE%/%UPDATE_TYPE%"; 1.25 + 1.26 +var gInstallDate; 1.27 + 1.28 +Components.utils.import("resource://testing-common/httpd.js"); 1.29 +var testserver = new HttpServer(); 1.30 +testserver.start(-1); 1.31 +gPort = testserver.identity.primaryPort; 1.32 +mapFile("/data/test_update.rdf", testserver); 1.33 +mapFile("/data/test_update.xml", testserver); 1.34 +testserver.registerDirectory("/addons/", do_get_file("addons")); 1.35 + 1.36 +const profileDir = gProfD.clone(); 1.37 +profileDir.append("extensions"); 1.38 + 1.39 +function run_test() { 1.40 + createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); 1.41 + Services.prefs.setBoolPref(PREF_MATCH_OS_LOCALE, false); 1.42 + Services.prefs.setCharPref(PREF_SELECTED_LOCALE, "fr-FR"); 1.43 + Services.prefs.setBoolPref(PREF_EM_STRICT_COMPATIBILITY, true); 1.44 + 1.45 + writeInstallRDFForExtension({ 1.46 + id: "addon1@tests.mozilla.org", 1.47 + version: "1.0", 1.48 + updateURL: "http://localhost:" + gPort + "/data/test_update.rdf", 1.49 + targetApplications: [{ 1.50 + id: "xpcshell@tests.mozilla.org", 1.51 + minVersion: "1", 1.52 + maxVersion: "1" 1.53 + }], 1.54 + name: "Test Addon 1", 1.55 + }, profileDir); 1.56 + 1.57 + writeInstallRDFForExtension({ 1.58 + id: "addon2@tests.mozilla.org", 1.59 + version: "1.0", 1.60 + updateURL: "http://localhost:" + gPort + "/data/test_update.rdf", 1.61 + targetApplications: [{ 1.62 + id: "xpcshell@tests.mozilla.org", 1.63 + minVersion: "0", 1.64 + maxVersion: "0" 1.65 + }], 1.66 + name: "Test Addon 2", 1.67 + }, profileDir); 1.68 + 1.69 + writeInstallRDFForExtension({ 1.70 + id: "addon3@tests.mozilla.org", 1.71 + version: "1.0", 1.72 + updateURL: "http://localhost:" + gPort + "/data/test_update.rdf", 1.73 + targetApplications: [{ 1.74 + id: "xpcshell@tests.mozilla.org", 1.75 + minVersion: "5", 1.76 + maxVersion: "5" 1.77 + }], 1.78 + name: "Test Addon 3", 1.79 + }, profileDir); 1.80 + 1.81 + startupManager(); 1.82 + 1.83 + do_test_pending(); 1.84 + run_test_1(); 1.85 +} 1.86 + 1.87 +function end_test() { 1.88 + Services.prefs.clearUserPref(PREF_EM_STRICT_COMPATIBILITY); 1.89 + 1.90 + testserver.stop(do_test_finished); 1.91 +} 1.92 + 1.93 +// Verify that an update is available and can be installed. 1.94 +function run_test_1() { 1.95 + AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) { 1.96 + do_check_neq(a1, null); 1.97 + do_check_eq(a1.version, "1.0"); 1.98 + do_check_eq(a1.applyBackgroundUpdates, AddonManager.AUTOUPDATE_DEFAULT); 1.99 + do_check_eq(a1.releaseNotesURI, null); 1.100 + 1.101 + a1.applyBackgroundUpdates = AddonManager.AUTOUPDATE_DEFAULT; 1.102 + 1.103 + prepare_test({ 1.104 + "addon1@tests.mozilla.org": [ 1.105 + ["onPropertyChanged", ["applyBackgroundUpdates"]] 1.106 + ] 1.107 + }); 1.108 + a1.applyBackgroundUpdates = AddonManager.AUTOUPDATE_DISABLE; 1.109 + check_test_completed(); 1.110 + 1.111 + a1.applyBackgroundUpdates = AddonManager.AUTOUPDATE_DISABLE; 1.112 + 1.113 + prepare_test({}, [ 1.114 + "onNewInstall", 1.115 + ]); 1.116 + 1.117 + a1.findUpdates({ 1.118 + onNoCompatibilityUpdateAvailable: function(addon) { 1.119 + do_throw("Should not have seen onNoCompatibilityUpdateAvailable notification"); 1.120 + }, 1.121 + 1.122 + onUpdateAvailable: function(addon, install) { 1.123 + ensure_test_completed(); 1.124 + 1.125 + AddonManager.getAllInstalls(function(aInstalls) { 1.126 + do_check_eq(aInstalls.length, 1); 1.127 + do_check_eq(aInstalls[0], install); 1.128 + 1.129 + do_check_eq(addon, a1); 1.130 + do_check_eq(install.name, addon.name); 1.131 + do_check_eq(install.version, "2.0"); 1.132 + do_check_eq(install.state, AddonManager.STATE_AVAILABLE); 1.133 + do_check_eq(install.existingAddon, addon); 1.134 + do_check_eq(install.releaseNotesURI.spec, "http://example.com/updateInfo.xhtml"); 1.135 + 1.136 + // Verify that another update check returns the same AddonInstall 1.137 + a1.findUpdates({ 1.138 + onNoCompatibilityUpdateAvailable: function(addon) { 1.139 + do_throw("Should not have seen onNoCompatibilityUpdateAvailable notification"); 1.140 + }, 1.141 + 1.142 + onUpdateAvailable: function(newAddon, newInstall) { 1.143 + AddonManager.getAllInstalls(function(aInstalls) { 1.144 + do_check_eq(aInstalls.length, 1); 1.145 + do_check_eq(aInstalls[0], install); 1.146 + do_check_eq(newAddon, addon); 1.147 + do_check_eq(newInstall, install); 1.148 + 1.149 + prepare_test({}, [ 1.150 + "onDownloadStarted", 1.151 + "onDownloadEnded", 1.152 + ], check_test_1); 1.153 + install.install(); 1.154 + }); 1.155 + }, 1.156 + 1.157 + onNoUpdateAvailable: function(addon) { 1.158 + do_throw("Should not have seen onNoUpdateAvailable notification"); 1.159 + } 1.160 + }, AddonManager.UPDATE_WHEN_USER_REQUESTED); 1.161 + }); 1.162 + }, 1.163 + 1.164 + onNoUpdateAvailable: function(addon) { 1.165 + do_throw("Should not have seen onNoUpdateAvailable notification"); 1.166 + } 1.167 + }, AddonManager.UPDATE_WHEN_USER_REQUESTED); 1.168 + }); 1.169 +} 1.170 + 1.171 +function check_test_1(install) { 1.172 + ensure_test_completed(); 1.173 + do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); 1.174 + run_test_2(install); 1.175 + return false; 1.176 +} 1.177 + 1.178 +// Continue installing the update. 1.179 +function run_test_2(install) { 1.180 + // Verify that another update check returns no new update 1.181 + install.existingAddon.findUpdates({ 1.182 + onNoCompatibilityUpdateAvailable: function(addon) { 1.183 + do_throw("Should not have seen onNoCompatibilityUpdateAvailable notification"); 1.184 + }, 1.185 + 1.186 + onUpdateAvailable: function(addon, install) { 1.187 + do_throw("Should find no available update when one is already downloading"); 1.188 + }, 1.189 + 1.190 + onNoUpdateAvailable: function(addon) { 1.191 + AddonManager.getAllInstalls(function(aInstalls) { 1.192 + do_check_eq(aInstalls.length, 1); 1.193 + do_check_eq(aInstalls[0], install); 1.194 + 1.195 + prepare_test({ 1.196 + "addon1@tests.mozilla.org": [ 1.197 + "onInstalling" 1.198 + ] 1.199 + }, [ 1.200 + "onInstallStarted", 1.201 + "onInstallEnded", 1.202 + ], check_test_2); 1.203 + install.install(); 1.204 + }); 1.205 + } 1.206 + }, AddonManager.UPDATE_WHEN_USER_REQUESTED); 1.207 +} 1.208 + 1.209 +function check_test_2() { 1.210 + ensure_test_completed(); 1.211 + 1.212 + AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(olda1) { 1.213 + do_check_neq(olda1, null); 1.214 + do_check_eq(olda1.version, "1.0"); 1.215 + do_check_true(isExtensionInAddonsList(profileDir, olda1.id)); 1.216 + 1.217 + shutdownManager(); 1.218 + 1.219 + startupManager(); 1.220 + 1.221 + do_check_true(isExtensionInAddonsList(profileDir, olda1.id)); 1.222 + 1.223 + AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) { 1.224 + do_check_neq(a1, null); 1.225 + do_check_eq(a1.version, "2.0"); 1.226 + do_check_true(isExtensionInAddonsList(profileDir, a1.id)); 1.227 + do_check_eq(a1.applyBackgroundUpdates, AddonManager.AUTOUPDATE_DISABLE); 1.228 + do_check_eq(a1.releaseNotesURI.spec, "http://example.com/updateInfo.xhtml"); 1.229 + 1.230 + a1.uninstall(); 1.231 + do_execute_soon(run_test_3); 1.232 + }); 1.233 + })); 1.234 +} 1.235 + 1.236 + 1.237 +// Check that an update check finds compatibility updates and applies them 1.238 +function run_test_3() { 1.239 + restartManager(); 1.240 + 1.241 + AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { 1.242 + do_check_neq(a2, null); 1.243 + do_check_false(a2.isActive); 1.244 + do_check_false(a2.isCompatible); 1.245 + do_check_true(a2.appDisabled); 1.246 + do_check_true(a2.isCompatibleWith("0")); 1.247 + 1.248 + a2.findUpdates({ 1.249 + onCompatibilityUpdateAvailable: function(addon) { 1.250 + do_check_true(a2.isCompatible); 1.251 + do_check_false(a2.appDisabled); 1.252 + do_check_false(a2.isActive); 1.253 + }, 1.254 + 1.255 + onUpdateAvailable: function(addon, install) { 1.256 + do_throw("Should not have seen an available update"); 1.257 + }, 1.258 + 1.259 + onNoUpdateAvailable: function(addon) { 1.260 + do_check_eq(addon, a2); 1.261 + do_execute_soon(check_test_3); 1.262 + } 1.263 + }, AddonManager.UPDATE_WHEN_USER_REQUESTED); 1.264 + }); 1.265 +} 1.266 + 1.267 +function check_test_3() { 1.268 + restartManager(); 1.269 + AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { 1.270 + do_check_neq(a2, null); 1.271 + do_check_true(a2.isActive); 1.272 + do_check_true(a2.isCompatible); 1.273 + do_check_false(a2.appDisabled); 1.274 + a2.uninstall(); 1.275 + 1.276 + run_test_4(); 1.277 + }); 1.278 +} 1.279 + 1.280 +// Checks that we see no compatibility information when there is none. 1.281 +function run_test_4() { 1.282 + AddonManager.getAddonByID("addon3@tests.mozilla.org", function(a3) { 1.283 + do_check_neq(a3, null); 1.284 + do_check_false(a3.isActive); 1.285 + do_check_false(a3.isCompatible); 1.286 + do_check_true(a3.appDisabled); 1.287 + do_check_true(a3.isCompatibleWith("5")); 1.288 + do_check_false(a3.isCompatibleWith("2")); 1.289 + 1.290 + a3.findUpdates({ 1.291 + sawUpdate: false, 1.292 + onCompatibilityUpdateAvailable: function(addon) { 1.293 + do_throw("Should not have seen compatibility information"); 1.294 + }, 1.295 + 1.296 + onNoCompatibilityUpdateAvailable: function(addon) { 1.297 + this.sawUpdate = true; 1.298 + }, 1.299 + 1.300 + onUpdateAvailable: function(addon, install) { 1.301 + do_throw("Should not have seen an available update"); 1.302 + }, 1.303 + 1.304 + onNoUpdateAvailable: function(addon) { 1.305 + do_check_true(this.sawUpdate); 1.306 + run_test_5(); 1.307 + } 1.308 + }, AddonManager.UPDATE_WHEN_USER_REQUESTED); 1.309 + }); 1.310 +} 1.311 + 1.312 +// Checks that compatibility info for future apps are detected but don't make 1.313 +// the item compatibile. 1.314 +function run_test_5() { 1.315 + AddonManager.getAddonByID("addon3@tests.mozilla.org", function(a3) { 1.316 + do_check_neq(a3, null); 1.317 + do_check_false(a3.isActive); 1.318 + do_check_false(a3.isCompatible); 1.319 + do_check_true(a3.appDisabled); 1.320 + do_check_true(a3.isCompatibleWith("5")); 1.321 + do_check_false(a3.isCompatibleWith("2")); 1.322 + 1.323 + a3.findUpdates({ 1.324 + sawUpdate: false, 1.325 + onCompatibilityUpdateAvailable: function(addon) { 1.326 + do_check_false(a3.isCompatible); 1.327 + do_check_true(a3.appDisabled); 1.328 + do_check_false(a3.isActive); 1.329 + this.sawUpdate = true; 1.330 + }, 1.331 + 1.332 + onNoCompatibilityUpdateAvailable: function(addon) { 1.333 + do_throw("Should have seen some compatibility information"); 1.334 + }, 1.335 + 1.336 + onUpdateAvailable: function(addon, install) { 1.337 + do_throw("Should not have seen an available update"); 1.338 + }, 1.339 + 1.340 + onNoUpdateAvailable: function(addon) { 1.341 + do_check_true(this.sawUpdate); 1.342 + do_execute_soon(check_test_5); 1.343 + } 1.344 + }, AddonManager.UPDATE_WHEN_USER_REQUESTED, "3.0"); 1.345 + }); 1.346 +} 1.347 + 1.348 +function check_test_5() { 1.349 + restartManager(); 1.350 + AddonManager.getAddonByID("addon3@tests.mozilla.org", function(a3) { 1.351 + do_check_neq(a3, null); 1.352 + do_check_false(a3.isActive); 1.353 + do_check_false(a3.isCompatible); 1.354 + do_check_true(a3.appDisabled); 1.355 + 1.356 + a3.uninstall(); 1.357 + do_execute_soon(run_test_6); 1.358 + }); 1.359 +} 1.360 + 1.361 +// Test that background update checks work 1.362 +function run_test_6() { 1.363 + restartManager(); 1.364 + 1.365 + writeInstallRDFForExtension({ 1.366 + id: "addon1@tests.mozilla.org", 1.367 + version: "1.0", 1.368 + updateURL: "http://localhost:" + gPort + "/data/test_update.rdf", 1.369 + targetApplications: [{ 1.370 + id: "xpcshell@tests.mozilla.org", 1.371 + minVersion: "1", 1.372 + maxVersion: "1" 1.373 + }], 1.374 + name: "Test Addon 1", 1.375 + }, profileDir); 1.376 + restartManager(); 1.377 + 1.378 + prepare_test({}, [ 1.379 + "onNewInstall", 1.380 + "onDownloadStarted", 1.381 + "onDownloadEnded" 1.382 + ], continue_test_6); 1.383 + 1.384 + // Fake a timer event to cause a background update and wait for the magic to 1.385 + // happen 1.386 + gInternalManager.notify(null); 1.387 +} 1.388 + 1.389 +function continue_test_6(install) { 1.390 + do_check_neq(install.existingAddon, null); 1.391 + do_check_eq(install.existingAddon.id, "addon1@tests.mozilla.org"); 1.392 + 1.393 + prepare_test({ 1.394 + "addon1@tests.mozilla.org": [ 1.395 + "onInstalling" 1.396 + ] 1.397 + }, [ 1.398 + "onInstallStarted", 1.399 + "onInstallEnded", 1.400 + ], callback_soon(check_test_6)); 1.401 +} 1.402 + 1.403 +function check_test_6(install) { 1.404 + do_check_eq(install.existingAddon.pendingUpgrade.install, install); 1.405 + 1.406 + restartManager(); 1.407 + AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) { 1.408 + do_check_neq(a1, null); 1.409 + do_check_eq(a1.version, "2.0"); 1.410 + do_check_eq(a1.releaseNotesURI.spec, "http://example.com/updateInfo.xhtml"); 1.411 + a1.uninstall(); 1.412 + do_execute_soon(run_test_7); 1.413 + }); 1.414 +} 1.415 + 1.416 +// Test that background update checks work for lightweight themes 1.417 +function run_test_7() { 1.418 + restartManager(); 1.419 + 1.420 + LightweightThemeManager.currentTheme = { 1.421 + id: "1", 1.422 + version: "1", 1.423 + name: "Test LW Theme", 1.424 + description: "A test theme", 1.425 + author: "Mozilla", 1.426 + homepageURL: "http://localhost:" + gPort + "/data/index.html", 1.427 + headerURL: "http://localhost:" + gPort + "/data/header.png", 1.428 + footerURL: "http://localhost:" + gPort + "/data/footer.png", 1.429 + previewURL: "http://localhost:" + gPort + "/data/preview.png", 1.430 + iconURL: "http://localhost:" + gPort + "/data/icon.png", 1.431 + updateURL: "http://localhost:" + gPort + "/data/lwtheme.js" 1.432 + }; 1.433 + 1.434 + // XXX The lightweight theme manager strips non-https updateURLs so hack it 1.435 + // back in. 1.436 + let themes = JSON.parse(Services.prefs.getCharPref("lightweightThemes.usedThemes")); 1.437 + do_check_eq(themes.length, 1); 1.438 + themes[0].updateURL = "http://localhost:" + gPort + "/data/lwtheme.js"; 1.439 + Services.prefs.setCharPref("lightweightThemes.usedThemes", JSON.stringify(themes)); 1.440 + 1.441 + testserver.registerPathHandler("/data/lwtheme.js", function(request, response) { 1.442 + response.write(JSON.stringify({ 1.443 + id: "1", 1.444 + version: "2", 1.445 + name: "Updated Theme", 1.446 + description: "A test theme", 1.447 + author: "Mozilla", 1.448 + homepageURL: "http://localhost:" + gPort + "/data/index2.html", 1.449 + headerURL: "http://localhost:" + gPort + "/data/header.png", 1.450 + footerURL: "http://localhost:" + gPort + "/data/footer.png", 1.451 + previewURL: "http://localhost:" + gPort + "/data/preview.png", 1.452 + iconURL: "http://localhost:" + gPort + "/data/icon2.png", 1.453 + updateURL: "http://localhost:" + gPort + "/data/lwtheme.js" 1.454 + })); 1.455 + }); 1.456 + 1.457 + AddonManager.getAddonByID("1@personas.mozilla.org", function(p1) { 1.458 + do_check_neq(p1, null); 1.459 + do_check_eq(p1.version, "1"); 1.460 + do_check_eq(p1.name, "Test LW Theme"); 1.461 + do_check_true(p1.isActive); 1.462 + do_check_eq(p1.installDate.getTime(), p1.updateDate.getTime()); 1.463 + 1.464 + // 5 seconds leeway seems like a lot, but tests can run slow and really if 1.465 + // this is within 5 seconds it is fine. If it is going to be wrong then it 1.466 + // is likely to be hours out at least 1.467 + do_check_true((Date.now() - p1.installDate.getTime()) < 5000); 1.468 + 1.469 + gInstallDate = p1.installDate.getTime(); 1.470 + 1.471 + prepare_test({ 1.472 + "1@personas.mozilla.org": [ 1.473 + ["onInstalling", false], 1.474 + "onInstalled" 1.475 + ] 1.476 + }, [ 1.477 + "onExternalInstall" 1.478 + ], check_test_7); 1.479 + 1.480 + // Fake a timer event to cause a background update and wait for the magic to 1.481 + // happen 1.482 + gInternalManager.notify(null); 1.483 + }); 1.484 +} 1.485 + 1.486 +function check_test_7() { 1.487 + AddonManager.getAddonByID("1@personas.mozilla.org", function(p1) { 1.488 + do_check_neq(p1, null); 1.489 + do_check_eq(p1.version, "2"); 1.490 + do_check_eq(p1.name, "Updated Theme"); 1.491 + do_check_eq(p1.installDate.getTime(), gInstallDate); 1.492 + do_check_true(p1.installDate.getTime() < p1.updateDate.getTime()); 1.493 + 1.494 + // 5 seconds leeway seems like a lot, but tests can run slow and really if 1.495 + // this is within 5 seconds it is fine. If it is going to be wrong then it 1.496 + // is likely to be hours out at least 1.497 + do_check_true((Date.now() - p1.updateDate.getTime()) < 5000); 1.498 + 1.499 + gInstallDate = p1.installDate.getTime(); 1.500 + 1.501 + do_execute_soon(run_test_8); 1.502 + }); 1.503 +} 1.504 + 1.505 +// Verify the parameter escaping in update urls. 1.506 +function run_test_8() { 1.507 + writeInstallRDFForExtension({ 1.508 + id: "addon1@tests.mozilla.org", 1.509 + version: "5.0", 1.510 + updateURL: "http://localhost:" + gPort + "/data/param_test.rdf" + PARAMS, 1.511 + targetApplications: [{ 1.512 + id: "xpcshell@tests.mozilla.org", 1.513 + minVersion: "1", 1.514 + maxVersion: "2" 1.515 + }], 1.516 + name: "Test Addon 1", 1.517 + }, profileDir); 1.518 + 1.519 + writeInstallRDFForExtension({ 1.520 + id: "addon2@tests.mozilla.org", 1.521 + version: "67.0.5b1", 1.522 + updateURL: "http://localhost:" + gPort + "/data/param_test.rdf" + PARAMS, 1.523 + targetApplications: [{ 1.524 + id: "toolkit@mozilla.org", 1.525 + minVersion: "0", 1.526 + maxVersion: "3" 1.527 + }], 1.528 + name: "Test Addon 2", 1.529 + }, profileDir); 1.530 + 1.531 + writeInstallRDFForExtension({ 1.532 + id: "addon3@tests.mozilla.org", 1.533 + version: "1.3+", 1.534 + updateURL: "http://localhost:" + gPort + "/data/param_test.rdf" + PARAMS, 1.535 + targetApplications: [{ 1.536 + id: "xpcshell@tests.mozilla.org", 1.537 + minVersion: "0", 1.538 + maxVersion: "0" 1.539 + }, { 1.540 + id: "toolkit@mozilla.org", 1.541 + minVersion: "0", 1.542 + maxVersion: "3" 1.543 + }], 1.544 + name: "Test Addon 3", 1.545 + }, profileDir); 1.546 + 1.547 + writeInstallRDFForExtension({ 1.548 + id: "addon4@tests.mozilla.org", 1.549 + version: "0.5ab6", 1.550 + updateURL: "http://localhost:" + gPort + "/data/param_test.rdf" + PARAMS, 1.551 + targetApplications: [{ 1.552 + id: "xpcshell@tests.mozilla.org", 1.553 + minVersion: "1", 1.554 + maxVersion: "5" 1.555 + }], 1.556 + name: "Test Addon 4", 1.557 + }, profileDir); 1.558 + 1.559 + writeInstallRDFForExtension({ 1.560 + id: "addon5@tests.mozilla.org", 1.561 + version: "1.0", 1.562 + updateURL: "http://localhost:" + gPort + "/data/param_test.rdf" + PARAMS, 1.563 + targetApplications: [{ 1.564 + id: "xpcshell@tests.mozilla.org", 1.565 + minVersion: "1", 1.566 + maxVersion: "1" 1.567 + }], 1.568 + name: "Test Addon 5", 1.569 + }, profileDir); 1.570 + 1.571 + writeInstallRDFForExtension({ 1.572 + id: "addon6@tests.mozilla.org", 1.573 + version: "1.0", 1.574 + updateURL: "http://localhost:" + gPort + "/data/param_test.rdf" + PARAMS, 1.575 + targetApplications: [{ 1.576 + id: "xpcshell@tests.mozilla.org", 1.577 + minVersion: "1", 1.578 + maxVersion: "1" 1.579 + }], 1.580 + name: "Test Addon 6", 1.581 + }, profileDir); 1.582 + 1.583 + restartManager(); 1.584 + 1.585 + AddonManager.getAddonByID("addon2@tests.mozilla.org", callback_soon(function(a2) { 1.586 + a2.userDisabled = true; 1.587 + restartManager(); 1.588 + 1.589 + testserver.registerPathHandler("/data/param_test.rdf", function(request, response) { 1.590 + do_check_neq(request.queryString, ""); 1.591 + let [req_version, item_id, item_version, 1.592 + item_maxappversion, item_status, 1.593 + app_id, app_version, current_app_version, 1.594 + app_os, app_abi, app_locale, update_type] = 1.595 + [decodeURIComponent(a) for each (a in request.queryString.split("/"))]; 1.596 + 1.597 + do_check_eq(req_version, "2"); 1.598 + 1.599 + switch(item_id) { 1.600 + case "addon1@tests.mozilla.org": 1.601 + do_check_eq(item_version, "5.0"); 1.602 + do_check_eq(item_maxappversion, "2"); 1.603 + do_check_eq(item_status, "userEnabled"); 1.604 + do_check_eq(app_version, "1"); 1.605 + do_check_eq(update_type, "97"); 1.606 + break; 1.607 + case "addon2@tests.mozilla.org": 1.608 + do_check_eq(item_version, "67.0.5b1"); 1.609 + do_check_eq(item_maxappversion, "3"); 1.610 + do_check_eq(item_status, "userDisabled"); 1.611 + do_check_eq(app_version, "1"); 1.612 + do_check_eq(update_type, "49"); 1.613 + break; 1.614 + case "addon3@tests.mozilla.org": 1.615 + do_check_eq(item_version, "1.3+"); 1.616 + do_check_eq(item_maxappversion, "0"); 1.617 + do_check_eq(item_status, "userEnabled,incompatible"); 1.618 + do_check_eq(app_version, "1"); 1.619 + do_check_eq(update_type, "112"); 1.620 + break; 1.621 + case "addon4@tests.mozilla.org": 1.622 + do_check_eq(item_version, "0.5ab6"); 1.623 + do_check_eq(item_maxappversion, "5"); 1.624 + do_check_eq(item_status, "userEnabled"); 1.625 + do_check_eq(app_version, "2"); 1.626 + do_check_eq(update_type, "98"); 1.627 + break; 1.628 + case "addon5@tests.mozilla.org": 1.629 + do_check_eq(item_version, "1.0"); 1.630 + do_check_eq(item_maxappversion, "1"); 1.631 + do_check_eq(item_status, "userEnabled"); 1.632 + do_check_eq(app_version, "1"); 1.633 + do_check_eq(update_type, "35"); 1.634 + break; 1.635 + case "addon6@tests.mozilla.org": 1.636 + do_check_eq(item_version, "1.0"); 1.637 + do_check_eq(item_maxappversion, "1"); 1.638 + do_check_eq(item_status, "userEnabled"); 1.639 + do_check_eq(app_version, "1"); 1.640 + do_check_eq(update_type, "99"); 1.641 + break; 1.642 + default: 1.643 + do_throw("Update request for unexpected add-on " + item_id); 1.644 + } 1.645 + 1.646 + do_check_eq(app_id, "xpcshell@tests.mozilla.org"); 1.647 + do_check_eq(current_app_version, "1"); 1.648 + do_check_eq(app_os, "XPCShell"); 1.649 + do_check_eq(app_abi, "noarch-spidermonkey"); 1.650 + do_check_eq(app_locale, "fr-FR"); 1.651 + 1.652 + request.setStatusLine(null, 500, "Server Error"); 1.653 + }); 1.654 + 1.655 + AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org", 1.656 + "addon2@tests.mozilla.org", 1.657 + "addon3@tests.mozilla.org", 1.658 + "addon4@tests.mozilla.org", 1.659 + "addon5@tests.mozilla.org", 1.660 + "addon6@tests.mozilla.org"], 1.661 + function([a1, a2, a3, a4, a5, a6]) { 1.662 + let count = 6; 1.663 + 1.664 + function run_next_test() { 1.665 + a1.uninstall(); 1.666 + a2.uninstall(); 1.667 + a3.uninstall(); 1.668 + a4.uninstall(); 1.669 + a5.uninstall(); 1.670 + a6.uninstall(); 1.671 + 1.672 + restartManager(); 1.673 + run_test_9(); 1.674 + } 1.675 + 1.676 + let compatListener = { 1.677 + onUpdateFinished: function(addon, error) { 1.678 + if (--count == 0) 1.679 + do_execute_soon(run_next_test); 1.680 + } 1.681 + }; 1.682 + 1.683 + let updateListener = { 1.684 + onUpdateAvailable: function(addon, update) { 1.685 + // Dummy so the update checker knows we care about new versions 1.686 + }, 1.687 + 1.688 + onUpdateFinished: function(addon, error) { 1.689 + if (--count == 0) 1.690 + do_execute_soon(run_next_test); 1.691 + } 1.692 + }; 1.693 + 1.694 + a1.findUpdates(updateListener, AddonManager.UPDATE_WHEN_USER_REQUESTED); 1.695 + a2.findUpdates(compatListener, AddonManager.UPDATE_WHEN_ADDON_INSTALLED); 1.696 + a3.findUpdates(updateListener, AddonManager.UPDATE_WHEN_PERIODIC_UPDATE); 1.697 + a4.findUpdates(updateListener, AddonManager.UPDATE_WHEN_NEW_APP_DETECTED, "2"); 1.698 + a5.findUpdates(compatListener, AddonManager.UPDATE_WHEN_NEW_APP_INSTALLED); 1.699 + a6.findUpdates(updateListener, AddonManager.UPDATE_WHEN_NEW_APP_INSTALLED); 1.700 + }); 1.701 + })); 1.702 +} 1.703 + 1.704 +// Tests that if an install.rdf claims compatibility then the add-on will be 1.705 +// seen as compatible regardless of what the update.rdf says. 1.706 +function run_test_9() { 1.707 + writeInstallRDFForExtension({ 1.708 + id: "addon4@tests.mozilla.org", 1.709 + version: "5.0", 1.710 + updateURL: "http://localhost:" + gPort + "/data/test_update.rdf", 1.711 + targetApplications: [{ 1.712 + id: "xpcshell@tests.mozilla.org", 1.713 + minVersion: "0", 1.714 + maxVersion: "1" 1.715 + }], 1.716 + name: "Test Addon 1", 1.717 + }, profileDir); 1.718 + 1.719 + restartManager(); 1.720 + 1.721 + AddonManager.getAddonByID("addon4@tests.mozilla.org", function(a4) { 1.722 + do_check_true(a4.isActive); 1.723 + do_check_true(a4.isCompatible); 1.724 + 1.725 + run_test_10(); 1.726 + }); 1.727 +} 1.728 + 1.729 +// Tests that a normal update check won't decrease a targetApplication's 1.730 +// maxVersion. 1.731 +function run_test_10() { 1.732 + AddonManager.getAddonByID("addon4@tests.mozilla.org", function(a4) { 1.733 + a4.findUpdates({ 1.734 + onUpdateFinished: function(addon) { 1.735 + do_check_true(addon.isCompatible); 1.736 + 1.737 + run_test_11(); 1.738 + } 1.739 + }, AddonManager.UPDATE_WHEN_PERIODIC_UPDATE); 1.740 + }); 1.741 +} 1.742 + 1.743 +// Tests that an update check for a new application will decrease a 1.744 +// targetApplication's maxVersion. 1.745 +function run_test_11() { 1.746 + AddonManager.getAddonByID("addon4@tests.mozilla.org", function(a4) { 1.747 + a4.findUpdates({ 1.748 + onUpdateFinished: function(addon) { 1.749 + do_check_false(addon.isCompatible); 1.750 + 1.751 + do_execute_soon(run_test_12); 1.752 + } 1.753 + }, AddonManager.UPDATE_WHEN_NEW_APP_INSTALLED); 1.754 + }); 1.755 +} 1.756 + 1.757 +// Check that the decreased maxVersion applied and disables the add-on 1.758 +function run_test_12() { 1.759 + restartManager(); 1.760 + 1.761 + AddonManager.getAddonByID("addon4@tests.mozilla.org", function(a4) { 1.762 + do_check_false(a4.isActive); 1.763 + do_check_false(a4.isCompatible); 1.764 + 1.765 + a4.uninstall(); 1.766 + do_execute_soon(run_test_13); 1.767 + }); 1.768 +} 1.769 + 1.770 +// Tests that no compatibility update is passed to the listener when there is 1.771 +// compatibility info for the current version of the app but not for the 1.772 +// version of the app that the caller requested an update check for. 1.773 +function run_test_13() { 1.774 + restartManager(); 1.775 + 1.776 + // Not initially compatible but the update check will make it compatible 1.777 + writeInstallRDFForExtension({ 1.778 + id: "addon7@tests.mozilla.org", 1.779 + version: "1.0", 1.780 + updateURL: "http://localhost:" + gPort + "/data/test_update.rdf", 1.781 + targetApplications: [{ 1.782 + id: "xpcshell@tests.mozilla.org", 1.783 + minVersion: "0", 1.784 + maxVersion: "0" 1.785 + }], 1.786 + name: "Test Addon 7", 1.787 + }, profileDir); 1.788 + restartManager(); 1.789 + 1.790 + AddonManager.getAddonByID("addon7@tests.mozilla.org", function(a7) { 1.791 + do_check_neq(a7, null); 1.792 + do_check_false(a7.isActive); 1.793 + do_check_false(a7.isCompatible); 1.794 + do_check_true(a7.appDisabled); 1.795 + do_check_true(a7.isCompatibleWith("0")); 1.796 + 1.797 + a7.findUpdates({ 1.798 + sawUpdate: false, 1.799 + onCompatibilityUpdateAvailable: function(addon) { 1.800 + do_throw("Should have not have seen compatibility information"); 1.801 + }, 1.802 + 1.803 + onUpdateAvailable: function(addon, install) { 1.804 + do_throw("Should not have seen an available update"); 1.805 + }, 1.806 + 1.807 + onUpdateFinished: function(addon) { 1.808 + do_check_true(addon.isCompatible); 1.809 + do_execute_soon(check_test_13); 1.810 + } 1.811 + }, AddonManager.UPDATE_WHEN_NEW_APP_DETECTED, "3.0"); 1.812 + }); 1.813 +} 1.814 + 1.815 +function check_test_13() { 1.816 + restartManager(); 1.817 + AddonManager.getAddonByID("addon7@tests.mozilla.org", function(a7) { 1.818 + do_check_neq(a7, null); 1.819 + do_check_true(a7.isActive); 1.820 + do_check_true(a7.isCompatible); 1.821 + do_check_false(a7.appDisabled); 1.822 + 1.823 + a7.uninstall(); 1.824 + do_execute_soon(run_test_14); 1.825 + }); 1.826 +} 1.827 + 1.828 +// Test that background update checks doesn't update an add-on that isn't 1.829 +// allowed to update automatically. 1.830 +function run_test_14() { 1.831 + restartManager(); 1.832 + 1.833 + // Have an add-on there that will be updated so we see some events from it 1.834 + writeInstallRDFForExtension({ 1.835 + id: "addon1@tests.mozilla.org", 1.836 + version: "1.0", 1.837 + updateURL: "http://localhost:" + gPort + "/data/test_update.rdf", 1.838 + targetApplications: [{ 1.839 + id: "xpcshell@tests.mozilla.org", 1.840 + minVersion: "1", 1.841 + maxVersion: "1" 1.842 + }], 1.843 + name: "Test Addon 1", 1.844 + }, profileDir); 1.845 + 1.846 + writeInstallRDFForExtension({ 1.847 + id: "addon8@tests.mozilla.org", 1.848 + version: "1.0", 1.849 + updateURL: "http://localhost:" + gPort + "/data/test_update.rdf", 1.850 + targetApplications: [{ 1.851 + id: "xpcshell@tests.mozilla.org", 1.852 + minVersion: "1", 1.853 + maxVersion: "1" 1.854 + }], 1.855 + name: "Test Addon 8", 1.856 + }, profileDir); 1.857 + restartManager(); 1.858 + 1.859 + AddonManager.getAddonByID("addon8@tests.mozilla.org", function(a8) { 1.860 + a8.applyBackgroundUpdates = AddonManager.AUTOUPDATE_DISABLE; 1.861 + 1.862 + // The background update check will find updates for both add-ons but only 1.863 + // proceed to install one of them. 1.864 + AddonManager.addInstallListener({ 1.865 + onNewInstall: function(aInstall) { 1.866 + if (aInstall.existingAddon.id != "addon1@tests.mozilla.org" && 1.867 + aInstall.existingAddon.id != "addon8@tests.mozilla.org") 1.868 + do_throw("Saw unexpected onNewInstall for " + aInstall.existingAddon.id); 1.869 + }, 1.870 + 1.871 + onDownloadStarted: function(aInstall) { 1.872 + do_check_eq(aInstall.existingAddon.id, "addon1@tests.mozilla.org"); 1.873 + }, 1.874 + 1.875 + onDownloadEnded: function(aInstall) { 1.876 + do_check_eq(aInstall.existingAddon.id, "addon1@tests.mozilla.org"); 1.877 + }, 1.878 + 1.879 + onDownloadFailed: function(aInstall) { 1.880 + do_throw("Should not have seen onDownloadFailed event"); 1.881 + }, 1.882 + 1.883 + onDownloadCancelled: function(aInstall) { 1.884 + do_throw("Should not have seen onDownloadCancelled event"); 1.885 + }, 1.886 + 1.887 + onInstallStarted: function(aInstall) { 1.888 + do_check_eq(aInstall.existingAddon.id, "addon1@tests.mozilla.org"); 1.889 + }, 1.890 + 1.891 + onInstallEnded: function(aInstall) { 1.892 + do_check_eq(aInstall.existingAddon.id, "addon1@tests.mozilla.org"); 1.893 + do_check_eq(aInstall.existingAddon.pendingUpgrade.install, aInstall); 1.894 + do_execute_soon(check_test_14); 1.895 + }, 1.896 + 1.897 + onInstallFailed: function(aInstall) { 1.898 + do_throw("Should not have seen onInstallFailed event"); 1.899 + }, 1.900 + 1.901 + onInstallCancelled: function(aInstall) { 1.902 + do_throw("Should not have seen onInstallCancelled event"); 1.903 + }, 1.904 + }); 1.905 + 1.906 + // Fake a timer event 1.907 + gInternalManager.notify(null); 1.908 + }); 1.909 +} 1.910 + 1.911 +function check_test_14() { 1.912 + restartManager(); 1.913 + AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org", 1.914 + "addon8@tests.mozilla.org"], function([a1, a8]) { 1.915 + do_check_neq(a1, null); 1.916 + do_check_eq(a1.version, "2.0"); 1.917 + a1.uninstall(); 1.918 + 1.919 + do_check_neq(a8, null); 1.920 + do_check_eq(a8.version, "1.0"); 1.921 + a8.uninstall(); 1.922 + 1.923 + do_execute_soon(run_test_15); 1.924 + }); 1.925 +} 1.926 + 1.927 +// Test that background update checks doesn't update an add-on that is 1.928 +// pending uninstall 1.929 +function run_test_15() { 1.930 + restartManager(); 1.931 + 1.932 + // Have an add-on there that will be updated so we see some events from it 1.933 + writeInstallRDFForExtension({ 1.934 + id: "addon1@tests.mozilla.org", 1.935 + version: "1.0", 1.936 + updateURL: "http://localhost:" + gPort + "/data/test_update.rdf", 1.937 + targetApplications: [{ 1.938 + id: "xpcshell@tests.mozilla.org", 1.939 + minVersion: "1", 1.940 + maxVersion: "1" 1.941 + }], 1.942 + name: "Test Addon 1", 1.943 + }, profileDir); 1.944 + 1.945 + writeInstallRDFForExtension({ 1.946 + id: "addon8@tests.mozilla.org", 1.947 + version: "1.0", 1.948 + updateURL: "http://localhost:" + gPort + "/data/test_update.rdf", 1.949 + targetApplications: [{ 1.950 + id: "xpcshell@tests.mozilla.org", 1.951 + minVersion: "1", 1.952 + maxVersion: "1" 1.953 + }], 1.954 + name: "Test Addon 8", 1.955 + }, profileDir); 1.956 + restartManager(); 1.957 + 1.958 + AddonManager.getAddonByID("addon8@tests.mozilla.org", function(a8) { 1.959 + a8.uninstall(); 1.960 + do_check_false(hasFlag(a8.permissions, AddonManager.PERM_CAN_UPGRADE)); 1.961 + 1.962 + // The background update check will find updates for both add-ons but only 1.963 + // proceed to install one of them. 1.964 + AddonManager.addInstallListener({ 1.965 + onNewInstall: function(aInstall) { 1.966 + if (aInstall.existingAddon.id != "addon1@tests.mozilla.org" && 1.967 + aInstall.existingAddon.id != "addon8@tests.mozilla.org") 1.968 + do_throw("Saw unexpected onNewInstall for " + aInstall.existingAddon.id); 1.969 + }, 1.970 + 1.971 + onDownloadStarted: function(aInstall) { 1.972 + do_check_eq(aInstall.existingAddon.id, "addon1@tests.mozilla.org"); 1.973 + }, 1.974 + 1.975 + onDownloadEnded: function(aInstall) { 1.976 + do_check_eq(aInstall.existingAddon.id, "addon1@tests.mozilla.org"); 1.977 + }, 1.978 + 1.979 + onDownloadFailed: function(aInstall) { 1.980 + do_throw("Should not have seen onDownloadFailed event"); 1.981 + }, 1.982 + 1.983 + onDownloadCancelled: function(aInstall) { 1.984 + do_throw("Should not have seen onDownloadCancelled event"); 1.985 + }, 1.986 + 1.987 + onInstallStarted: function(aInstall) { 1.988 + do_check_eq(aInstall.existingAddon.id, "addon1@tests.mozilla.org"); 1.989 + }, 1.990 + 1.991 + onInstallEnded: function(aInstall) { 1.992 + do_check_eq(aInstall.existingAddon.id, "addon1@tests.mozilla.org"); 1.993 + do_execute_soon(check_test_15); 1.994 + }, 1.995 + 1.996 + onInstallFailed: function(aInstall) { 1.997 + do_throw("Should not have seen onInstallFailed event"); 1.998 + }, 1.999 + 1.1000 + onInstallCancelled: function(aInstall) { 1.1001 + do_throw("Should not have seen onInstallCancelled event"); 1.1002 + }, 1.1003 + }); 1.1004 + 1.1005 + // Fake a timer event 1.1006 + gInternalManager.notify(null); 1.1007 + }); 1.1008 +} 1.1009 + 1.1010 +function check_test_15() { 1.1011 + restartManager(); 1.1012 + AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org", 1.1013 + "addon8@tests.mozilla.org"], function([a1, a8]) { 1.1014 + do_check_neq(a1, null); 1.1015 + do_check_eq(a1.version, "2.0"); 1.1016 + a1.uninstall(); 1.1017 + 1.1018 + do_check_eq(a8, null); 1.1019 + 1.1020 + do_execute_soon(run_test_16); 1.1021 + }); 1.1022 +} 1.1023 + 1.1024 +// Test that the update check correctly observes the 1.1025 +// extensions.strictCompatibility pref and compatibility overrides. 1.1026 +function run_test_16() { 1.1027 + restartManager(); 1.1028 + 1.1029 + writeInstallRDFForExtension({ 1.1030 + id: "addon9@tests.mozilla.org", 1.1031 + version: "1.0", 1.1032 + updateURL: "http://localhost:" + gPort + "/data/test_update.rdf", 1.1033 + targetApplications: [{ 1.1034 + id: "xpcshell@tests.mozilla.org", 1.1035 + minVersion: "0.1", 1.1036 + maxVersion: "0.2" 1.1037 + }], 1.1038 + name: "Test Addon 9", 1.1039 + }, profileDir); 1.1040 + restartManager(); 1.1041 + 1.1042 + AddonManager.addInstallListener({ 1.1043 + onNewInstall: function(aInstall) { 1.1044 + if (aInstall.existingAddon.id != "addon9@tests.mozilla.org") 1.1045 + do_throw("Saw unexpected onNewInstall for " + aInstall.existingAddon.id); 1.1046 + do_check_eq(aInstall.version, "2.0"); 1.1047 + }, 1.1048 + onDownloadFailed: function(aInstall) { 1.1049 + do_execute_soon(run_test_17); 1.1050 + } 1.1051 + }); 1.1052 + 1.1053 + Services.prefs.setCharPref(PREF_GETADDONS_BYIDS_PERFORMANCE, 1.1054 + "http://localhost:" + gPort + "/data/test_update.xml"); 1.1055 + Services.prefs.setBoolPref(PREF_GETADDONS_CACHE_ENABLED, true); 1.1056 + // Fake a timer event 1.1057 + gInternalManager.notify(null); 1.1058 +} 1.1059 + 1.1060 +// Test that the update check correctly observes when an addon opts-in to 1.1061 +// strict compatibility checking. 1.1062 +function run_test_17() { 1.1063 + 1.1064 + writeInstallRDFForExtension({ 1.1065 + id: "addon11@tests.mozilla.org", 1.1066 + version: "1.0", 1.1067 + updateURL: "http://localhost:" + gPort + "/data/test_update.rdf", 1.1068 + targetApplications: [{ 1.1069 + id: "xpcshell@tests.mozilla.org", 1.1070 + minVersion: "0.1", 1.1071 + maxVersion: "0.2" 1.1072 + }], 1.1073 + name: "Test Addon 11", 1.1074 + }, profileDir); 1.1075 + restartManager(); 1.1076 + 1.1077 + AddonManager.getAddonByID("addon11@tests.mozilla.org", function(a11) { 1.1078 + do_check_neq(a11, null); 1.1079 + 1.1080 + a11.findUpdates({ 1.1081 + onCompatibilityUpdateAvailable: function() { 1.1082 + do_throw("Should have not have seen compatibility information"); 1.1083 + }, 1.1084 + 1.1085 + onUpdateAvailable: function() { 1.1086 + do_throw("Should not have seen an available update"); 1.1087 + }, 1.1088 + 1.1089 + onUpdateFinished: function() { 1.1090 + do_execute_soon(end_test); 1.1091 + } 1.1092 + }, AddonManager.UPDATE_WHEN_USER_REQUESTED); 1.1093 + }); 1.1094 +}