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

Thu, 15 Jan 2015 15:59:08 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 15 Jan 2015 15:59:08 +0100
branch
TOR_BUG_9701
changeset 10
ac0c01689b40
permissions
-rw-r--r--

Implement a real Private Browsing Mode condition by changing the API/ABI;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.

     1 /* This Source Code Form is subject to the terms of the Mozilla Public
     2  * License, v. 2.0. If a copy of the MPL was not distributed with this
     3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     4 "use strict";
     6 const { Cc, Ci, Cu } = require("chrome");
     7 const AddonInstaller = require("sdk/addon/installer");
     8 const { on, off } = require("sdk/system/events");
     9 const { setTimeout } = require("sdk/timers");
    10 const tmp = require("sdk/test/tmp-file");
    11 const system = require("sdk/system");
    12 const fixtures = require("./fixtures");
    14 const testFolderURL = module.uri.split('test-addon-installer.js')[0];
    15 const ADDON_URL = testFolderURL + "fixtures/addon-install-unit-test@mozilla.com.xpi";
    16 const ADDON_PATH = tmp.createFromURL(ADDON_URL);
    18 exports["test Install"] = function (assert, done) {
    20   // Save all events distpatched by bootstrap.js of the installed addon
    21   let events = [];
    22   function eventsObserver({ data }) {
    23     events.push(data);
    24   }
    25   on("addon-install-unit-test", eventsObserver);
    27   // Install the test addon
    28   AddonInstaller.install(ADDON_PATH).then(
    29     function onInstalled(id) {
    30       assert.equal(id, "addon-install-unit-test@mozilla.com", "`id` is valid");
    32       // Now uninstall it
    33       AddonInstaller.uninstall(id).then(function () {
    34         // Ensure that bootstrap.js methods of the addon have been called
    35         // successfully and in the right order
    36         let expectedEvents = ["install", "startup", "shutdown", "uninstall"];
    37         assert.equal(JSON.stringify(events),
    38                          JSON.stringify(expectedEvents),
    39                          "addon's bootstrap.js functions have been called");
    41         off("addon-install-unit-test", eventsObserver);
    42         done();
    43       });
    44     },
    45     function onFailure(code) {
    46       assert.fail("Install failed: "+code);
    47       off("addon-install-unit-test", eventsObserver);
    48       done();
    49     }
    50   );
    51 };
    53 exports["test Failing Install With Invalid Path"] = function (assert, done) {
    54   AddonInstaller.install("invalid-path").then(
    55     function onInstalled(id) {
    56       assert.fail("Unexpected success");
    57       done();
    58     },
    59     function onFailure(code) {
    60       assert.equal(code, AddonInstaller.ERROR_FILE_ACCESS,
    61                        "Got expected error code");
    62       done();
    63     }
    64   );
    65 };
    67 exports["test Failing Install With Invalid File"] = function (assert, done) {
    68   let directory = system.pathFor("ProfD");
    69   AddonInstaller.install(directory).then(
    70     function onInstalled(id) {
    71       assert.fail("Unexpected success");
    72       done();
    73     },
    74     function onFailure(code) {
    75       assert.equal(code, AddonInstaller.ERROR_CORRUPT_FILE,
    76                        "Got expected error code");
    77       done();
    78     }
    79   );
    80 }
    82 exports["test Update"] = function (assert, done) {
    83   // Save all events distpatched by bootstrap.js of the installed addon
    84   let events = [];
    85   let iteration = 1;
    86   let eventsObserver = ({data}) => events.push(data);
    87   on("addon-install-unit-test", eventsObserver);
    89   function onInstalled(id) {
    90     let prefix = "[" + iteration + "] ";
    91     assert.equal(id, "addon-install-unit-test@mozilla.com",
    92                      prefix + "`id` is valid");
    94     // On 2nd and 3rd iteration, we receive uninstall events from the last
    95     // previously installed addon
    96     let expectedEvents =
    97       iteration == 1
    98       ? ["install", "startup"]
    99       : ["shutdown", "uninstall", "install", "startup"];
   100     assert.equal(JSON.stringify(events),
   101                      JSON.stringify(expectedEvents),
   102                      prefix + "addon's bootstrap.js functions have been called");
   104     if (iteration++ < 3) {
   105       next();
   106     }
   107     else {
   108       events = [];
   109       AddonInstaller.uninstall(id).then(function() {
   110         let expectedEvents = ["shutdown", "uninstall"];
   111         assert.equal(JSON.stringify(events),
   112                      JSON.stringify(expectedEvents),
   113                      prefix + "addon's bootstrap.js functions have been called");
   115         off("addon-install-unit-test", eventsObserver);
   116         done();
   117       });
   118     }
   119   }
   120   function onFailure(code) {
   121     assert.fail("Install failed: "+code);
   122     off("addon-install-unit-test", eventsObserver);
   123     done();
   124   }
   126   function next() {
   127     events = [];
   128     AddonInstaller.install(ADDON_PATH).then(onInstalled, onFailure);
   129   }
   131   next();
   132 };
   134 exports['test Uninstall failure'] = function (assert, done) {
   135   AddonInstaller.uninstall('invalid-addon-path').then(
   136     () => assert.fail('Addon uninstall should not resolve successfully'),
   137     () => assert.pass('Addon correctly rejected invalid uninstall')
   138   ).then(done, assert.fail);
   139 };
   141 exports['test Addon Disable and Enable'] = function (assert, done) {
   142   let ensureActive = (addonId) => AddonInstaller.isActive(addonId).then(state => {
   143     assert.equal(state, true, 'Addon should be enabled by default');
   144     return addonId;
   145   });
   146   let ensureInactive = (addonId) => AddonInstaller.isActive(addonId).then(state => {
   147     assert.equal(state, false, 'Addon should be disabled after disabling');
   148     return addonId;
   149   });
   151   AddonInstaller.install(ADDON_PATH)
   152     .then(ensureActive)
   153     .then(AddonInstaller.enable) // should do nothing, yet not fail
   154     .then(ensureActive)
   155     .then(AddonInstaller.disable)
   156     .then(ensureInactive)
   157     .then(AddonInstaller.disable) // should do nothing, yet not fail
   158     .then(ensureInactive)
   159     .then(AddonInstaller.enable)
   160     .then(ensureActive)
   161     .then(AddonInstaller.uninstall)
   162     .then(done, assert.fail);
   163 };
   165 exports['test Disable failure'] = function (assert, done) {
   166   AddonInstaller.disable('not-an-id').then(
   167     () => assert.fail('Addon disable should not resolve successfully'),
   168     () => assert.pass('Addon correctly rejected invalid disable')
   169   ).then(done, assert.fail);
   170 };
   172 exports['test Enable failure'] = function (assert, done) {
   173   AddonInstaller.enable('not-an-id').then(
   174     () => assert.fail('Addon enable should not resolve successfully'),
   175     () => assert.pass('Addon correctly rejected invalid enable')
   176   ).then(done, assert.fail);
   177 };
   179 require("test").run(exports);

mercurial