summaryrefslogtreecommitdiffstats
path: root/toolkit/mozapps/extensions/test/xpcshell/test_startup_scan.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/mozapps/extensions/test/xpcshell/test_startup_scan.js')
-rw-r--r--toolkit/mozapps/extensions/test/xpcshell/test_startup_scan.js125
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();
+});