Bug 1220911: Switch test_experiment.js to task style. r=rhelmer

Before changing the handling of experiments make the tests a bit more readable
and use BootstrapMonitor to verify things.
This commit is contained in:
Dave Townsend 2015-11-09 15:02:05 -08:00
parent c5bfb6b827
commit ea9d8c6a76
3 changed files with 105 additions and 85 deletions

View File

@ -0,0 +1 @@
Components.utils.import("resource://xpcshell-data/BootstrapMonitor.jsm").monitor(this);

View File

@ -1404,6 +1404,23 @@ function ensure_test_completed() {
do_check_eq(gExpectedInstalls.length, 0);
}
/**
* Returns a promise that resolves when the given add-on event is fired. The
* resolved value is an array of arguments passed for the event.
*/
function promiseAddonEvent(event) {
return new Promise(resolve => {
let listener = {
[event]: function(...args) {
AddonManager.removeAddonListener(listener);
resolve(args);
}
}
AddonManager.addAddonListener(listener);
});
}
/**
* A helper method to install an array of AddonInstall to completion and then
* call a provided callback.

View File

@ -3,10 +3,12 @@
var scope = Components.utils.import("resource://gre/modules/addons/XPIProvider.jsm");
const XPIProvider = scope.XPIProvider;
const ID = "experiment1@tests.mozilla.org";
var gIsNightly = false;
function run_test() {
BootstrapMonitor.init();
createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2");
startupManager();
@ -15,115 +17,115 @@ function run_test() {
run_next_test();
}
add_test(function test_experiment() {
AddonManager.getInstallForFile(do_get_addon("test_experiment1"), (install) => {
completeAllInstalls([install], () => {
AddonManager.getAddonByID("experiment1@tests.mozilla.org", (addon) => {
Assert.ok(addon, "Addon is found.");
add_task(function* test_experiment() {
BootstrapMonitor.checkAddonNotInstalled(ID);
BootstrapMonitor.checkAddonNotStarted(ID);
Assert.ok(addon.userDisabled, "Experiments are userDisabled by default.");
Assert.ok(!addon.appDisabled, "Experiments are not appDisabled by compatibility.");
Assert.equal(addon.isActive, false, "Add-on is not active.");
Assert.equal(addon.updateURL, null, "No updateURL for experiments.");
Assert.equal(addon.applyBackgroundUpdates, AddonManager.AUTOUPDATE_DISABLE,
"Background updates are disabled.");
Assert.equal(addon.permissions, AddonManager.PERM_CAN_UNINSTALL,
"Permissions are minimal.");
Assert.ok(!(addon.pendingOperations & AddonManager.PENDING_ENABLE),
"Should not be pending enable");
Assert.ok(!(addon.pendingOperations & AddonManager.PENDING_DISABLE),
"Should not be pending disable");
yield promiseInstallAllFiles([do_get_addon("test_experiment1")]);
// Setting applyBackgroundUpdates should not work.
addon.applyBackgroundUpdates = AddonManager.AUTOUPDATE_ENABLE;
Assert.equal(addon.applyBackgroundUpdates, AddonManager.AUTOUPDATE_DISABLE,
"Setting applyBackgroundUpdates shouldn't do anything.");
BootstrapMonitor.checkAddonInstalled(ID, "1.0");
BootstrapMonitor.checkAddonNotStarted(ID);
let noCompatibleCalled = false;
let noUpdateCalled = false;
let finishedCalled = false;
let addon = yield promiseAddonByID(ID);
Assert.ok(addon, "Addon is found.");
let listener = {
onNoCompatibilityUpdateAvailable: () => { noCompatibleCalled = true; },
onNoUpdateAvailable: () => { noUpdateCalled = true; },
onUpdateFinished: () => { finishedCalled = true; },
};
Assert.ok(addon.userDisabled, "Experiments are userDisabled by default.");
Assert.ok(!addon.appDisabled, "Experiments are not appDisabled by compatibility.");
Assert.equal(addon.isActive, false, "Add-on is not active.");
Assert.equal(addon.updateURL, null, "No updateURL for experiments.");
Assert.equal(addon.applyBackgroundUpdates, AddonManager.AUTOUPDATE_DISABLE,
"Background updates are disabled.");
Assert.equal(addon.permissions, AddonManager.PERM_CAN_UNINSTALL,
"Permissions are minimal.");
Assert.ok(!(addon.pendingOperations & AddonManager.PENDING_ENABLE),
"Should not be pending enable");
Assert.ok(!(addon.pendingOperations & AddonManager.PENDING_DISABLE),
"Should not be pending disable");
addon.findUpdates(listener, "testing", null, null);
Assert.ok(noCompatibleCalled, "Listener called.");
Assert.ok(noUpdateCalled, "Listener called.");
Assert.ok(finishedCalled, "Listener called.");
// Setting applyBackgroundUpdates should not work.
addon.applyBackgroundUpdates = AddonManager.AUTOUPDATE_ENABLE;
Assert.equal(addon.applyBackgroundUpdates, AddonManager.AUTOUPDATE_DISABLE,
"Setting applyBackgroundUpdates shouldn't do anything.");
run_next_test();
});
});
});
let noCompatibleCalled = false;
let noUpdateCalled = false;
let finishedCalled = false;
let listener = {
onNoCompatibilityUpdateAvailable: () => { noCompatibleCalled = true; },
onNoUpdateAvailable: () => { noUpdateCalled = true; },
onUpdateFinished: () => { finishedCalled = true; },
};
addon.findUpdates(listener, "testing", null, null);
Assert.ok(noCompatibleCalled, "Listener called.");
Assert.ok(noUpdateCalled, "Listener called.");
Assert.ok(finishedCalled, "Listener called.");
});
// Changes to userDisabled should not be persisted to the database.
add_test(function test_userDisabledNotPersisted() {
AddonManager.getAddonByID("experiment1@tests.mozilla.org", (addon) => {
Assert.ok(addon, "Add-on is found.");
Assert.ok(addon.userDisabled, "Add-on is user disabled.");
add_task(function* test_userDisabledNotPersisted() {
let addon = yield promiseAddonByID(ID);
Assert.ok(addon, "Add-on is found.");
Assert.ok(addon.userDisabled, "Add-on is user disabled.");
let listener = {
onEnabled: (addon2) => {
AddonManager.removeAddonListener(listener);
let promise = promiseAddonEvent("onEnabled");
addon.userDisabled = false;
let [addon2] = yield promise;
Assert.equal(addon2.id, addon.id, "Changed add-on matches expected.");
Assert.equal(addon2.userDisabled, false, "Add-on is no longer user disabled.");
Assert.ok(addon2.isActive, "Add-on is active.");
BootstrapMonitor.checkAddonInstalled(ID, "1.0");
BootstrapMonitor.checkAddonStarted(ID, "1.0");
Assert.ok("experiment1@tests.mozilla.org" in XPIProvider.bootstrappedAddons,
"Experiment add-on listed in XPIProvider bootstrapped list.");
Assert.equal(addon2.id, addon.id, "Changed add-on matches expected.");
Assert.equal(addon2.userDisabled, false, "Add-on is no longer user disabled.");
Assert.ok(addon2.isActive, "Add-on is active.");
AddonManager.getAddonByID("experiment1@tests.mozilla.org", (addon) => {
Assert.ok(addon, "Add-on retrieved.");
Assert.equal(addon.userDisabled, false, "Add-on is still enabled after API retrieve.");
Assert.ok(addon.isActive, "Add-on is still active.");
Assert.ok(!(addon.pendingOperations & AddonManager.PENDING_ENABLE),
"Should not be pending enable");
Assert.ok(!(addon.pendingOperations & AddonManager.PENDING_DISABLE),
"Should not be pending disable");
Assert.ok(ID in XPIProvider.bootstrappedAddons,
"Experiment add-on listed in XPIProvider bootstrapped list.");
// Now when we restart the manager the add-on should revert state.
restartManager();
let persisted = JSON.parse(Services.prefs.getCharPref("extensions.bootstrappedAddons"));
Assert.ok(!("experiment1@tests.mozilla.org" in persisted),
"Experiment add-on not persisted to bootstrappedAddons.");
addon = yield promiseAddonByID(ID);
Assert.ok(addon, "Add-on retrieved.");
Assert.equal(addon.userDisabled, false, "Add-on is still enabled after API retrieve.");
Assert.ok(addon.isActive, "Add-on is still active.");
Assert.ok(!(addon.pendingOperations & AddonManager.PENDING_ENABLE),
"Should not be pending enable");
Assert.ok(!(addon.pendingOperations & AddonManager.PENDING_DISABLE),
"Should not be pending disable");
AddonManager.getAddonByID("experiment1@tests.mozilla.org", (addon) => {
Assert.ok(addon, "Add-on retrieved.");
Assert.ok(addon.userDisabled, "Add-on is disabled after restart.");
Assert.equal(addon.isActive, false, "Add-on is not active after restart.");
addon.uninstall();
// Now when we restart the manager the add-on should revert state.
yield promiseRestartManager();
let persisted = JSON.parse(Services.prefs.getCharPref("extensions.bootstrappedAddons"));
Assert.ok(!(ID in persisted),
"Experiment add-on not persisted to bootstrappedAddons.");
run_next_test();
});
});
},
};
BootstrapMonitor.checkAddonInstalled(ID, "1.0");
BootstrapMonitor.checkAddonNotStarted(ID);
AddonManager.addAddonListener(listener);
addon.userDisabled = false;
});
addon = yield promiseAddonByID(ID);
Assert.ok(addon, "Add-on retrieved.");
Assert.ok(addon.userDisabled, "Add-on is disabled after restart.");
Assert.equal(addon.isActive, false, "Add-on is not active after restart.");
addon.uninstall();
BootstrapMonitor.checkAddonNotInstalled(ID);
BootstrapMonitor.checkAddonNotStarted(ID);
});
add_test(function test_checkCompatibility() {
add_task(function test_checkCompatibility() {
if (gIsNightly)
Services.prefs.setBoolPref("extensions.checkCompatibility.nightly", false);
else
Services.prefs.setBoolPref("extensions.checkCompatibility.1", false);
restartManager();
yield promiseRestartManager();
installAllFiles([do_get_addon("test_experiment1")], () => {
AddonManager.getAddonByID("experiment1@tests.mozilla.org", (addon) => {
Assert.ok(addon, "Add-on is found.");
Assert.ok(addon.userDisabled, "Add-on is user disabled.");
Assert.ok(!addon.appDisabled, "Add-on is not app disabled.");
yield promiseInstallAllFiles([do_get_addon("test_experiment1")]);
let addon = yield promiseAddonByID(ID);
run_next_test();
});
});
BootstrapMonitor.checkAddonInstalled(ID, "1.0");
BootstrapMonitor.checkAddonNotStarted(ID);
Assert.ok(addon, "Add-on is found.");
Assert.ok(addon.userDisabled, "Add-on is user disabled.");
Assert.ok(!addon.appDisabled, "Add-on is not app disabled.");
});