/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */

// useMLBF=true only supports blocking by version+ID, not by OS/ABI.
enable_blocklist_v2_instead_of_useMLBF();

const profileDir = gProfD.clone();
profileDir.append("extensions");

const ADDONS = [
  {
    id: "test_bug393285_1@tests.mozilla.org",
    name: "extension 1",
    version: "1.0",

    // No info in blocklist, shouldn't be blocked
    notBlocklisted: [
      ["1", "1.9"],
      [null, null],
    ],
  },
  {
    id: "test_bug393285_2@tests.mozilla.org",
    name: "extension 2",
    version: "1.0",

    // Should always be blocked
    blocklisted: [
      ["1", "1.9"],
      [null, null],
    ],
  },
  {
    id: "test_bug393285_3a@tests.mozilla.org",
    name: "extension 3a",
    version: "1.0",

    // Only version 1 should be blocked
    blocklisted: [
      ["1", "1.9"],
      [null, null],
    ],
  },
  {
    id: "test_bug393285_3b@tests.mozilla.org",
    name: "extension 3b",
    version: "2.0",

    // Only version 1 should be blocked
    notBlocklisted: [["1", "1.9"]],
  },
  {
    id: "test_bug393285_4@tests.mozilla.org",
    name: "extension 4",
    version: "1.0",

    // Should be blocked for app version 1
    blocklisted: [
      ["1", "1.9"],
      [null, null],
    ],
    notBlocklisted: [["2", "1.9"]],
  },
  {
    id: "test_bug393285_5@tests.mozilla.org",
    name: "extension 5",
    version: "1.0",

    // Not blocklisted because we are a different OS
    notBlocklisted: [["2", "1.9"]],
  },
  {
    id: "test_bug393285_6@tests.mozilla.org",
    name: "extension 6",
    version: "1.0",

    // Blocklisted based on OS
    blocklisted: [["2", "1.9"]],
  },
  {
    id: "test_bug393285_7@tests.mozilla.org",
    name: "extension 7",
    version: "1.0",

    // Blocklisted based on OS
    blocklisted: [["2", "1.9"]],
  },
  {
    id: "test_bug393285_8@tests.mozilla.org",
    name: "extension 8",
    version: "1.0",

    // Not blocklisted because we are a different ABI
    notBlocklisted: [["2", "1.9"]],
  },
  {
    id: "test_bug393285_9@tests.mozilla.org",
    name: "extension 9",
    version: "1.0",

    // Blocklisted based on ABI
    blocklisted: [["2", "1.9"]],
  },
  {
    id: "test_bug393285_10@tests.mozilla.org",
    name: "extension 10",
    version: "1.0",

    // Blocklisted based on ABI
    blocklisted: [["2", "1.9"]],
  },
  {
    id: "test_bug393285_11@tests.mozilla.org",
    name: "extension 11",
    version: "1.0",

    // Doesn't match both os and abi so not blocked
    notBlocklisted: [["2", "1.9"]],
  },
  {
    id: "test_bug393285_12@tests.mozilla.org",
    name: "extension 12",
    version: "1.0",

    // Doesn't match both os and abi so not blocked
    notBlocklisted: [["2", "1.9"]],
  },
  {
    id: "test_bug393285_13@tests.mozilla.org",
    name: "extension 13",
    version: "1.0",

    // Doesn't match both os and abi so not blocked
    notBlocklisted: [["2", "1.9"]],
  },
  {
    id: "test_bug393285_14@tests.mozilla.org",
    name: "extension 14",
    version: "1.0",

    // Matches both os and abi so blocked
    blocklisted: [["2", "1.9"]],
  },
];

const ADDON_IDS = ADDONS.map(a => a.id);

