216 lines
5.8 KiB
JavaScript
216 lines
5.8 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
* http://creativecommons.org/publicdomain/zero/1.0/
|
|
*/
|
|
|
|
// 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,
|
|
"http://example.com/data/test_update_addons.json"
|
|
);
|
|
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,
|
|
updateURL: "http://example.com/update.json",
|
|
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",
|
|
update_link: "http://example.com/addons/test_update9_2.xpi",
|
|
applications: {
|
|
gecko: {
|
|
strict_min_version: "1",
|
|
advisory_max_version: "1",
|
|
},
|
|
},
|
|
},
|
|
|
|
// Incompatible when strict compatibility is enabled
|
|
{
|
|
version: "3.0",
|
|
update_link: "http://example.com/addons/test_update9_3.xpi",
|
|
applications: {
|
|
gecko: {
|
|
strict_min_version: "0.9",
|
|
advisory_max_version: "0.9",
|
|
},
|
|
},
|
|
},
|
|
|
|
// Addon for future version of app
|
|
{
|
|
version: "4.0",
|
|
update_link: "http://example.com/addons/test_update9_5.xpi",
|
|
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,
|
|
updateURL: "http://example.com/update.json",
|
|
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",
|
|
update_link: "http://example.com/addons/test_update10.xpi",
|
|
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,
|
|
updateURL: "http://example.com/update.json",
|
|
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",
|
|
update_link: "http://example.com/addons/test_update11.xpi",
|
|
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();
|
|
});
|