Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

/* Any copyright is dedicated to the Public Domain.
*/
// This verifies that add-on update checks work in conjunction with
// strict compatibility settings.
const PREF_GETADDONS_CACHE_ENABLED = "extensions.getAddons.cache.enabled";
// The test extension uses an insecure update url.
Services.prefs.setBoolPref(PREF_EM_CHECK_UPDATE_SECURITY, false);
Services.prefs.setBoolPref(PREF_EM_STRICT_COMPATIBILITY, false);
const appId = "toolkit@mozilla.org";
testserver = createHttpServer({ hosts: ["example.com"] });
testserver.registerDirectory("/data/", do_get_file("data"));
add_task(async function setup() {
createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1");
AddonTestUtils.updateReason = AddonManager.UPDATE_WHEN_USER_REQUESTED;
Services.prefs.setCharPref(
PREF_GETADDONS_BYIDS,
);
Services.prefs.setBoolPref(PREF_GETADDONS_CACHE_ENABLED, true);
});
// Test that the update check correctly observes the
// extensions.strictCompatibility pref.
add_task(async function test_update_strict() {
const ID = "addon9@tests.mozilla.org";
let xpi = await createAddon({
id: ID,
targetApplications: [
{
id: "xpcshell@tests.mozilla.org",
minVersion: "0.1",
maxVersion: "0.2",
},
],
});
await manuallyInstall(xpi, AddonTestUtils.profileExtensions, ID);
await promiseStartupManager();
await AddonRepository.backgroundUpdateCheck();
let UPDATE = {
addons: {
[ID]: {
updates: [
{
version: "2.0",
applications: {
gecko: {
strict_min_version: "1",
advisory_max_version: "1",
},
},
},
// Incompatible when strict compatibility is enabled
{
version: "3.0",
applications: {
gecko: {
strict_min_version: "0.9",
advisory_max_version: "0.9",
},
},
},
// Addon for future version of app
{
version: "4.0",
applications: {
gecko: {
strict_min_version: "5",
advisory_max_version: "6",
},
},
},
],
},
},
};
AddonTestUtils.registerJSON(testserver, "/update.json", UPDATE);
let addon = await AddonManager.getAddonByID(ID);
let { updateAvailable } = await promiseFindAddonUpdates(addon);
Assert.notEqual(updateAvailable, null, "Got update");
Assert.equal(
updateAvailable.version,
"3.0",
"The correct update was selected"
);
await addon.uninstall();
await promiseShutdownManager();
});
// Tests that compatibility updates are applied to addons when the updated
// compatibility data wouldn't match with strict compatibility enabled.
add_task(async function test_update_strict2() {
const ID = "addon10@tests.mozilla.org";
let xpi = createAddon({
id: ID,
targetApplications: [
{
id: appId,
minVersion: "0.1",
maxVersion: "0.2",
},
],
});
await manuallyInstall(xpi, AddonTestUtils.profileExtensions, ID);
await promiseStartupManager();
await AddonRepository.backgroundUpdateCheck();
const UPDATE = {
addons: {
[ID]: {
updates: [
{
version: "1.0",
applications: {
gecko: {
strict_min_version: "0.1",
advisory_max_version: "0.4",
},
},
},
],
},
},
};
AddonTestUtils.registerJSON(testserver, "/update.json", UPDATE);
let addon = await AddonManager.getAddonByID(ID);
notEqual(addon, null);
let result = await promiseFindAddonUpdates(addon);
ok(result.compatibilityUpdate, "Should have seen a compatibility update");
ok(!result.updateAvailable, "Should not have seen a version update");
await addon.uninstall();
await promiseShutdownManager();
});
// Test that the update check correctly observes when an addon opts-in to
// strict compatibility checking.
add_task(async function test_update_strict_optin() {
const ID = "addon11@tests.mozilla.org";
let xpi = await createAddon({
id: ID,
targetApplications: [
{
id: appId,
minVersion: "0.1",
maxVersion: "0.2",
},
],
});
await manuallyInstall(xpi, AddonTestUtils.profileExtensions, ID);
await promiseStartupManager();
await AddonRepository.backgroundUpdateCheck();
const UPDATE = {
addons: {
[ID]: {
updates: [
{
version: "2.0",
applications: {
gecko: {
strict_min_version: "0.1",
strict_max_version: "0.2",
},
},
},
],
},
},
};
AddonTestUtils.registerJSON(testserver, "/update.json", UPDATE);
let addon = await AddonManager.getAddonByID(ID);
notEqual(addon, null);
let result = await AddonTestUtils.promiseFindAddonUpdates(addon);
ok(
!result.compatibilityUpdate,
"Should not have seen a compatibility update"
);
ok(!result.updateAvailable, "Should not have seen a version update");
await addon.uninstall();
await promiseShutdownManager();
});