michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: "use strict"; michael@0: michael@0: const { Cc, Ci, Cu } = require("chrome"); michael@0: const AddonInstaller = require("sdk/addon/installer"); michael@0: const { on, off } = require("sdk/system/events"); michael@0: const { setTimeout } = require("sdk/timers"); michael@0: const tmp = require("sdk/test/tmp-file"); michael@0: const system = require("sdk/system"); michael@0: const fixtures = require("./fixtures"); michael@0: michael@0: const testFolderURL = module.uri.split('test-addon-installer.js')[0]; michael@0: const ADDON_URL = testFolderURL + "fixtures/addon-install-unit-test@mozilla.com.xpi"; michael@0: const ADDON_PATH = tmp.createFromURL(ADDON_URL); michael@0: michael@0: exports["test Install"] = function (assert, done) { michael@0: michael@0: // Save all events distpatched by bootstrap.js of the installed addon michael@0: let events = []; michael@0: function eventsObserver({ data }) { michael@0: events.push(data); michael@0: } michael@0: on("addon-install-unit-test", eventsObserver); michael@0: michael@0: // Install the test addon michael@0: AddonInstaller.install(ADDON_PATH).then( michael@0: function onInstalled(id) { michael@0: assert.equal(id, "addon-install-unit-test@mozilla.com", "`id` is valid"); michael@0: michael@0: // Now uninstall it michael@0: AddonInstaller.uninstall(id).then(function () { michael@0: // Ensure that bootstrap.js methods of the addon have been called michael@0: // successfully and in the right order michael@0: let expectedEvents = ["install", "startup", "shutdown", "uninstall"]; michael@0: assert.equal(JSON.stringify(events), michael@0: JSON.stringify(expectedEvents), michael@0: "addon's bootstrap.js functions have been called"); michael@0: michael@0: off("addon-install-unit-test", eventsObserver); michael@0: done(); michael@0: }); michael@0: }, michael@0: function onFailure(code) { michael@0: assert.fail("Install failed: "+code); michael@0: off("addon-install-unit-test", eventsObserver); michael@0: done(); michael@0: } michael@0: ); michael@0: }; michael@0: michael@0: exports["test Failing Install With Invalid Path"] = function (assert, done) { michael@0: AddonInstaller.install("invalid-path").then( michael@0: function onInstalled(id) { michael@0: assert.fail("Unexpected success"); michael@0: done(); michael@0: }, michael@0: function onFailure(code) { michael@0: assert.equal(code, AddonInstaller.ERROR_FILE_ACCESS, michael@0: "Got expected error code"); michael@0: done(); michael@0: } michael@0: ); michael@0: }; michael@0: michael@0: exports["test Failing Install With Invalid File"] = function (assert, done) { michael@0: let directory = system.pathFor("ProfD"); michael@0: AddonInstaller.install(directory).then( michael@0: function onInstalled(id) { michael@0: assert.fail("Unexpected success"); michael@0: done(); michael@0: }, michael@0: function onFailure(code) { michael@0: assert.equal(code, AddonInstaller.ERROR_CORRUPT_FILE, michael@0: "Got expected error code"); michael@0: done(); michael@0: } michael@0: ); michael@0: } michael@0: michael@0: exports["test Update"] = function (assert, done) { michael@0: // Save all events distpatched by bootstrap.js of the installed addon michael@0: let events = []; michael@0: let iteration = 1; michael@0: let eventsObserver = ({data}) => events.push(data); michael@0: on("addon-install-unit-test", eventsObserver); michael@0: michael@0: function onInstalled(id) { michael@0: let prefix = "[" + iteration + "] "; michael@0: assert.equal(id, "addon-install-unit-test@mozilla.com", michael@0: prefix + "`id` is valid"); michael@0: michael@0: // On 2nd and 3rd iteration, we receive uninstall events from the last michael@0: // previously installed addon michael@0: let expectedEvents = michael@0: iteration == 1 michael@0: ? ["install", "startup"] michael@0: : ["shutdown", "uninstall", "install", "startup"]; michael@0: assert.equal(JSON.stringify(events), michael@0: JSON.stringify(expectedEvents), michael@0: prefix + "addon's bootstrap.js functions have been called"); michael@0: michael@0: if (iteration++ < 3) { michael@0: next(); michael@0: } michael@0: else { michael@0: events = []; michael@0: AddonInstaller.uninstall(id).then(function() { michael@0: let expectedEvents = ["shutdown", "uninstall"]; michael@0: assert.equal(JSON.stringify(events), michael@0: JSON.stringify(expectedEvents), michael@0: prefix + "addon's bootstrap.js functions have been called"); michael@0: michael@0: off("addon-install-unit-test", eventsObserver); michael@0: done(); michael@0: }); michael@0: } michael@0: } michael@0: function onFailure(code) { michael@0: assert.fail("Install failed: "+code); michael@0: off("addon-install-unit-test", eventsObserver); michael@0: done(); michael@0: } michael@0: michael@0: function next() { michael@0: events = []; michael@0: AddonInstaller.install(ADDON_PATH).then(onInstalled, onFailure); michael@0: } michael@0: michael@0: next(); michael@0: }; michael@0: michael@0: exports['test Uninstall failure'] = function (assert, done) { michael@0: AddonInstaller.uninstall('invalid-addon-path').then( michael@0: () => assert.fail('Addon uninstall should not resolve successfully'), michael@0: () => assert.pass('Addon correctly rejected invalid uninstall') michael@0: ).then(done, assert.fail); michael@0: }; michael@0: michael@0: exports['test Addon Disable and Enable'] = function (assert, done) { michael@0: let ensureActive = (addonId) => AddonInstaller.isActive(addonId).then(state => { michael@0: assert.equal(state, true, 'Addon should be enabled by default'); michael@0: return addonId; michael@0: }); michael@0: let ensureInactive = (addonId) => AddonInstaller.isActive(addonId).then(state => { michael@0: assert.equal(state, false, 'Addon should be disabled after disabling'); michael@0: return addonId; michael@0: }); michael@0: michael@0: AddonInstaller.install(ADDON_PATH) michael@0: .then(ensureActive) michael@0: .then(AddonInstaller.enable) // should do nothing, yet not fail michael@0: .then(ensureActive) michael@0: .then(AddonInstaller.disable) michael@0: .then(ensureInactive) michael@0: .then(AddonInstaller.disable) // should do nothing, yet not fail michael@0: .then(ensureInactive) michael@0: .then(AddonInstaller.enable) michael@0: .then(ensureActive) michael@0: .then(AddonInstaller.uninstall) michael@0: .then(done, assert.fail); michael@0: }; michael@0: michael@0: exports['test Disable failure'] = function (assert, done) { michael@0: AddonInstaller.disable('not-an-id').then( michael@0: () => assert.fail('Addon disable should not resolve successfully'), michael@0: () => assert.pass('Addon correctly rejected invalid disable') michael@0: ).then(done, assert.fail); michael@0: }; michael@0: michael@0: exports['test Enable failure'] = function (assert, done) { michael@0: AddonInstaller.enable('not-an-id').then( michael@0: () => assert.fail('Addon enable should not resolve successfully'), michael@0: () => assert.pass('Addon correctly rejected invalid enable') michael@0: ).then(done, assert.fail); michael@0: }; michael@0: michael@0: require("test").run(exports);