const BLOCKLIST_DATA = [
  {
    guid: "test_bug393285_2@tests.mozilla.org",
    versionRange: [],
  },
  {
    guid: "test_bug393285_3a@tests.mozilla.org",
    versionRange: [{ maxVersion: "1.0", minVersion: "1.0" }],
  },
  {
    guid: "test_bug393285_3b@tests.mozilla.org",
    versionRange: [{ maxVersion: "1.0", minVersion: "1.0" }],
  },
  {
    guid: "test_bug393285_4@tests.mozilla.org",
    versionRange: [
      {
        maxVersion: "1.0",
        minVersion: "1.0",
        targetApplication: [
          {
            guid: "xpcshell@tests.mozilla.org",
            maxVersion: "1.0",
            minVersion: "1.0",
          },
        ],
      },
    ],
  },
  {
    guid: "test_bug393285_5@tests.mozilla.org",
    os: "Darwin",
    versionRange: [],
  },
  {
    guid: "test_bug393285_6@tests.mozilla.org",
    os: "XPCShell",
    versionRange: [],
  },
  {
    guid: "test_bug393285_7@tests.mozilla.org",
    os: "Darwin,XPCShell,WINNT",
    versionRange: [],
  },
  {
    guid: "test_bug393285_8@tests.mozilla.org",
    xpcomabi: "x86-msvc",
    versionRange: [],
  },
  {
    guid: "test_bug393285_9@tests.mozilla.org",
    xpcomabi: "noarch-spidermonkey",
    versionRange: [],
  },
  {
    guid: "test_bug393285_10@tests.mozilla.org",
    xpcomabi: "ppc-gcc3,noarch-spidermonkey,x86-msvc",
    versionRange: [],
  },
  {
    guid: "test_bug393285_11@tests.mozilla.org",
    os: "Darwin",
    xpcomabi: "ppc-gcc3,x86-msvc",
    versionRange: [],
  },
  {
    guid: "test_bug393285_12@tests.mozilla.org",
    os: "Darwin",
    xpcomabi: "ppc-gcc3,noarch-spidermonkey,x86-msvc",
    versionRange: [],
  },
  {
    guid: "test_bug393285_13@tests.mozilla.org",
    os: "XPCShell",
    xpcomabi: "ppc-gcc3,x86-msvc",
    versionRange: [],
  },
  {
    guid: "test_bug393285_14@tests.mozilla.org",
    os: "XPCShell,WINNT",
    xpcomabi: "ppc-gcc3,x86-msvc,noarch-spidermonkey",
    versionRange: [],
  },
];

add_task(async function setup() {
  createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9");
  await promiseStartupManager();

  for (let addon of ADDONS) {
    await promiseInstallWebExtension({
      manifest: {
        name: addon.name,
        version: addon.version,
        browser_specific_settings: { gecko: { id: addon.id } },
      },
    });
  }

  let addons = await getAddons(ADDON_IDS);
  for (let id of ADDON_IDS) {
    equal(
      addons.get(id).blocklistState,
      Ci.nsIBlocklistService.STATE_NOT_BLOCKED,
      `Add-on ${id} should not initially be blocked`
    );
  }
});

add_task(async function test_1() {
  await AddonTestUtils.loadBlocklistRawData({ extensions: BLOCKLIST_DATA });

  let addons = await getAddons(ADDON_IDS);
  async function isBlocklisted(addon, appVer, toolkitVer) {
    let state = await Blocklist.getAddonBlocklistState(
      addon,
      appVer,
      toolkitVer
    );
    return state != Services.blocklist.STATE_NOT_BLOCKED;
  }
  for (let addon of ADDONS) {
    let { id } = addon;
    for (let blocklisted of addon.blocklisted || []) {
      ok(
        await isBlocklisted(addons.get(id), ...blocklisted),
        `Add-on ${id} should be blocklisted in app/platform version ${blocklisted}`
      );
    }
    for (let notBlocklisted of addon.notBlocklisted || []) {
      ok(
        !(await isBlocklisted(addons.get(id), ...notBlocklisted)),
        `Add-on ${id} should not be blocklisted in app/platform version ${notBlocklisted}`
      );
    }
  }
});
