summaryrefslogtreecommitdiffstats
path: root/toolkit/components/normandy/test/browser/browser_NormandyAddonManager.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/normandy/test/browser/browser_NormandyAddonManager.js')
-rw-r--r--toolkit/components/normandy/test/browser/browser_NormandyAddonManager.js189
1 files changed, 189 insertions, 0 deletions
diff --git a/toolkit/components/normandy/test/browser/browser_NormandyAddonManager.js b/toolkit/components/normandy/test/browser/browser_NormandyAddonManager.js
new file mode 100644
index 0000000000..d43f310659
--- /dev/null
+++ b/toolkit/components/normandy/test/browser/browser_NormandyAddonManager.js
@@ -0,0 +1,189 @@
+"use strict";
+
+const { NormandyAddonManager } = ChromeUtils.importESModule(
+ "resource://normandy/lib/NormandyAddonManager.sys.mjs"
+);
+
+decorate_task(ensureAddonCleanup(), async function download_and_install() {
+ const applyDeferred = Promise.withResolvers();
+
+ const [addonId, addonVersion] = await NormandyAddonManager.downloadAndInstall(
+ {
+ extensionDetails: {
+ extension_id: FIXTURE_ADDON_ID,
+ hash: FIXTURE_ADDON_DETAILS["normandydriver-a-1.0"].hash,
+ hash_algorithm: "sha256",
+ version: "1.0",
+ xpi: FIXTURE_ADDON_DETAILS["normandydriver-a-1.0"].url,
+ },
+ applyNormandyChanges: () => {
+ applyDeferred.resolve();
+ },
+ createError: () => {},
+ reportError: () => {},
+ undoNormandyChanges: () => {},
+ }
+ );
+
+ // Ensure applyNormandyChanges was called
+ await applyDeferred;
+
+ const addon = await AddonManager.getAddonByID(FIXTURE_ADDON_ID);
+ is(addon.id, addonId, "add-on is installed");
+ is(addon.version, addonVersion, "add-on version is correct");
+
+ // Cleanup
+ await addon.uninstall();
+});
+
+decorate_task(ensureAddonCleanup(), async function id_mismatch() {
+ const applyDeferred = Promise.withResolvers();
+ const undoDeferred = Promise.withResolvers();
+
+ let error;
+
+ try {
+ await NormandyAddonManager.downloadAndInstall({
+ extensionDetails: {
+ extension_id: FIXTURE_ADDON_ID,
+ hash: FIXTURE_ADDON_DETAILS["normandydriver-b-1.0"].hash,
+ hash_algorithm: "sha256",
+ version: "1.0",
+ xpi: FIXTURE_ADDON_DETAILS["normandydriver-b-1.0"].url,
+ },
+ applyNormandyChanges: () => {
+ applyDeferred.resolve();
+ },
+ createError: (reason, extra) => {
+ return [reason, extra];
+ },
+ reportError: err => {
+ return err;
+ },
+ undoNormandyChanges: () => {
+ undoDeferred.resolve();
+ },
+ });
+ } catch ([reason, extra]) {
+ error = true;
+ is(reason, "metadata-mismatch", "the expected reason is provided");
+ Assert.deepEqual(
+ extra,
+ undefined,
+ "the expected extra details are provided"
+ );
+ }
+
+ ok(error, "an error occured");
+
+ // Ensure applyNormandyChanges was called
+ await applyDeferred;
+
+ // Ensure undoNormandyChanges was called
+ await undoDeferred;
+
+ const addon = await AddonManager.getAddonByID(FIXTURE_ADDON_ID);
+ ok(!addon, "add-on is not installed");
+});
+
+decorate_task(ensureAddonCleanup(), async function version_mismatch() {
+ const applyDeferred = Promise.withResolvers();
+ const undoDeferred = Promise.withResolvers();
+
+ let error;
+
+ try {
+ await NormandyAddonManager.downloadAndInstall({
+ extensionDetails: {
+ extension_id: FIXTURE_ADDON_ID,
+ hash: FIXTURE_ADDON_DETAILS["normandydriver-a-1.0"].hash,
+ hash_algorithm: "sha256",
+ version: "2.0",
+ xpi: FIXTURE_ADDON_DETAILS["normandydriver-a-1.0"].url,
+ },
+ applyNormandyChanges: () => {
+ applyDeferred.resolve();
+ },
+ createError: (reason, extra) => {
+ return [reason, extra];
+ },
+ reportError: err => {
+ return err;
+ },
+ undoNormandyChanges: () => {
+ undoDeferred.resolve();
+ },
+ });
+ } catch ([reason, extra]) {
+ error = true;
+ is(reason, "metadata-mismatch", "the expected reason is provided");
+ Assert.deepEqual(
+ extra,
+ undefined,
+ "the expected extra details are provided"
+ );
+ }
+
+ ok(error, "should throw an error");
+
+ // Ensure applyNormandyChanges was called
+ await applyDeferred;
+
+ // Ensure undoNormandyChanges was called
+ await undoDeferred;
+
+ const addon = await AddonManager.getAddonByID(FIXTURE_ADDON_ID);
+ ok(!addon, "add-on is not installed");
+});
+
+decorate_task(ensureAddonCleanup(), async function download_failure() {
+ const applyDeferred = Promise.withResolvers();
+ const undoDeferred = Promise.withResolvers();
+
+ let error;
+
+ try {
+ await NormandyAddonManager.downloadAndInstall({
+ extensionDetails: {
+ extension_id: FIXTURE_ADDON_ID,
+ hash: FIXTURE_ADDON_DETAILS["normandydriver-b-1.0"].hash,
+ hash_algorithm: "sha256",
+ version: "1.0",
+ xpi: FIXTURE_ADDON_DETAILS["normandydriver-a-1.0"].url,
+ },
+ applyNormandyChanges: () => {
+ applyDeferred.resolve();
+ },
+ createError: (reason, extra) => {
+ return [reason, extra];
+ },
+ reportError: err => {
+ return err;
+ },
+ undoNormandyChanges: () => {
+ undoDeferred.resolve();
+ },
+ });
+ } catch ([reason, extra]) {
+ error = true;
+ is(reason, "download-failure", "the expected reason is provided");
+ Assert.deepEqual(
+ extra,
+ {
+ detail: "ERROR_INCORRECT_HASH",
+ },
+ "the expected extra details are provided"
+ );
+ }
+
+ ok(error, "an error occured");
+
+ // Ensure applyNormandyChanges was called
+ await applyDeferred;
+
+ // Ensure undoNormandyChanges was called
+ await undoDeferred;
+
+ const addon = await AddonManager.getAddonByID(FIXTURE_ADDON_ID);
+ ok(!addon, "add-on is not installed");
+});