toolkit/mozapps/extensions/test/xpcshell/test_update.js

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

mercurial