gecko/addon-sdk/source/test/test-addon-installer.js

180 lines
5.9 KiB
JavaScript
Raw Normal View History

/* 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/. */
"use strict";
const { Cc, Ci, Cu } = require("chrome");
const AddonInstaller = require("sdk/addon/installer");
2014-01-16 17:29:40 -08:00
const { on, off } = require("sdk/system/events");
const { setTimeout } = require("sdk/timers");
const tmp = require("sdk/test/tmp-file");
const system = require("sdk/system");
Bug 935220: Uplift Add-on SDK to Firefox. r=me https://github.com/mozilla/addon-sdk/compare/firefox27...50697e6182cb4f79f9605b7cd1d1f5084cfaf03f --HG-- rename : addon-sdk/source/data/index.html => addon-sdk/source/test/addons/addon-page/data/index.html rename : addon-sdk/source/test/favicon-helpers.js => addon-sdk/source/test/addons/places/favicon-helpers.js rename : addon-sdk/source/test/places-helper.js => addon-sdk/source/test/addons/places/places-helper.js rename : addon-sdk/source/data/test-trusted-document.html => addon-sdk/source/test/addons/symbiont/data/test-trusted-document.html rename : addon-sdk/source/data/index.html => addon-sdk/source/test/fixtures/index.html rename : addon-sdk/source/data/mofo_logo.SVG => addon-sdk/source/test/fixtures/mofo_logo.SVG rename : addon-sdk/source/data/moz_favicon.ico => addon-sdk/source/test/fixtures/moz_favicon.ico rename : addon-sdk/source/data/pagemod-css-include-file.css => addon-sdk/source/test/fixtures/pagemod-css-include-file.css rename : addon-sdk/source/data/test-content-symbiont.js => addon-sdk/source/test/fixtures/test-content-symbiont.js rename : addon-sdk/source/data/test-context-menu.js => addon-sdk/source/test/fixtures/test-context-menu.js rename : addon-sdk/source/data/test-iframe-postmessage.html => addon-sdk/source/test/fixtures/test-iframe-postmessage.html rename : addon-sdk/source/data/test-iframe.html => addon-sdk/source/test/fixtures/test-iframe.html rename : addon-sdk/source/data/test-iframe.js => addon-sdk/source/test/fixtures/test-iframe.js rename : addon-sdk/source/data/test-message-manager.js => addon-sdk/source/test/fixtures/test-message-manager.js rename : addon-sdk/source/data/test-net-url.txt => addon-sdk/source/test/fixtures/test-net-url.txt rename : addon-sdk/source/data/test-page-mod.html => addon-sdk/source/test/fixtures/test-page-mod.html rename : addon-sdk/source/data/test-page-worker.html => addon-sdk/source/test/fixtures/test-page-worker.html rename : addon-sdk/source/data/test-page-worker.js => addon-sdk/source/test/fixtures/test-page-worker.js rename : addon-sdk/source/data/test-sidebar-addon-global.html => addon-sdk/source/test/fixtures/test-sidebar-addon-global.html rename : addon-sdk/source/data/test-trusted-document.html => addon-sdk/source/test/fixtures/test-trusted-document.html rename : addon-sdk/source/data/test.html => addon-sdk/source/test/fixtures/test.html rename : addon-sdk/source/data/testLocalXhr.json => addon-sdk/source/test/fixtures/testLocalXhr.json
2013-11-05 13:51:58 -08:00
const fixtures = require("./fixtures");
const testFolderURL = module.uri.split('test-addon-installer.js')[0];
const ADDON_URL = testFolderURL + "fixtures/addon-install-unit-test@mozilla.com.xpi";
const ADDON_PATH = tmp.createFromURL(ADDON_URL);
exports["test Install"] = function (assert, done) {
// Save all events distpatched by bootstrap.js of the installed addon
let events = [];
2014-01-16 17:29:40 -08:00
function eventsObserver({ data }) {
events.push(data);
}
2014-01-16 17:29:40 -08:00
on("addon-install-unit-test", eventsObserver);
// Install the test addon
AddonInstaller.install(ADDON_PATH).then(
function onInstalled(id) {
assert.equal(id, "addon-install-unit-test@mozilla.com", "`id` is valid");
// Now uninstall it
AddonInstaller.uninstall(id).then(function () {
// Ensure that bootstrap.js methods of the addon have been called
// successfully and in the right order
let expectedEvents = ["install", "startup", "shutdown", "uninstall"];
assert.equal(JSON.stringify(events),
JSON.stringify(expectedEvents),
"addon's bootstrap.js functions have been called");
2014-01-16 17:29:40 -08:00
off("addon-install-unit-test", eventsObserver);
done();
});
},
function onFailure(code) {
assert.fail("Install failed: "+code);
2014-01-16 17:29:40 -08:00
off("addon-install-unit-test", eventsObserver);
done();
}
);
};
exports["test Failing Install With Invalid Path"] = function (assert, done) {
AddonInstaller.install("invalid-path").then(
function onInstalled(id) {
assert.fail("Unexpected success");
done();
},
function onFailure(code) {
assert.equal(code, AddonInstaller.ERROR_FILE_ACCESS,
"Got expected error code");
done();
}
);
};
exports["test Failing Install With Invalid File"] = function (assert, done) {
let directory = system.pathFor("ProfD");
AddonInstaller.install(directory).then(
function onInstalled(id) {
assert.fail("Unexpected success");
done();
},
function onFailure(code) {
assert.equal(code, AddonInstaller.ERROR_CORRUPT_FILE,
"Got expected error code");
done();
}
);
}
exports["test Update"] = function (assert, done) {
// Save all events distpatched by bootstrap.js of the installed addon
let events = [];
let iteration = 1;
2014-01-16 17:29:40 -08:00
let eventsObserver = ({data}) => events.push(data);
on("addon-install-unit-test", eventsObserver);
function onInstalled(id) {
let prefix = "[" + iteration + "] ";
assert.equal(id, "addon-install-unit-test@mozilla.com",
prefix + "`id` is valid");
// On 2nd and 3rd iteration, we receive uninstall events from the last
// previously installed addon
let expectedEvents =
iteration == 1
? ["install", "startup"]
: ["shutdown", "uninstall", "install", "startup"];
assert.equal(JSON.stringify(events),
JSON.stringify(expectedEvents),
prefix + "addon's bootstrap.js functions have been called");
if (iteration++ < 3) {
next();
}
else {
events = [];
AddonInstaller.uninstall(id).then(function() {
let expectedEvents = ["shutdown", "uninstall"];
assert.equal(JSON.stringify(events),
JSON.stringify(expectedEvents),
prefix + "addon's bootstrap.js functions have been called");
2014-01-16 17:29:40 -08:00
off("addon-install-unit-test", eventsObserver);
done();
});
}
}
function onFailure(code) {
assert.fail("Install failed: "+code);
2014-01-16 17:29:40 -08:00
off("addon-install-unit-test", eventsObserver);
done();
}
function next() {
events = [];
AddonInstaller.install(ADDON_PATH).then(onInstalled, onFailure);
}
next();
};
exports['test Uninstall failure'] = function (assert, done) {
AddonInstaller.uninstall('invalid-addon-path').then(
() => assert.fail('Addon uninstall should not resolve successfully'),
() => assert.pass('Addon correctly rejected invalid uninstall')
).then(done, assert.fail);
};
exports['test Addon Disable and Enable'] = function (assert, done) {
let ensureActive = (addonId) => AddonInstaller.isActive(addonId).then(state => {
assert.equal(state, true, 'Addon should be enabled by default');
return addonId;
});
let ensureInactive = (addonId) => AddonInstaller.isActive(addonId).then(state => {
assert.equal(state, false, 'Addon should be disabled after disabling');
return addonId;
});
AddonInstaller.install(ADDON_PATH)
.then(ensureActive)
.then(AddonInstaller.enable) // should do nothing, yet not fail
.then(ensureActive)
.then(AddonInstaller.disable)
.then(ensureInactive)
.then(AddonInstaller.disable) // should do nothing, yet not fail
.then(ensureInactive)
.then(AddonInstaller.enable)
.then(ensureActive)
.then(AddonInstaller.uninstall)
.then(done, assert.fail);
};
exports['test Disable failure'] = function (assert, done) {
AddonInstaller.disable('not-an-id').then(
() => assert.fail('Addon disable should not resolve successfully'),
() => assert.pass('Addon correctly rejected invalid disable')
).then(done, assert.fail);
};
exports['test Enable failure'] = function (assert, done) {
AddonInstaller.enable('not-an-id').then(
() => assert.fail('Addon enable should not resolve successfully'),
() => assert.pass('Addon correctly rejected invalid enable')
).then(done, assert.fail);
};
require("test").run(exports);