summaryrefslogtreecommitdiffstats
path: root/toolkit/mozapps/extensions/test/xpcshell/test_XPIStates.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/mozapps/extensions/test/xpcshell/test_XPIStates.js')
-rw-r--r--toolkit/mozapps/extensions/test/xpcshell/test_XPIStates.js132
1 files changed, 132 insertions, 0 deletions
diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_XPIStates.js b/toolkit/mozapps/extensions/test/xpcshell/test_XPIStates.js
new file mode 100644
index 0000000000..020d51b3b6
--- /dev/null
+++ b/toolkit/mozapps/extensions/test/xpcshell/test_XPIStates.js
@@ -0,0 +1,132 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+// Test that we only check manifest age for disabled extensions
+
+createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2");
+
+const profileDir = gProfD.clone();
+profileDir.append("extensions");
+
+add_task(async function setup() {
+ await promiseStartupManager();
+ registerCleanupFunction(promiseShutdownManager);
+
+ await promiseInstallWebExtension({
+ manifest: {
+ applications: { gecko: { id: "enabled@tests.mozilla.org" } },
+ },
+ });
+ await promiseInstallWebExtension({
+ manifest: {
+ applications: { gecko: { id: "disabled@tests.mozilla.org" } },
+ },
+ });
+
+ let addon = await promiseAddonByID("disabled@tests.mozilla.org");
+ notEqual(addon, null);
+ await addon.disable();
+});
+
+// Keep track of the last time stamp we've used, so that we can keep moving
+// it forward (if we touch two different files in the same add-on with the same
+// timestamp we may not consider the change significant)
+var lastTimestamp = Date.now();
+
+/*
+ * Helper function to touch a file and then test whether we detect the change.
+ * @param XS The XPIState object.
+ * @param aPath File path to touch.
+ * @param aChange True if we should notice the change, False if we shouldn't.
+ */
+function checkChange(XS, aPath, aChange) {
+ Assert.ok(aPath.exists());
+ lastTimestamp += 10000;
+ info("Touching file " + aPath.path + " with " + lastTimestamp);
+ aPath.lastModifiedTime = lastTimestamp;
+ Assert.equal(XS.scanForChanges(), aChange);
+ // Save the pref so we don't detect this change again
+ XS.save();
+}
+
+// Get a reference to the XPIState (loaded by startupManager) so we can unit test it.
+function getXS() {
+ let XPI = ChromeUtils.import(
+ "resource://gre/modules/addons/XPIProvider.jsm",
+ null
+ );
+ return XPI.XPIStates;
+}
+
+async function getXSJSON() {
+ await AddonTestUtils.loadAddonsList(true);
+
+ return aomStartup.readStartupData();
+}
+
+add_task(async function detect_touches() {
+ let XS = getXS();
+
+ // Should be no changes detected here, because everything should start out up-to-date.
+ Assert.ok(!XS.scanForChanges());
+
+ let states = XS.getLocation("app-profile");
+
+ // State should correctly reflect enabled/disabled
+
+ let state = states.get("enabled@tests.mozilla.org");
+ Assert.notEqual(state, null, "Found xpi state for enabled extension");
+ Assert.ok(state.enabled, "enabled extension has correct xpi state");
+
+ state = states.get("disabled@tests.mozilla.org");
+ Assert.notEqual(state, null, "Found xpi state for disabled extension");
+ Assert.ok(!state.enabled, "disabled extension has correct xpi state");
+
+ // Touch various files and make sure the change is detected.
+
+ // We notice that a packed XPI is touched for an enabled add-on.
+ let peFile = profileDir.clone();
+ peFile.append("enabled@tests.mozilla.org.xpi");
+ checkChange(XS, peFile, true);
+
+ // We should notice the packed XPI change for a disabled add-on too.
+ let pdFile = profileDir.clone();
+ pdFile.append("disabled@tests.mozilla.org.xpi");
+ checkChange(XS, pdFile, true);
+});
+
+/*
+ * Uninstalling extensions should immediately remove them from XPIStates.
+ */
+add_task(async function uninstall_bootstrap() {
+ let pe = await promiseAddonByID("enabled@tests.mozilla.org");
+ await pe.uninstall();
+
+ let xpiState = await getXSJSON();
+ Assert.equal(
+ false,
+ "enabled@tests.mozilla.org" in xpiState["app-profile"].addons
+ );
+});
+
+/*
+ * Installing an extension should immediately add it to XPIState
+ */
+add_task(async function install_bootstrap() {
+ const ID = "addon@tests.mozilla.org";
+ let XS = getXS();
+
+ await promiseInstallWebExtension({
+ manifest: {
+ applications: { gecko: { id: ID } },
+ },
+ });
+ let addon = await promiseAddonByID(ID);
+
+ let xState = XS.getAddon("app-profile", ID);
+ Assert.ok(!!xState);
+ Assert.ok(xState.enabled);
+ Assert.equal(xState.mtime, addon.updateDate.getTime());
+ await addon.uninstall();
+});