Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
"use strict";
/**
* This file tests the background update UI in about:preferences.
*/
ChromeUtils.defineESModuleGetters(this, {
UpdateUtils: "resource://gre/modules/UpdateUtils.sys.mjs",
});
const BACKGROUND_UPDATE_PREF = "app.update.background.enabled";
add_task(async function testBackgroundUpdateSettingUI() {
if (!AppConstants.MOZ_UPDATE_AGENT) {
// The element that we are testing in about:preferences is #ifdef'ed out of
// the file if MOZ_UPDATE_AGENT isn't defined. So there is nothing to
// test in that case.
logTestInfo(
`
===============================================================================
WARNING! This test involves background update, but background tasks are
disabled. This test will unconditionally pass since the feature it
wants to test isn't available.
===============================================================================
`
);
// Some of our testing environments do not consider a test to have passed if
// it didn't make any assertions.
ok(true, "Unconditionally passing test");
return;
}
let tab = await BrowserTestUtils.openNewForegroundTab(
gBrowser,
"about:preferences"
);
const originalBackgroundUpdateVal = await UpdateUtils.readUpdateConfigSetting(
BACKGROUND_UPDATE_PREF
);
const originalUpdateAutoVal = await UpdateUtils.getAppUpdateAutoEnabled();
registerCleanupFunction(async () => {
await BrowserTestUtils.removeTab(tab);
await UpdateUtils.writeUpdateConfigSetting(
BACKGROUND_UPDATE_PREF,
originalBackgroundUpdateVal
);
await UpdateUtils.setAppUpdateAutoEnabled(originalUpdateAutoVal);
});
// If auto update is disabled, the control for background update should be
// disabled, since we cannot update in the background if we can't update
// automatically.
await UpdateUtils.setAppUpdateAutoEnabled(false);
await SpecialPowers.spawn(
tab.linkedBrowser,
[UpdateUtils.PER_INSTALLATION_PREFS_SUPPORTED],
async perInstallationPrefsSupported => {
let backgroundUpdateCheckbox =
content.document.getElementById("backgroundUpdate");
is(
backgroundUpdateCheckbox.hidden,
!perInstallationPrefsSupported,
`The background update UI should ${
perInstallationPrefsSupported ? "not" : ""
} be hidden when and perInstallationPrefsSupported is ` +
`${perInstallationPrefsSupported}`
);
if (perInstallationPrefsSupported) {
is(
backgroundUpdateCheckbox.disabled,
true,
`The background update UI should be disabled when auto update is ` +
`disabled`
);
}
}
);
if (!UpdateUtils.PER_INSTALLATION_PREFS_SUPPORTED) {
// The remaining tests only make sense on platforms where per-installation
// prefs are supported and the UI will ever actually be displayed
return;
}
await UpdateUtils.setAppUpdateAutoEnabled(true);
await UpdateUtils.writeUpdateConfigSetting(BACKGROUND_UPDATE_PREF, true);
await SpecialPowers.spawn(tab.linkedBrowser, [], async function () {
let backgroundUpdateCheckbox =
content.document.getElementById("backgroundUpdate");
is(
backgroundUpdateCheckbox.disabled,
false,
`The background update UI should not be disabled when auto update is ` +
`enabled`
);
is(
backgroundUpdateCheckbox.checked,
true,
"After enabling background update, the checkbox should be checked"
);
// Note that this action results in asynchronous activity. Normally when
// we change the update config, we await on the function to wait for the
// value to be written to the disk. We can't easily await on the UI state
// though. Luckily, we don't have to because reads/writes of the config file
// are serialized. So when we verify the written value by awaiting on
// readUpdateConfigSetting(), that will also wait for the value to be
// written to disk and for this UI to react to that.
backgroundUpdateCheckbox.click();
});
is(
await UpdateUtils.readUpdateConfigSetting(BACKGROUND_UPDATE_PREF),
false,
"Toggling the checkbox should have changed the setting value to false"
);
await SpecialPowers.spawn(tab.linkedBrowser, [], async function () {
let backgroundUpdateCheckbox =
content.document.getElementById("backgroundUpdate");
is(
backgroundUpdateCheckbox.checked,
false,
"After toggling the checked checkbox, it should be unchecked."
);
// Like the last call like this one, this initiates asynchronous behavior.
backgroundUpdateCheckbox.click();
});
is(
await UpdateUtils.readUpdateConfigSetting(BACKGROUND_UPDATE_PREF),
true,
"Toggling the checkbox should have changed the setting value to true"
);
await SpecialPowers.spawn(tab.linkedBrowser, [], async function () {
is(
content.document.getElementById("backgroundUpdate").checked,
true,
"After toggling the unchecked checkbox, it should be checked"
);
});
// Test that the UI reacts to observed setting changes properly.
await UpdateUtils.writeUpdateConfigSetting(BACKGROUND_UPDATE_PREF, false);
await SpecialPowers.spawn(tab.linkedBrowser, [], async function () {
is(
content.document.getElementById("backgroundUpdate").checked,
false,
"Externally disabling background update should uncheck the checkbox"
);
});
await UpdateUtils.writeUpdateConfigSetting(BACKGROUND_UPDATE_PREF, true);
await SpecialPowers.spawn(tab.linkedBrowser, [], async function () {
is(
content.document.getElementById("backgroundUpdate").checked,
true,
"Externally enabling background update should check the checkbox"
);
});
});