Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
"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");
});