Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test gets skipped with pattern: os == 'android'
- Manifest: toolkit/mozapps/extensions/test/xpcshell/xpcshell.toml
"use strict";
// Turn off startup scanning.
Services.prefs.setIntPref("extensions.startupScanScopes", 0);
createAppInfo("xpcshell@tessts.mozilla.org", "XPCShell", "42", "42");
// Prevent XPIStates.scanForChanges from seeing this as an update and forcing a
// full scan.
Services.prefs.setCharPref(
"extensions.lastAppBuildId",
Services.appinfo.appBuildID
);
// A small bootstrap calls monitor targeting a single extension (created to avoid introducing a workaround
let Monitor = {
extensionId: undefined,
collected: [],
init() {
const bootstrapCallListener = (_evtName, data) => {
if (data.params.id == this.extensionId) {
this.collected.push(data);
}
};
AddonTestUtils.on("bootstrap-method", bootstrapCallListener);
registerCleanupFunction(() => {
AddonTestUtils.off("bootstrap-method", bootstrapCallListener);
});
},
startCollecting(extensionId) {
this.extensionId = extensionId;
},
stopCollecting() {
this.extensionId = undefined;
},
getCollected() {
const collected = this.collected;
this.collected = [];
return collected;
},
};
Monitor.init();
// that has already started is restarted.
add_task(async function test_startup_sideload_updated() {
const ID = "sideload@tests.mozilla.org";
await createWebExtension(ID, initialVersion("1"), profileDir);
await promiseStartupManager();
// Ensure the sideload is enabled and running.
let addon = await promiseAddonByID(ID);
Monitor.startCollecting(ID);
await addon.enable();
Monitor.stopCollecting();
let events = Monitor.getCollected();
ok(events.length, "bootstrap methods called");
equal(
events[0].reason,
BOOTSTRAP_REASONS.ADDON_ENABLE,
"Startup reason is ADDON_ENABLE at install"
);
await promiseShutdownManager();
// Touch the addon on disk before startup.
await createWebExtension(ID, initialVersion("1.1"), profileDir);
Monitor.startCollecting(ID);
await promiseStartupManager();
await AddonManagerPrivate.getNewSideloads();
Monitor.stopCollecting();
events = Monitor.getCollected().map(({ method, reason, params }) => {
const { version } = params;
return { method, reason, version };
});
const updatedVersion = "1.1.0";
const expectedUpgradeParams = {
reason: BOOTSTRAP_REASONS.ADDON_UPGRADE,
version: updatedVersion,
};
const expectedCalls = [
{
method: "startup",
reason: BOOTSTRAP_REASONS.APP_STARTUP,
version: "1.0",
},
// Shutdown call has version 1.1 because the file was already
// updated on disk and got the new version as part of the startup.
{ method: "shutdown", ...expectedUpgradeParams },
{ method: "update", ...expectedUpgradeParams },
{ method: "startup", ...expectedUpgradeParams },
];
for (let i = 0; i < expectedCalls.length; i++) {
Assert.deepEqual(
events[i],
expectedCalls[i],
"Got the expected sequence of bootstrap method calls"
);
}
equal(
events.length,
expectedCalls.length,
"Got the expected number of bootstrap method calls"
);
// flush addonStartup.json
await AddonTestUtils.loadAddonsList(true);
// verify startupData is correct
let startupData = aomStartup.readStartupData();
Assert.equal(
startupData["app-profile"].addons[ID].version,
updatedVersion,
"startup data is correct in cache"
);
await promiseShutdownManager();
});