services/sync/tests/unit/test_addon_utils.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/services/sync/tests/unit/test_addon_utils.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,162 @@
     1.4 +/* Any copyright is dedicated to the Public Domain.
     1.5 +   http://creativecommons.org/publicdomain/zero/1.0/ */
     1.6 +
     1.7 +"use strict";
     1.8 +
     1.9 +Cu.import("resource://gre/modules/Preferences.jsm");
    1.10 +Cu.import("resource://services-sync/addonutils.js");
    1.11 +Cu.import("resource://services-sync/util.js");
    1.12 +
    1.13 +const HTTP_PORT = 8888;
    1.14 +const SERVER_ADDRESS = "http://127.0.0.1:8888";
    1.15 +
    1.16 +let prefs = new Preferences();
    1.17 +
    1.18 +prefs.set("extensions.getAddons.get.url",
    1.19 +          SERVER_ADDRESS + "/search/guid:%IDS%");
    1.20 +
    1.21 +loadAddonTestFunctions();
    1.22 +startupManager();
    1.23 +
    1.24 +function createAndStartHTTPServer(port=HTTP_PORT) {
    1.25 +  try {
    1.26 +    let server = new HttpServer();
    1.27 +
    1.28 +    let bootstrap1XPI = ExtensionsTestPath("/addons/test_bootstrap1_1.xpi");
    1.29 +
    1.30 +    server.registerFile("/search/guid:missing-sourceuri%40tests.mozilla.org",
    1.31 +                        do_get_file("missing-sourceuri.xml"));
    1.32 +
    1.33 +    server.registerFile("/search/guid:rewrite%40tests.mozilla.org",
    1.34 +                        do_get_file("rewrite-search.xml"));
    1.35 +
    1.36 +    server.start(port);
    1.37 +
    1.38 +    return server;
    1.39 +  } catch (ex) {
    1.40 +    _("Got exception starting HTTP server on port " + port);
    1.41 +    _("Error: " + Utils.exceptionStr(ex));
    1.42 +    do_throw(ex);
    1.43 +  }
    1.44 +}
    1.45 +
    1.46 +function run_test() {
    1.47 +  initTestLogging("Trace");
    1.48 +
    1.49 +  run_next_test();
    1.50 +}
    1.51 +
    1.52 +add_test(function test_handle_empty_source_uri() {
    1.53 +  _("Ensure that search results without a sourceURI are properly ignored.");
    1.54 +
    1.55 +  let server = createAndStartHTTPServer();
    1.56 +
    1.57 +  const ID = "missing-sourceuri@tests.mozilla.org";
    1.58 +
    1.59 +  let cb = Async.makeSpinningCallback();
    1.60 +  AddonUtils.installAddons([{id: ID, requireSecureURI: false}], cb);
    1.61 +  let result = cb.wait();
    1.62 +
    1.63 +  do_check_true("installedIDs" in result);
    1.64 +  do_check_eq(0, result.installedIDs.length);
    1.65 +
    1.66 +  server.stop(run_next_test);
    1.67 +});
    1.68 +
    1.69 +add_test(function test_ignore_untrusted_source_uris() {
    1.70 +  _("Ensures that source URIs from insecure schemes are rejected.");
    1.71 +
    1.72 +  let ioService = Cc["@mozilla.org/network/io-service;1"]
    1.73 +                  .getService(Ci.nsIIOService);
    1.74 +
    1.75 +  const bad = ["http://example.com/foo.xpi",
    1.76 +               "ftp://example.com/foo.xpi",
    1.77 +               "silly://example.com/foo.xpi"];
    1.78 +
    1.79 +  const good = ["https://example.com/foo.xpi"];
    1.80 +
    1.81 +  for (let s of bad) {
    1.82 +    let sourceURI = ioService.newURI(s, null, null);
    1.83 +    let addon = {sourceURI: sourceURI, name: "bad", id: "bad"};
    1.84 +
    1.85 +    try {
    1.86 +      let cb = Async.makeSpinningCallback();
    1.87 +      AddonUtils.getInstallFromSearchResult(addon, cb, true);
    1.88 +      cb.wait();
    1.89 +    } catch (ex) {
    1.90 +      do_check_neq(null, ex);
    1.91 +      do_check_eq(0, ex.message.indexOf("Insecure source URI"));
    1.92 +      continue;
    1.93 +    }
    1.94 +
    1.95 +    // We should never get here if an exception is thrown.
    1.96 +    do_check_true(false);
    1.97 +  }
    1.98 +
    1.99 +  let count = 0;
   1.100 +  for (let s of good) {
   1.101 +    let sourceURI = ioService.newURI(s, null, null);
   1.102 +    let addon = {sourceURI: sourceURI, name: "good", id: "good"};
   1.103 +
   1.104 +    // Despite what you might think, we don't get an error in the callback.
   1.105 +    // The install won't work because the underlying Addon instance wasn't
   1.106 +    // proper. But, that just results in an AddonInstall that is missing
   1.107 +    // certain values. We really just care that the callback is being invoked
   1.108 +    // anyway.
   1.109 +    let callback = function onInstall(error, install) {
   1.110 +      do_check_null(error);
   1.111 +      do_check_neq(null, install);
   1.112 +      do_check_eq(sourceURI.spec, install.sourceURI.spec);
   1.113 +
   1.114 +      count += 1;
   1.115 +
   1.116 +      if (count >= good.length) {
   1.117 +        run_next_test();
   1.118 +      }
   1.119 +    };
   1.120 +
   1.121 +    AddonUtils.getInstallFromSearchResult(addon, callback, true);
   1.122 +  }
   1.123 +});
   1.124 +
   1.125 +add_test(function test_source_uri_rewrite() {
   1.126 +  _("Ensure that a 'src=api' query string is rewritten to 'src=sync'");
   1.127 +
   1.128 +  // This tests for conformance with bug 708134 so server-side metrics aren't
   1.129 +  // skewed.
   1.130 +
   1.131 +  Svc.Prefs.set("addons.ignoreRepositoryChecking", true);
   1.132 +
   1.133 +  // We resort to monkeypatching because of the API design.
   1.134 +  let oldFunction = AddonUtils.__proto__.installAddonFromSearchResult;
   1.135 +
   1.136 +  let installCalled = false;
   1.137 +  AddonUtils.__proto__.installAddonFromSearchResult =
   1.138 +    function testInstallAddon(addon, metadata, cb) {
   1.139 +
   1.140 +    do_check_eq(SERVER_ADDRESS + "/require.xpi?src=sync",
   1.141 +                addon.sourceURI.spec);
   1.142 +
   1.143 +    installCalled = true;
   1.144 +
   1.145 +    AddonUtils.getInstallFromSearchResult(addon, function (error, install) {
   1.146 +      do_check_null(error);
   1.147 +      do_check_eq(SERVER_ADDRESS + "/require.xpi?src=sync",
   1.148 +                  install.sourceURI.spec);
   1.149 +
   1.150 +      cb(null, {id: addon.id, addon: addon, install: install});
   1.151 +    }, false);
   1.152 +  };
   1.153 +
   1.154 +  let server = createAndStartHTTPServer();
   1.155 +
   1.156 +  let installCallback = Async.makeSpinningCallback();
   1.157 +  AddonUtils.installAddons([{id: "rewrite@tests.mozilla.org"}], installCallback);
   1.158 +
   1.159 +  installCallback.wait();
   1.160 +  do_check_true(installCalled);
   1.161 +  AddonUtils.__proto__.installAddonFromSearchResult = oldFunction;
   1.162 +
   1.163 +  Svc.Prefs.reset("addons.ignoreRepositoryChecking");
   1.164 +  server.stop(run_next_test);
   1.165 +});

mercurial