diff options
Diffstat (limited to 'toolkit/mozapps/extensions/test/xpcshell/test_startup_scan.js')
-rw-r--r-- | toolkit/mozapps/extensions/test/xpcshell/test_startup_scan.js | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_startup_scan.js b/toolkit/mozapps/extensions/test/xpcshell/test_startup_scan.js new file mode 100644 index 0000000000..67c75cbd17 --- /dev/null +++ b/toolkit/mozapps/extensions/test/xpcshell/test_startup_scan.js @@ -0,0 +1,125 @@ +"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 +// in BootstrapMonitor to be able to test Bug 1664144 fix). +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(); + +// Bug 1664144: Test that during startup scans, updating an addon +// 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(); +}); |